Merge tag 'amd-drm-fixes-6.9-2024-03-27' of https://gitlab.freedesktop.org/agd5f...
authorDave Airlie <airlied@redhat.com>
Thu, 28 Mar 2024 04:01:27 +0000 (14:01 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 28 Mar 2024 04:02:41 +0000 (14:02 +1000)
amd-drm-fixes-6.9-2024-03-27:

amdgpu:
- SMU 14.0.1 updates
- DCN 3.5.x updates
- VPE fix
- eDP panel flickering fix
- Suspend fix
- PSR fix
- DCN 3.0+ fix
- VCN 4.0.6 updates
- debugfs fix

amdkfd:
- DMA-Buf fix
- GFX 9.4.2 TLB flush fix
- CP interrupt fix

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240328025342.8700-1-alexander.deucher@amd.com
36 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c
drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.h
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.c
drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c
drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c
drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.c
drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
drivers/gpu/drm/amd/include/umsch_mm_4_0_api_def.h
drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_ppsmc.h
drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c
include/uapi/linux/kfd_ioctl.h

index 5dc24c971b41f0a93c7463fbbf397d33e08c5563..aa16d51dd8421b38a0a34fcf89263ffbf08af4fd 100644 (file)
@@ -4539,6 +4539,8 @@ int amdgpu_device_prepare(struct drm_device *dev)
        if (r)
                goto unprepare;
 
+       flush_delayed_work(&adev->gfx.gfx_off_delay_work);
+
        for (i = 0; i < adev->num_ip_blocks; i++) {
                if (!adev->ip_blocks[i].status.valid)
                        continue;
index a07e4b87d4cae01af53ef4cfded4cc4051dbd1c7..fdd36fb027ab6aa04b31c790af80596bb7da0427 100644 (file)
@@ -2237,6 +2237,7 @@ static int amdgpu_discovery_set_umsch_mm_ip_blocks(struct amdgpu_device *adev)
 {
        switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
        case IP_VERSION(4, 0, 5):
+       case IP_VERSION(4, 0, 6):
                if (amdgpu_umsch_mm & 0x1) {
                        amdgpu_device_ip_block_add(adev, &umsch_mm_v4_0_ip_block);
                        adev->enable_umsch_mm = true;
index 5505d646f43aa8f963d8d8732846b00fc612a3a7..06f0a6534a94f78196e6f6db7f5f87899e14d071 100644 (file)
@@ -524,46 +524,58 @@ static ssize_t amdgpu_debugfs_mqd_read(struct file *f, char __user *buf,
 {
        struct amdgpu_ring *ring = file_inode(f)->i_private;
        volatile u32 *mqd;
-       int r;
+       u32 *kbuf;
+       int r, i;
        uint32_t value, result;
 
        if (*pos & 3 || size & 3)
                return -EINVAL;
 
-       result = 0;
+       kbuf = kmalloc(ring->mqd_size, GFP_KERNEL);
+       if (!kbuf)
+               return -ENOMEM;
 
        r = amdgpu_bo_reserve(ring->mqd_obj, false);
        if (unlikely(r != 0))
-               return r;
+               goto err_free;
 
        r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&mqd);
-       if (r) {
-               amdgpu_bo_unreserve(ring->mqd_obj);
-               return r;
-       }
+       if (r)
+               goto err_unreserve;
 
+       /*
+        * Copy to local buffer to avoid put_user(), which might fault
+        * and acquire mmap_sem, under reservation_ww_class_mutex.
+        */
+       for (i = 0; i < ring->mqd_size/sizeof(u32); i++)
+               kbuf[i] = mqd[i];
+
+       amdgpu_bo_kunmap(ring->mqd_obj);
+       amdgpu_bo_unreserve(ring->mqd_obj);
+
+       result = 0;
        while (size) {
                if (*pos >= ring->mqd_size)
-                       goto done;
+                       break;
 
-               value = mqd[*pos/4];
+               value = kbuf[*pos/4];
                r = put_user(value, (uint32_t *)buf);
                if (r)
-                       goto done;
+                       goto err_free;
                buf += 4;
                result += 4;
                size -= 4;
                *pos += 4;
        }
 
-done:
-       amdgpu_bo_kunmap(ring->mqd_obj);
-       mqd = NULL;
-       amdgpu_bo_unreserve(ring->mqd_obj);
-       if (r)
-               return r;
-
+       kfree(kbuf);
        return result;
+
+err_unreserve:
+       amdgpu_bo_unreserve(ring->mqd_obj);
+err_free:
+       kfree(kbuf);
+       return r;
 }
 
 static const struct file_operations amdgpu_debugfs_mqd_fops = {
index ab820cf526683b5a15ef94ee28075f20752baeac..0df97c3e3a700dccc7bc84d4688e1dc8e1b8a1e2 100644 (file)
@@ -189,10 +189,13 @@ static void setup_vpe_queue(struct amdgpu_device *adev,
        mqd->rptr_val = 0;
        mqd->unmapped = 1;
 
+       if (adev->vpe.collaborate_mode)
+               memcpy(++mqd, test->mqd_data_cpu_addr, sizeof(struct MQD_INFO));
+
        qinfo->mqd_addr = test->mqd_data_gpu_addr;
        qinfo->csa_addr = test->ctx_data_gpu_addr +
                offsetof(struct umsch_mm_test_ctx_data, vpe_ctx_csa);
-       qinfo->doorbell_offset_0 = (adev->doorbell_index.vpe_ring + 1) << 1;
+       qinfo->doorbell_offset_0 = 0;
        qinfo->doorbell_offset_1 = 0;
 }
 
@@ -287,7 +290,10 @@ static int submit_vpe_queue(struct amdgpu_device *adev, struct umsch_mm_test *te
        ring[5] = 0;
 
        mqd->wptr_val = (6 << 2);
-       // WDOORBELL32(adev->umsch_mm.agdb_index[CONTEXT_PRIORITY_LEVEL_NORMAL], mqd->wptr_val);
+       if (adev->vpe.collaborate_mode)
+               (++mqd)->wptr_val = (6 << 2);
+
+       WDOORBELL32(adev->umsch_mm.agdb_index[CONTEXT_PRIORITY_LEVEL_NORMAL], mqd->wptr_val);
 
        for (i = 0; i < adev->usec_timeout; i++) {
                if (*fence == test_pattern)
@@ -571,6 +577,7 @@ int amdgpu_umsch_mm_init_microcode(struct amdgpu_umsch_mm *umsch)
 
        switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
        case IP_VERSION(4, 0, 5):
+       case IP_VERSION(4, 0, 6):
                fw_name = "amdgpu/umsch_mm_4_0_0.bin";
                break;
        default:
@@ -750,6 +757,7 @@ static int umsch_mm_early_init(void *handle)
 
        switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
        case IP_VERSION(4, 0, 5):
+       case IP_VERSION(4, 0, 6):
                umsch_mm_v4_0_set_funcs(&adev->umsch_mm);
                break;
        default:
index 8258a43a6236c038e16098089e1de90495f51600..5014b5af95fd970c7ef15ffed4630a2928eb2c08 100644 (file)
@@ -33,13 +33,6 @@ enum UMSCH_SWIP_ENGINE_TYPE {
        UMSCH_SWIP_ENGINE_TYPE_MAX
 };
 
-enum UMSCH_SWIP_AFFINITY_TYPE {
-       UMSCH_SWIP_AFFINITY_TYPE_ANY = 0,
-       UMSCH_SWIP_AFFINITY_TYPE_VCN0 = 1,
-       UMSCH_SWIP_AFFINITY_TYPE_VCN1 = 2,
-       UMSCH_SWIP_AFFINITY_TYPE_MAX
-};
-
 enum UMSCH_CONTEXT_PRIORITY_LEVEL {
        CONTEXT_PRIORITY_LEVEL_IDLE = 0,
        CONTEXT_PRIORITY_LEVEL_NORMAL = 1,
@@ -51,13 +44,15 @@ enum UMSCH_CONTEXT_PRIORITY_LEVEL {
 struct umsch_mm_set_resource_input {
        uint32_t vmid_mask_mm_vcn;
        uint32_t vmid_mask_mm_vpe;
+       uint32_t collaboration_mask_vpe;
        uint32_t logging_vmid;
        uint32_t engine_mask;
        union {
                struct {
                        uint32_t disable_reset : 1;
                        uint32_t disable_umsch_mm_log : 1;
-                       uint32_t reserved : 30;
+                       uint32_t use_rs64mem_for_proc_ctx_csa : 1;
+                       uint32_t reserved : 29;
                };
                uint32_t uint32_all;
        };
@@ -78,15 +73,18 @@ struct umsch_mm_add_queue_input {
        uint32_t doorbell_offset_1;
        enum UMSCH_SWIP_ENGINE_TYPE engine_type;
        uint32_t affinity;
-       enum UMSCH_SWIP_AFFINITY_TYPE affinity_type;
        uint64_t mqd_addr;
        uint64_t h_context;
        uint64_t h_queue;
        uint32_t vm_context_cntl;
 
+       uint32_t process_csa_array_index;
+       uint32_t context_csa_array_index;
+
        struct {
                uint32_t is_context_suspended : 1;
-               uint32_t reserved : 31;
+               uint32_t collaboration_mode : 1;
+               uint32_t reserved : 30;
        };
 };
 
@@ -94,6 +92,7 @@ struct umsch_mm_remove_queue_input {
        uint32_t doorbell_offset_0;
        uint32_t doorbell_offset_1;
        uint64_t context_csa_addr;
+       uint32_t context_csa_array_index;
 };
 
 struct MQD_INFO {
@@ -103,6 +102,7 @@ struct MQD_INFO {
        uint32_t wptr_val;
        uint32_t rptr_val;
        uint32_t unmapped;
+       uint32_t vmid;
 };
 
 struct amdgpu_umsch_mm;
index 7a65a2b128ec4372c5e6c219c70b9ab110b869fc..6695481f870f8a0dc61edfbe0d9947b19288bc25 100644 (file)
@@ -396,6 +396,12 @@ static int vpe_hw_init(void *handle)
        struct amdgpu_vpe *vpe = &adev->vpe;
        int ret;
 
+       /* Power on VPE */
+       ret = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VPE,
+                                                    AMD_PG_STATE_UNGATE);
+       if (ret)
+               return ret;
+
        ret = vpe_load_microcode(vpe);
        if (ret)
                return ret;
index 8e7b763cfdb7ef72ba8c98ea4e33515ffa4e8d81..84368cf1e17535c16c031ce6677f53769f9e8f94 100644 (file)
@@ -60,7 +60,7 @@ static int umsch_mm_v4_0_load_microcode(struct amdgpu_umsch_mm *umsch)
 
        umsch->cmd_buf_curr_ptr = umsch->cmd_buf_ptr;
 
-       if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(4, 0, 5)) {
+       if (amdgpu_ip_version(adev, VCN_HWIP, 0) >= IP_VERSION(4, 0, 5)) {
                WREG32_SOC15(VCN, 0, regUVD_IPX_DLDO_CONFIG,
                        1 << UVD_IPX_DLDO_CONFIG__ONO0_PWR_CONFIG__SHIFT);
                SOC15_WAIT_ON_RREG(VCN, 0, regUVD_IPX_DLDO_STATUS,
@@ -248,7 +248,7 @@ static int umsch_mm_v4_0_ring_stop(struct amdgpu_umsch_mm *umsch)
        data = REG_SET_FIELD(data, VCN_UMSCH_RB_DB_CTRL, EN, 0);
        WREG32_SOC15(VCN, 0, regVCN_UMSCH_RB_DB_CTRL, data);
 
-       if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(4, 0, 5)) {
+       if (amdgpu_ip_version(adev, VCN_HWIP, 0) >= IP_VERSION(4, 0, 5)) {
                WREG32_SOC15(VCN, 0, regUVD_IPX_DLDO_CONFIG,
                        2 << UVD_IPX_DLDO_CONFIG__ONO0_PWR_CONFIG__SHIFT);
                SOC15_WAIT_ON_RREG(VCN, 0, regUVD_IPX_DLDO_STATUS,
@@ -271,6 +271,8 @@ static int umsch_mm_v4_0_set_hw_resources(struct amdgpu_umsch_mm *umsch)
 
        set_hw_resources.vmid_mask_mm_vcn = umsch->vmid_mask_mm_vcn;
        set_hw_resources.vmid_mask_mm_vpe = umsch->vmid_mask_mm_vpe;
+       set_hw_resources.collaboration_mask_vpe =
+               adev->vpe.collaborate_mode ? 0x3 : 0x0;
        set_hw_resources.engine_mask = umsch->engine_mask;
 
        set_hw_resources.vcn0_hqd_mask[0] = umsch->vcn0_hqd_mask;
@@ -346,6 +348,7 @@ static int umsch_mm_v4_0_add_queue(struct amdgpu_umsch_mm *umsch,
        add_queue.h_queue = input_ptr->h_queue;
        add_queue.vm_context_cntl = input_ptr->vm_context_cntl;
        add_queue.is_context_suspended = input_ptr->is_context_suspended;
+       add_queue.collaboration_mode = adev->vpe.collaborate_mode ? 1 : 0;
 
        add_queue.api_status.api_completion_fence_addr = umsch->ring.fence_drv.gpu_addr;
        add_queue.api_status.api_completion_fence_value = ++umsch->ring.fence_drv.sync_seq;
index dfa8c69532d4704ad1199b9722802ddfaff89841..f9631f4b1a02ca5121d7b382fe128c47c7718ec5 100644 (file)
@@ -1523,7 +1523,7 @@ static int kfd_ioctl_get_dmabuf_info(struct file *filep,
 
        /* Find a KFD GPU device that supports the get_dmabuf_info query */
        for (i = 0; kfd_topology_enum_kfd_devices(i, &dev) == 0; i++)
-               if (dev)
+               if (dev && !kfd_devcgroup_check_permission(dev))
                        break;
        if (!dev)
                return -EINVAL;
@@ -1545,7 +1545,7 @@ static int kfd_ioctl_get_dmabuf_info(struct file *filep,
        if (xcp_id >= 0)
                args->gpu_id = dmabuf_adev->kfd.dev->nodes[xcp_id]->id;
        else
-               args->gpu_id = dmabuf_adev->kfd.dev->nodes[0]->id;
+               args->gpu_id = dev->id;
        args->flags = flags;
 
        /* Copy metadata buffer to user mode */
index 9a06c6fb6605851ae9c26ff4a81c66d358b9a69f..40a21be6c07c9b314a111ff8138203e79591409e 100644 (file)
@@ -339,7 +339,8 @@ static void event_interrupt_wq_v10(struct kfd_node *dev,
                                break;
                        }
                        kfd_signal_event_interrupt(pasid, context_id0 & 0x7fffff, 23);
-               } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) {
+               } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE &&
+                          KFD_DBG_EC_TYPE_IS_PACKET(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0))) {
                        kfd_set_dbg_ev_from_interrupt(dev, pasid,
                                KFD_DEBUG_DOORBELL_ID(context_id0),
                                KFD_EC_MASK(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0)),
index 7e2859736a558fe899c8d1bb438daa07523f2c59..fe2ad0c0de9543dc53292f6d1690c7aabc0c54fd 100644 (file)
@@ -328,7 +328,8 @@ static void event_interrupt_wq_v11(struct kfd_node *dev,
                /* CP */
                if (source_id == SOC15_INTSRC_CP_END_OF_PIPE)
                        kfd_signal_event_interrupt(pasid, context_id0, 32);
-               else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE)
+               else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE &&
+                        KFD_DBG_EC_TYPE_IS_PACKET(KFD_CTXID0_CP_BAD_OP_ECODE(context_id0)))
                        kfd_set_dbg_ev_from_interrupt(dev, pasid,
                                KFD_CTXID0_DOORBELL_ID(context_id0),
                                KFD_EC_MASK(KFD_CTXID0_CP_BAD_OP_ECODE(context_id0)),
index 91dd5e045b511d2aaa42aa4bd9b934e018c407ab..c4c6a29052ac8fd1a90b6a78c884df002fbde093 100644 (file)
@@ -388,7 +388,8 @@ static void event_interrupt_wq_v9(struct kfd_node *dev,
                                break;
                        }
                        kfd_signal_event_interrupt(pasid, sq_int_data, 24);
-               } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) {
+               } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE &&
+                          KFD_DBG_EC_TYPE_IS_PACKET(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0))) {
                        kfd_set_dbg_ev_from_interrupt(dev, pasid,
                                KFD_DEBUG_DOORBELL_ID(context_id0),
                                KFD_EC_MASK(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0)),
index 42d40560cd30d787ba2b1e6487dc6a065c810843..a81ef232fdef96d5b13b7a3be912f504716e3f35 100644 (file)
@@ -1473,7 +1473,7 @@ static inline void kfd_flush_tlb(struct kfd_process_device *pdd,
 
 static inline bool kfd_flush_tlb_after_unmap(struct kfd_dev *dev)
 {
-       return KFD_GC_VERSION(dev) > IP_VERSION(9, 4, 2) ||
+       return KFD_GC_VERSION(dev) >= IP_VERSION(9, 4, 2) ||
               (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 1) && dev->sdma_fw_version >= 18) ||
               KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 0);
 }
index 2851719d7121612b64842f3da8e84cf82d073454..71d2d44681b218fc5146f3354464ba0f9c08610e 100644 (file)
@@ -6305,9 +6305,8 @@ create_stream_for_sink(struct drm_connector *connector,
 
        if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
                mod_build_hf_vsif_infopacket(stream, &stream->vsp_infopacket);
-       else if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT ||
-                        stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST ||
-                        stream->signal == SIGNAL_TYPE_EDP) {
+
+       if (stream->link->psr_settings.psr_feature_enabled || stream->link->replay_settings.replay_feature_enabled) {
                //
                // should decide stream support vsc sdp colorimetry capability
                // before building vsc info packet
@@ -6323,9 +6322,8 @@ create_stream_for_sink(struct drm_connector *connector,
                if (stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22)
                        tf = TRANSFER_FUNC_GAMMA_22;
                mod_build_vsc_infopacket(stream, &stream->vsc_infopacket, stream->output_color_space, tf);
+               aconnector->psr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY;
 
-               if (stream->link->psr_settings.psr_feature_enabled)
-                       aconnector->psr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY;
        }
 finish:
        dc_sink_release(sink);
index 1f08c6564c3bfea6dbc047b04eb1ee7603df0ead..286ecd28cc6e6667a5aa532077ae9dc9d03e3068 100644 (file)
@@ -141,9 +141,8 @@ bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream)
  * amdgpu_dm_psr_enable() - enable psr f/w
  * @stream: stream state
  *
- * Return: true if success
  */
-bool amdgpu_dm_psr_enable(struct dc_stream_state *stream)
+void amdgpu_dm_psr_enable(struct dc_stream_state *stream)
 {
        struct dc_link *link = stream->link;
        unsigned int vsync_rate_hz = 0;
@@ -190,7 +189,10 @@ bool amdgpu_dm_psr_enable(struct dc_stream_state *stream)
        if (link->psr_settings.psr_version < DC_PSR_VERSION_SU_1)
                power_opt |= psr_power_opt_z10_static_screen;
 
-       return dc_link_set_psr_allow_active(link, &psr_enable, false, false, &power_opt);
+       dc_link_set_psr_allow_active(link, &psr_enable, false, false, &power_opt);
+
+       if (link->ctx->dc->caps.ips_support)
+               dc_allow_idle_optimizations(link->ctx->dc, true);
 }
 
 /*
index 6806b3c9c84ba05f278e84b6ab9cf4f7135b3162..1fdfd183c0d91aa31b88ae7feba6f673339ac0cb 100644 (file)
@@ -32,7 +32,7 @@
 #define AMDGPU_DM_PSR_ENTRY_DELAY 5
 
 void amdgpu_dm_set_psr_caps(struct dc_link *link);
-bool amdgpu_dm_psr_enable(struct dc_stream_state *stream);
+void amdgpu_dm_psr_enable(struct dc_stream_state *stream);
 bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream);
 bool amdgpu_dm_psr_disable(struct dc_stream_state *stream);
 bool amdgpu_dm_psr_disable_all(struct amdgpu_display_manager *dm);
index c378b879c76d8c062601f87c952668f920750a48..101fe96287cb480bf9ee142ceb998a84ab1027f8 100644 (file)
@@ -73,6 +73,8 @@
 #define CLK1_CLK2_BYPASS_CNTL__CLK2_BYPASS_SEL_MASK            0x00000007L
 #define CLK1_CLK2_BYPASS_CNTL__CLK2_BYPASS_DIV_MASK            0x000F0000L
 
+#define SMU_VER_THRESHOLD 0x5D4A00 //93.74.0
+
 #define REG(reg_name) \
        (ctx->clk_reg_offsets[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
 
@@ -411,9 +413,12 @@ static void dcn35_dump_clk_registers(struct clk_state_registers_and_bypass *regs
 
 static void init_clk_states(struct clk_mgr *clk_mgr)
 {
+       struct clk_mgr_internal *clk_mgr_int = TO_CLK_MGR_INTERNAL(clk_mgr);
        uint32_t ref_dtbclk = clk_mgr->clks.ref_dtbclk_khz;
        memset(&(clk_mgr->clks), 0, sizeof(struct dc_clocks));
 
+       if (clk_mgr_int->smu_ver >= SMU_VER_THRESHOLD)
+               clk_mgr->clks.dtbclk_en = true; // request DTBCLK disable on first commit
        clk_mgr->clks.ref_dtbclk_khz = ref_dtbclk;      // restore ref_dtbclk
        clk_mgr->clks.p_state_change_support = true;
        clk_mgr->clks.prev_p_state_change_support = true;
@@ -709,7 +714,7 @@ static void dcn35_clk_mgr_helper_populate_bw_params(struct clk_mgr_internal *clk
                clock_table->NumFclkLevelsEnabled;
        max_fclk = find_max_clk_value(clock_table->FclkClocks_Freq, num_fclk);
 
-       num_dcfclk = (clock_table->NumFclkLevelsEnabled > NUM_DCFCLK_DPM_LEVELS) ? NUM_DCFCLK_DPM_LEVELS :
+       num_dcfclk = (clock_table->NumDcfClkLevelsEnabled > NUM_DCFCLK_DPM_LEVELS) ? NUM_DCFCLK_DPM_LEVELS :
                clock_table->NumDcfClkLevelsEnabled;
        for (i = 0; i < num_dcfclk; i++) {
                int j;
index e7dc128f6284b45846f4eff707d3f052dab7b108..03b554e912a20d4ae58e5161d55943eb0bb7a0d9 100644 (file)
@@ -3024,7 +3024,8 @@ static void backup_planes_and_stream_state(
                scratch->blend_tf[i] = *status->plane_states[i]->blend_tf;
        }
        scratch->stream_state = *stream;
-       scratch->out_transfer_func = *stream->out_transfer_func;
+       if (stream->out_transfer_func)
+               scratch->out_transfer_func = *stream->out_transfer_func;
 }
 
 static void restore_planes_and_stream_state(
@@ -3046,7 +3047,8 @@ static void restore_planes_and_stream_state(
                *status->plane_states[i]->blend_tf = scratch->blend_tf[i];
        }
        *stream = scratch->stream_state;
-       *stream->out_transfer_func = scratch->out_transfer_func;
+       if (stream->out_transfer_func)
+               *stream->out_transfer_func = scratch->out_transfer_func;
 }
 
 static bool update_planes_and_stream_state(struct dc *dc,
index bf3386cd444d62c5232909f9b88061e6abf98887..5ebb573031304815e7c9ed099d1329511b974368 100644 (file)
 #define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0]))
 
 
+void mpc3_mpc_init(struct mpc *mpc)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+       int opp_id;
+
+       mpc1_mpc_init(mpc);
+
+       for (opp_id = 0; opp_id < MAX_OPP; opp_id++) {
+               if (REG(MUX[opp_id]))
+                       /* disable mpc out rate and flow control */
+                       REG_UPDATE_2(MUX[opp_id], MPC_OUT_RATE_CONTROL_DISABLE,
+                                       1, MPC_OUT_FLOW_CONTROL_COUNT, 0);
+       }
+}
+
+void mpc3_mpc_init_single_inst(struct mpc *mpc, unsigned int mpcc_id)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       mpc1_mpc_init_single_inst(mpc, mpcc_id);
+
+       /* assuming mpc out mux is connected to opp with the same index at this
+        * point in time (e.g. transitioning from vbios to driver)
+        */
+       if (mpcc_id < MAX_OPP && REG(MUX[mpcc_id]))
+               /* disable mpc out rate and flow control */
+               REG_UPDATE_2(MUX[mpcc_id], MPC_OUT_RATE_CONTROL_DISABLE,
+                               1, MPC_OUT_FLOW_CONTROL_COUNT, 0);
+}
+
 bool mpc3_is_dwb_idle(
        struct mpc *mpc,
        int dwb_id)
@@ -80,25 +110,6 @@ void mpc3_disable_dwb_mux(
                MPC_DWB0_MUX, 0xf);
 }
 
-void mpc3_set_out_rate_control(
-       struct mpc *mpc,
-       int opp_id,
-       bool enable,
-       bool rate_2x_mode,
-       struct mpc_dwb_flow_control *flow_control)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_UPDATE_2(MUX[opp_id],
-                       MPC_OUT_RATE_CONTROL_DISABLE, !enable,
-                       MPC_OUT_RATE_CONTROL, rate_2x_mode);
-
-       if (flow_control)
-               REG_UPDATE_2(MUX[opp_id],
-                       MPC_OUT_FLOW_CONTROL_MODE, flow_control->flow_ctrl_mode,
-                       MPC_OUT_FLOW_CONTROL_COUNT, flow_control->flow_ctrl_cnt1);
-}
-
 enum dc_lut_mode mpc3_get_ogam_current(struct mpc *mpc, int mpcc_id)
 {
        /*Contrary to DCN2 and DCN1 wherein a single status register field holds this info;
@@ -1490,8 +1501,8 @@ static const struct mpc_funcs dcn30_mpc_funcs = {
        .read_mpcc_state = mpc3_read_mpcc_state,
        .insert_plane = mpc1_insert_plane,
        .remove_mpcc = mpc1_remove_mpcc,
-       .mpc_init = mpc1_mpc_init,
-       .mpc_init_single_inst = mpc1_mpc_init_single_inst,
+       .mpc_init = mpc3_mpc_init,
+       .mpc_init_single_inst = mpc3_mpc_init_single_inst,
        .update_blending = mpc2_update_blending,
        .cursor_lock = mpc1_cursor_lock,
        .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
@@ -1508,7 +1519,6 @@ static const struct mpc_funcs dcn30_mpc_funcs = {
        .set_dwb_mux = mpc3_set_dwb_mux,
        .disable_dwb_mux = mpc3_disable_dwb_mux,
        .is_dwb_idle = mpc3_is_dwb_idle,
-       .set_out_rate_control = mpc3_set_out_rate_control,
        .set_gamut_remap = mpc3_set_gamut_remap,
        .program_shaper = mpc3_program_shaper,
        .acquire_rmu = mpcc3_acquire_rmu,
index 9cb96ae95a2f753639e3149ee55757dae44bffd3..ce93003dae011325efa0e1e3e5351646a5406017 100644 (file)
@@ -1007,6 +1007,13 @@ void dcn30_mpc_construct(struct dcn30_mpc *mpc30,
        int num_mpcc,
        int num_rmu);
 
+void mpc3_mpc_init(
+       struct mpc *mpc);
+
+void mpc3_mpc_init_single_inst(
+       struct mpc *mpc,
+       unsigned int mpcc_id);
+
 bool mpc3_program_shaper(
                struct mpc *mpc,
                const struct pwl_params *params,
@@ -1078,13 +1085,6 @@ bool mpc3_is_dwb_idle(
        struct mpc *mpc,
        int dwb_id);
 
-void mpc3_set_out_rate_control(
-       struct mpc *mpc,
-       int opp_id,
-       bool enable,
-       bool rate_2x_mode,
-       struct mpc_dwb_flow_control *flow_control);
-
 void mpc3_power_on_ogam_lut(
        struct mpc *mpc, int mpcc_id,
        bool power_on);
index e789e654c38705116bd70f7b023f7b44cf8b1ba9..e408e859b3556166346e0f62d5b3aaaac4c2d2df 100644 (file)
@@ -47,7 +47,7 @@ void mpc32_mpc_init(struct mpc *mpc)
        struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
        int mpcc_id;
 
-       mpc1_mpc_init(mpc);
+       mpc3_mpc_init(mpc);
 
        if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
                if (mpc30->mpc_mask->MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE && mpc30->mpc_mask->MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE) {
@@ -991,7 +991,7 @@ static const struct mpc_funcs dcn32_mpc_funcs = {
        .insert_plane = mpc1_insert_plane,
        .remove_mpcc = mpc1_remove_mpcc,
        .mpc_init = mpc32_mpc_init,
-       .mpc_init_single_inst = mpc1_mpc_init_single_inst,
+       .mpc_init_single_inst = mpc3_mpc_init_single_inst,
        .update_blending = mpc2_update_blending,
        .cursor_lock = mpc1_cursor_lock,
        .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
@@ -1008,7 +1008,6 @@ static const struct mpc_funcs dcn32_mpc_funcs = {
        .set_dwb_mux = mpc3_set_dwb_mux,
        .disable_dwb_mux = mpc3_disable_dwb_mux,
        .is_dwb_idle = mpc3_is_dwb_idle,
-       .set_out_rate_control = mpc3_set_out_rate_control,
        .set_gamut_remap = mpc3_set_gamut_remap,
        .program_shaper = mpc32_program_shaper,
        .program_3dlut = mpc32_program_3dlut,
index 80bebfc268db0f59d2ac9067d3780f6675760afb..21e0eef3269b10fab97ac3cb7e44cf54f33c775d 100644 (file)
@@ -166,8 +166,8 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_5_soc = {
        .num_states = 5,
        .sr_exit_time_us = 28.0,
        .sr_enter_plus_exit_time_us = 30.0,
-       .sr_exit_z8_time_us = 210.0,
-       .sr_enter_plus_exit_z8_time_us = 320.0,
+       .sr_exit_z8_time_us = 250.0,
+       .sr_enter_plus_exit_z8_time_us = 350.0,
        .fclk_change_latency_us = 24.0,
        .usr_retraining_latency_us = 2,
        .writeback_latency_us = 12.0,
index dc9e1b758ed6a1db8e21ad080bc180ea71259373..b3ffab77cf889487f7024c22eb4a18542c7bfbea 100644 (file)
@@ -98,55 +98,114 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_51_soc = {
        .clock_limits = {
                {
                        .state = 0,
-                       .dispclk_mhz = 1200.0,
-                       .dppclk_mhz = 1200.0,
+                       .dcfclk_mhz = 400.0,
+                       .fabricclk_mhz = 400.0,
+                       .socclk_mhz = 600.0,
+                       .dram_speed_mts = 3200.0,
+                       .dispclk_mhz = 600.0,
+                       .dppclk_mhz = 600.0,
                        .phyclk_mhz = 600.0,
                        .phyclk_d18_mhz = 667.0,
-                       .dscclk_mhz = 186.0,
+                       .dscclk_mhz = 200.0,
                        .dtbclk_mhz = 600.0,
                },
                {
                        .state = 1,
-                       .dispclk_mhz = 1200.0,
-                       .dppclk_mhz = 1200.0,
+                       .dcfclk_mhz = 600.0,
+                       .fabricclk_mhz = 1000.0,
+                       .socclk_mhz = 733.0,
+                       .dram_speed_mts = 6400.0,
+                       .dispclk_mhz = 800.0,
+                       .dppclk_mhz = 800.0,
                        .phyclk_mhz = 810.0,
                        .phyclk_d18_mhz = 667.0,
-                       .dscclk_mhz = 209.0,
+                       .dscclk_mhz = 266.7,
                        .dtbclk_mhz = 600.0,
                },
                {
                        .state = 2,
-                       .dispclk_mhz = 1200.0,
-                       .dppclk_mhz = 1200.0,
+                       .dcfclk_mhz = 738.0,
+                       .fabricclk_mhz = 1200.0,
+                       .socclk_mhz = 880.0,
+                       .dram_speed_mts = 7500.0,
+                       .dispclk_mhz = 800.0,
+                       .dppclk_mhz = 800.0,
                        .phyclk_mhz = 810.0,
                        .phyclk_d18_mhz = 667.0,
-                       .dscclk_mhz = 209.0,
+                       .dscclk_mhz = 266.7,
                        .dtbclk_mhz = 600.0,
                },
                {
                        .state = 3,
-                       .dispclk_mhz = 1200.0,
-                       .dppclk_mhz = 1200.0,
+                       .dcfclk_mhz = 800.0,
+                       .fabricclk_mhz = 1400.0,
+                       .socclk_mhz = 978.0,
+                       .dram_speed_mts = 7500.0,
+                       .dispclk_mhz = 960.0,
+                       .dppclk_mhz = 960.0,
                        .phyclk_mhz = 810.0,
                        .phyclk_d18_mhz = 667.0,
-                       .dscclk_mhz = 371.0,
+                       .dscclk_mhz = 320.0,
                        .dtbclk_mhz = 600.0,
                },
                {
                        .state = 4,
+                       .dcfclk_mhz = 873.0,
+                       .fabricclk_mhz = 1600.0,
+                       .socclk_mhz = 1100.0,
+                       .dram_speed_mts = 8533.0,
+                       .dispclk_mhz = 1066.7,
+                       .dppclk_mhz = 1066.7,
+                       .phyclk_mhz = 810.0,
+                       .phyclk_d18_mhz = 667.0,
+                       .dscclk_mhz = 355.6,
+                       .dtbclk_mhz = 600.0,
+               },
+               {
+                       .state = 5,
+                       .dcfclk_mhz = 960.0,
+                       .fabricclk_mhz = 1700.0,
+                       .socclk_mhz = 1257.0,
+                       .dram_speed_mts = 8533.0,
                        .dispclk_mhz = 1200.0,
                        .dppclk_mhz = 1200.0,
                        .phyclk_mhz = 810.0,
                        .phyclk_d18_mhz = 667.0,
-                       .dscclk_mhz = 417.0,
+                       .dscclk_mhz = 400.0,
+                       .dtbclk_mhz = 600.0,
+               },
+               {
+                       .state = 6,
+                       .dcfclk_mhz = 1067.0,
+                       .fabricclk_mhz = 1850.0,
+                       .socclk_mhz = 1257.0,
+                       .dram_speed_mts = 8533.0,
+                       .dispclk_mhz = 1371.4,
+                       .dppclk_mhz = 1371.4,
+                       .phyclk_mhz = 810.0,
+                       .phyclk_d18_mhz = 667.0,
+                       .dscclk_mhz = 457.1,
+                       .dtbclk_mhz = 600.0,
+               },
+               {
+                       .state = 7,
+                       .dcfclk_mhz = 1200.0,
+                       .fabricclk_mhz = 2000.0,
+                       .socclk_mhz = 1467.0,
+                       .dram_speed_mts = 8533.0,
+                       .dispclk_mhz = 1600.0,
+                       .dppclk_mhz = 1600.0,
+                       .phyclk_mhz = 810.0,
+                       .phyclk_d18_mhz = 667.0,
+                       .dscclk_mhz = 533.3,
                        .dtbclk_mhz = 600.0,
                },
        },
-       .num_states = 5,
+       .num_states = 8,
        .sr_exit_time_us = 28.0,
        .sr_enter_plus_exit_time_us = 30.0,
-       .sr_exit_z8_time_us = 210.0,
-       .sr_enter_plus_exit_z8_time_us = 320.0,
+       .sr_exit_z8_time_us = 250.0,
+       .sr_enter_plus_exit_z8_time_us = 350.0,
        .fclk_change_latency_us = 24.0,
        .usr_retraining_latency_us = 2,
        .writeback_latency_us = 12.0,
@@ -177,6 +236,9 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_51_soc = {
        .do_urgent_latency_adjustment = 0,
        .urgent_latency_adjustment_fabric_clock_component_us = 0,
        .urgent_latency_adjustment_fabric_clock_reference_mhz = 0,
+       .num_chans = 4,
+       .dram_clock_change_latency_us = 11.72,
+       .dispclk_dppclk_vco_speed_mhz = 2400.0,
 };
 
 /*
@@ -340,6 +402,8 @@ void dcn351_update_bw_bounding_box_fpu(struct dc *dc,
                                clock_limits[i].socclk_mhz;
                        dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].memclk_mhz =
                                clk_table->entries[i].memclk_mhz * clk_table->entries[i].wck_ratio;
+                       dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dtbclk_mhz =
+                               clock_limits[i].dtbclk_mhz;
                        dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_dcfclk_levels =
                                clk_table->num_entries;
                        dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_fclk_levels =
@@ -352,6 +416,8 @@ void dcn351_update_bw_bounding_box_fpu(struct dc *dc,
                                clk_table->num_entries;
                        dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_memclk_levels =
                                clk_table->num_entries;
+                       dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_dtbclk_levels =
+                               clk_table->num_entries;
                }
        }
 
@@ -551,6 +617,7 @@ void dcn351_decide_zstate_support(struct dc *dc, struct dc_state *context)
                if (context->res_ctx.pipe_ctx[i].plane_state)
                        plane_count++;
        }
+
        /*dcn351 does not support z9/z10*/
        if (context->stream_count == 0 || plane_count == 0) {
                support = DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY;
@@ -564,11 +631,9 @@ void dcn351_decide_zstate_support(struct dc *dc, struct dc_state *context)
                        dc->debug.minimum_z8_residency_time > 0 ? dc->debug.minimum_z8_residency_time : 1000;
                bool allow_z8 = context->bw_ctx.dml.vba.StutterPeriod > (double)minmum_z8_residency;
 
-
                /*for psr1/psr-su, we allow z8 and z10 based on latency, for replay with IPS enabled, it will enter ips2*/
-                if (is_pwrseq0 && (is_psr || is_replay))
+               if (is_pwrseq0 && (is_psr || is_replay))
                        support = allow_z8 ? allow_z8 : DCN_ZSTATE_SUPPORT_DISALLOW;
-
        }
        context->bw_ctx.bw.dcn.clk.zstate_support = support;
 }
index 17a58f41fc6a8501a4cf998507d9b89f68d0fcc1..a20f28a5d2e7b09db5a02d4641e4f89bfcfcdcd6 100644 (file)
@@ -228,17 +228,13 @@ void dml2_init_socbb_params(struct dml2_context *dml2, const struct dc *in_dc, s
                break;
 
        case dml_project_dcn35:
+       case dml_project_dcn351:
                out->num_chans = 4;
                out->round_trip_ping_latency_dcfclk_cycles = 106;
                out->smn_latency_us = 2;
                out->dispclk_dppclk_vco_speed_mhz = 3600;
                break;
 
-       case dml_project_dcn351:
-               out->num_chans = 16;
-               out->round_trip_ping_latency_dcfclk_cycles = 1100;
-               out->smn_latency_us = 2;
-               break;
        }
        /* ---Overrides if available--- */
        if (dml2->config.bbox_overrides.dram_num_chan)
index 9d5df4c0da59796ebd8a16927cba72f17239c4fc..0ba1feaf96c0d76bceaf02c302e0e0f0f9c756ab 100644 (file)
@@ -1185,7 +1185,8 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx)
                if (dccg) {
                        dccg->funcs->disable_symclk32_se(dccg, dp_hpo_inst);
                        dccg->funcs->set_dpstreamclk(dccg, REFCLK, tg->inst, dp_hpo_inst);
-                       dccg->funcs->set_dtbclk_dto(dccg, &dto_params);
+                       if (dccg && dccg->funcs->set_dtbclk_dto)
+                               dccg->funcs->set_dtbclk_dto(dccg, &dto_params);
                }
        } else if (dccg && dccg->funcs->disable_symclk_se) {
                dccg->funcs->disable_symclk_se(dccg, stream_enc->stream_enc_inst,
index 3a9cc8ac0c07938a5b97286e829c378142a6b8ed..093f4387553ce34ed55eb56c337e70b5c8e127bd 100644 (file)
 #define FN(reg_name, field_name) \
        hws->shifts->field_name, hws->masks->field_name
 
-static int calc_mpc_flow_ctrl_cnt(const struct dc_stream_state *stream,
-               int opp_cnt)
-{
-       bool hblank_halved = optc2_is_two_pixels_per_containter(&stream->timing);
-       int flow_ctrl_cnt;
-
-       if (opp_cnt >= 2)
-               hblank_halved = true;
-
-       flow_ctrl_cnt = stream->timing.h_total - stream->timing.h_addressable -
-                       stream->timing.h_border_left -
-                       stream->timing.h_border_right;
-
-       if (hblank_halved)
-               flow_ctrl_cnt /= 2;
-
-       /* ODM combine 4:1 case */
-       if (opp_cnt == 4)
-               flow_ctrl_cnt /= 2;
-
-       return flow_ctrl_cnt;
-}
-
 static void update_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)
 {
        struct display_stream_compressor *dsc = pipe_ctx->stream_res.dsc;
@@ -183,10 +160,6 @@ void dcn314_update_odm(struct dc *dc, struct dc_state *context, struct pipe_ctx
        struct pipe_ctx *odm_pipe;
        int opp_cnt = 0;
        int opp_inst[MAX_PIPES] = {0};
-       bool rate_control_2x_pclk = (pipe_ctx->stream->timing.flags.INTERLACE || optc2_is_two_pixels_per_containter(&pipe_ctx->stream->timing));
-       struct mpc_dwb_flow_control flow_control;
-       struct mpc *mpc = dc->res_pool->mpc;
-       int i;
 
        opp_cnt = get_odm_config(pipe_ctx, opp_inst);
 
@@ -199,20 +172,6 @@ void dcn314_update_odm(struct dc *dc, struct dc_state *context, struct pipe_ctx
                pipe_ctx->stream_res.tg->funcs->set_odm_bypass(
                                pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
 
-       rate_control_2x_pclk = rate_control_2x_pclk || opp_cnt > 1;
-       flow_control.flow_ctrl_mode = 0;
-       flow_control.flow_ctrl_cnt0 = 0x80;
-       flow_control.flow_ctrl_cnt1 = calc_mpc_flow_ctrl_cnt(pipe_ctx->stream, opp_cnt);
-       if (mpc->funcs->set_out_rate_control) {
-               for (i = 0; i < opp_cnt; ++i) {
-                       mpc->funcs->set_out_rate_control(
-                                       mpc, opp_inst[i],
-                                       true,
-                                       rate_control_2x_pclk,
-                                       &flow_control);
-               }
-       }
-
        for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe) {
                odm_pipe->stream_res.opp->funcs->opp_pipe_clock_control(
                                odm_pipe->stream_res.opp,
index c0b526cf178654f1c9fedb95e08831e965a911a7..7668229438da22d31daf728d591d8b2b54d7e774 100644 (file)
@@ -966,29 +966,6 @@ void dcn32_init_hw(struct dc *dc)
        }
 }
 
-static int calc_mpc_flow_ctrl_cnt(const struct dc_stream_state *stream,
-               int opp_cnt)
-{
-       bool hblank_halved = optc2_is_two_pixels_per_containter(&stream->timing);
-       int flow_ctrl_cnt;
-
-       if (opp_cnt >= 2)
-               hblank_halved = true;
-
-       flow_ctrl_cnt = stream->timing.h_total - stream->timing.h_addressable -
-                       stream->timing.h_border_left -
-                       stream->timing.h_border_right;
-
-       if (hblank_halved)
-               flow_ctrl_cnt /= 2;
-
-       /* ODM combine 4:1 case */
-       if (opp_cnt == 4)
-               flow_ctrl_cnt /= 2;
-
-       return flow_ctrl_cnt;
-}
-
 static void update_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)
 {
        struct display_stream_compressor *dsc = pipe_ctx->stream_res.dsc;
@@ -1103,10 +1080,6 @@ void dcn32_update_odm(struct dc *dc, struct dc_state *context, struct pipe_ctx *
        struct pipe_ctx *odm_pipe;
        int opp_cnt = 0;
        int opp_inst[MAX_PIPES] = {0};
-       bool rate_control_2x_pclk = (pipe_ctx->stream->timing.flags.INTERLACE || optc2_is_two_pixels_per_containter(&pipe_ctx->stream->timing));
-       struct mpc_dwb_flow_control flow_control;
-       struct mpc *mpc = dc->res_pool->mpc;
-       int i;
 
        opp_cnt = get_odm_config(pipe_ctx, opp_inst);
 
@@ -1119,20 +1092,6 @@ void dcn32_update_odm(struct dc *dc, struct dc_state *context, struct pipe_ctx *
                pipe_ctx->stream_res.tg->funcs->set_odm_bypass(
                                pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
 
-       rate_control_2x_pclk = rate_control_2x_pclk || opp_cnt > 1;
-       flow_control.flow_ctrl_mode = 0;
-       flow_control.flow_ctrl_cnt0 = 0x80;
-       flow_control.flow_ctrl_cnt1 = calc_mpc_flow_ctrl_cnt(pipe_ctx->stream, opp_cnt);
-       if (mpc->funcs->set_out_rate_control) {
-               for (i = 0; i < opp_cnt; ++i) {
-                       mpc->funcs->set_out_rate_control(
-                                       mpc, opp_inst[i],
-                                       true,
-                                       rate_control_2x_pclk,
-                                       &flow_control);
-               }
-       }
-
        for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe) {
                odm_pipe->stream_res.opp->funcs->opp_pipe_clock_control(
                                odm_pipe->stream_res.opp,
index 4b92df23ff0db90498e722c0df0d8bbb149e76e2..a5560b3fc39ba9b432e0e5605b3972810de38933 100644 (file)
@@ -358,29 +358,6 @@ void dcn35_init_hw(struct dc *dc)
        }
 }
 
-static int calc_mpc_flow_ctrl_cnt(const struct dc_stream_state *stream,
-               int opp_cnt)
-{
-       bool hblank_halved = optc2_is_two_pixels_per_containter(&stream->timing);
-       int flow_ctrl_cnt;
-
-       if (opp_cnt >= 2)
-               hblank_halved = true;
-
-       flow_ctrl_cnt = stream->timing.h_total - stream->timing.h_addressable -
-                       stream->timing.h_border_left -
-                       stream->timing.h_border_right;
-
-       if (hblank_halved)
-               flow_ctrl_cnt /= 2;
-
-       /* ODM combine 4:1 case */
-       if (opp_cnt == 4)
-               flow_ctrl_cnt /= 2;
-
-       return flow_ctrl_cnt;
-}
-
 static void update_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)
 {
        struct display_stream_compressor *dsc = pipe_ctx->stream_res.dsc;
@@ -474,10 +451,6 @@ void dcn35_update_odm(struct dc *dc, struct dc_state *context, struct pipe_ctx *
        struct pipe_ctx *odm_pipe;
        int opp_cnt = 0;
        int opp_inst[MAX_PIPES] = {0};
-       bool rate_control_2x_pclk = (pipe_ctx->stream->timing.flags.INTERLACE || optc2_is_two_pixels_per_containter(&pipe_ctx->stream->timing));
-       struct mpc_dwb_flow_control flow_control;
-       struct mpc *mpc = dc->res_pool->mpc;
-       int i;
 
        opp_cnt = get_odm_config(pipe_ctx, opp_inst);
 
@@ -490,20 +463,6 @@ void dcn35_update_odm(struct dc *dc, struct dc_state *context, struct pipe_ctx *
                pipe_ctx->stream_res.tg->funcs->set_odm_bypass(
                                pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
 
-       rate_control_2x_pclk = rate_control_2x_pclk || opp_cnt > 1;
-       flow_control.flow_ctrl_mode = 0;
-       flow_control.flow_ctrl_cnt0 = 0x80;
-       flow_control.flow_ctrl_cnt1 = calc_mpc_flow_ctrl_cnt(pipe_ctx->stream, opp_cnt);
-       if (mpc->funcs->set_out_rate_control) {
-               for (i = 0; i < opp_cnt; ++i) {
-                       mpc->funcs->set_out_rate_control(
-                                       mpc, opp_inst[i],
-                                       true,
-                                       rate_control_2x_pclk,
-                                       &flow_control);
-               }
-       }
-
        for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe) {
                odm_pipe->stream_res.opp->funcs->opp_pipe_clock_control(
                                odm_pipe->stream_res.opp,
index ab17fa1c64e8c5b405ae2f24a93c1ee54abefe10..670255c9bc82287fd39474400874059fa13dc557 100644 (file)
@@ -67,7 +67,7 @@ static const struct hw_sequencer_funcs dcn351_funcs = {
        .prepare_bandwidth = dcn35_prepare_bandwidth,
        .optimize_bandwidth = dcn35_optimize_bandwidth,
        .update_bandwidth = dcn20_update_bandwidth,
-       .set_drr = dcn10_set_drr,
+       .set_drr = dcn35_set_drr,
        .get_position = dcn10_get_position,
        .set_static_screen_control = dcn35_set_static_screen_control,
        .setup_stereo = dcn10_setup_stereo,
index 5b486400dfdb5b725f40952305d4efa964b3ad50..909e14261f9b49aa5453fe0b9b5199d32ddc272a 100644 (file)
@@ -700,6 +700,8 @@ static const struct dc_debug_options debug_defaults_drv = {
        .disable_dcc = DCC_ENABLE,
        .disable_dpp_power_gate = true,
        .disable_hubp_power_gate = true,
+       .disable_optc_power_gate = true, /*should the same as above two*/
+       .disable_hpo_power_gate = true, /*dmubfw force domain25 on*/
        .disable_clock_gate = false,
        .disable_dsc_power_gate = true,
        .vsr_support = true,
@@ -742,12 +744,13 @@ static const struct dc_debug_options debug_defaults_drv = {
        },
        .seamless_boot_odm_combine = DML_FAIL_SOURCE_PIXEL_FORMAT,
        .enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
+       .minimum_z8_residency_time = 2100,
        .using_dml2 = true,
        .support_eDP1_5 = true,
        .enable_hpo_pg_support = false,
        .enable_legacy_fast_update = true,
        .enable_single_display_2to1_odm_policy = true,
-       .disable_idle_power_optimizations = true,
+       .disable_idle_power_optimizations = false,
        .dmcub_emulation = false,
        .disable_boot_optimizations = false,
        .disable_unbounded_requesting = false,
@@ -758,8 +761,10 @@ static const struct dc_debug_options debug_defaults_drv = {
        .disable_z10 = true,
        .ignore_pg = true,
        .psp_disabled_wa = true,
-       .ips2_eval_delay_us = 200,
-       .ips2_entry_delay_us = 400
+       .ips2_eval_delay_us = 2000,
+       .ips2_entry_delay_us = 800,
+       .disable_dmub_reallow_idle = true,
+       .static_screen_wait_frames = 2,
 };
 
 static const struct dc_panel_config panel_config_defaults = {
index 738ee763f24a516153bf94ba5beaabec1f78fd9f..84f9b412a4f1172d17502395d0f418bae8233d1a 100644 (file)
@@ -147,15 +147,12 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
        }
 
        /* VSC packet set to 4 for PSR-SU, or 2 for PSR1 */
-       if (stream->link->psr_settings.psr_feature_enabled) {
-               if (stream->link->psr_settings.psr_version == DC_PSR_VERSION_SU_1)
-                       vsc_packet_revision = vsc_packet_rev4;
-               else if (stream->link->psr_settings.psr_version == DC_PSR_VERSION_1)
-                       vsc_packet_revision = vsc_packet_rev2;
-       }
-
-       if (stream->link->replay_settings.config.replay_supported)
+       if (stream->link->psr_settings.psr_version == DC_PSR_VERSION_SU_1)
+               vsc_packet_revision = vsc_packet_rev4;
+       else if (stream->link->replay_settings.config.replay_supported)
                vsc_packet_revision = vsc_packet_rev4;
+       else if (stream->link->psr_settings.psr_version == DC_PSR_VERSION_1)
+               vsc_packet_revision = vsc_packet_rev2;
 
        /* Update to revision 5 for extended colorimetry support */
        if (stream->use_vsc_sdp_for_colorimetry)
index beadb9e42850c75c0a32218cdf01c2d63f7bea47..ca83e9e5c3ffb8e2fd4b76995bec26a8b2e68c7a 100644 (file)
@@ -234,7 +234,8 @@ union UMSCHAPI__SET_HW_RESOURCES {
                                uint32_t enable_level_process_quantum_check : 1;
                                uint32_t is_vcn0_enabled : 1;
                                uint32_t is_vcn1_enabled : 1;
-                               uint32_t reserved : 27;
+                               uint32_t use_rs64mem_for_proc_ctx_csa : 1;
+                               uint32_t reserved : 26;
                        };
                        uint32_t uint32_all;
                };
@@ -297,9 +298,12 @@ union UMSCHAPI__ADD_QUEUE {
 
                struct {
                        uint32_t is_context_suspended : 1;
-                       uint32_t reserved : 31;
+                       uint32_t collaboration_mode : 1;
+                       uint32_t reserved : 30;
                };
                struct UMSCH_API_STATUS api_status;
+               uint32_t process_csa_array_index;
+               uint32_t context_csa_array_index;
        };
 
        uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
@@ -314,6 +318,7 @@ union UMSCHAPI__REMOVE_QUEUE {
                uint64_t context_csa_addr;
 
                struct UMSCH_API_STATUS api_status;
+               uint32_t context_csa_array_index;
        };
 
        uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
@@ -337,6 +342,7 @@ union UMSCHAPI__SUSPEND {
                uint32_t suspend_fence_value;
 
                struct UMSCH_API_STATUS api_status;
+               uint32_t context_csa_array_index;
        };
 
        uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
@@ -356,6 +362,7 @@ union UMSCHAPI__RESUME {
                enum UMSCH_ENGINE_TYPE engine_type;
 
                struct UMSCH_API_STATUS api_status;
+               uint32_t context_csa_array_index;
        };
 
        uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
@@ -404,6 +411,7 @@ union UMSCHAPI__UPDATE_AFFINITY {
                union UMSCH_AFFINITY affinity;
                uint64_t context_csa_addr;
                struct UMSCH_API_STATUS api_status;
+               uint32_t context_csa_array_index;
        };
 
        uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
@@ -417,6 +425,7 @@ union UMSCHAPI__CHANGE_CONTEXT_PRIORITY_LEVEL {
                uint64_t context_quantum;
                uint64_t context_csa_addr;
                struct UMSCH_API_STATUS api_status;
+               uint32_t context_csa_array_index;
        };
 
        uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
index 8a8a57c56bc0c48f9647bc3a9b6b36be2fc15bff..ca7ce4251482dbdf22b5ea39a5e6ca55e763896d 100644 (file)
 #define PPSMC_MSG_TestMessage                   0x01 ///< To check if PMFW is alive and responding. Requirement specified by PMFW team
 #define PPSMC_MSG_GetPmfwVersion                0x02 ///< Get PMFW version
 #define PPSMC_MSG_GetDriverIfVersion            0x03 ///< Get PMFW_DRIVER_IF version
-#define PPSMC_MSG_SPARE0                        0x04 ///< SPARE
-#define PPSMC_MSG_SPARE1                        0x05 ///< SPARE
-#define PPSMC_MSG_PowerDownVcn                  0x06 ///< Power down VCN
-#define PPSMC_MSG_PowerUpVcn                    0x07 ///< Power up VCN; VCN is power gated by default
-#define PPSMC_MSG_SetHardMinVcn                 0x08 ///< For wireless display
+#define PPSMC_MSG_PowerDownVcn1                 0x04 ///< Power down VCN1
+#define PPSMC_MSG_PowerUpVcn1                   0x05 ///< Power up VCN1; VCN1 is power gated by default
+#define PPSMC_MSG_PowerDownVcn0                 0x06 ///< Power down VCN0
+#define PPSMC_MSG_PowerUpVcn0                   0x07 ///< Power up VCN0; VCN0 is power gated by default
+#define PPSMC_MSG_SetHardMinVcn0                0x08 ///< For wireless display
 #define PPSMC_MSG_SetSoftMinGfxclk              0x09 ///< Set SoftMin for GFXCLK, argument is frequency in MHz
-#define PPSMC_MSG_SPARE2                        0x0A ///< SPARE
-#define PPSMC_MSG_SPARE3                        0x0B ///< SPARE
+#define PPSMC_MSG_SetHardMinVcn1                0x0A ///< For wireless display
+#define PPSMC_MSG_SetSoftMinVcn1                0x0B ///< Set soft min for VCN1 clocks (VCLK1 and DCLK1)
 #define PPSMC_MSG_PrepareMp1ForUnload           0x0C ///< Prepare PMFW for GFX driver unload
 #define PPSMC_MSG_SetDriverDramAddrHigh         0x0D ///< Set high 32 bits of DRAM address for Driver table transfer
 #define PPSMC_MSG_SetDriverDramAddrLow          0x0E ///< Set low 32 bits of DRAM address for Driver table transfer
@@ -71,7 +71,7 @@
 #define PPSMC_MSG_GetEnabledSmuFeatures         0x12 ///< Get enabled features in PMFW
 #define PPSMC_MSG_SetHardMinSocclkByFreq        0x13 ///< Set hard min for SOC CLK
 #define PPSMC_MSG_SetSoftMinFclk                0x14 ///< Set hard min for FCLK
-#define PPSMC_MSG_SetSoftMinVcn                 0x15 ///< Set soft min for VCN clocks (VCLK and DCLK)
+#define PPSMC_MSG_SetSoftMinVcn0                0x15 ///< Set soft min for VCN0 clocks (VCLK0 and DCLK0)
 
 #define PPSMC_MSG_EnableGfxImu                  0x16 ///< Enable GFX IMU
 
 
 #define PPSMC_MSG_SetSoftMaxSocclkByFreq        0x1D ///< Set soft max for SOC CLK
 #define PPSMC_MSG_SetSoftMaxFclkByFreq          0x1E ///< Set soft max for FCLK
-#define PPSMC_MSG_SetSoftMaxVcn                 0x1F ///< Set soft max for VCN clocks (VCLK and DCLK)
+#define PPSMC_MSG_SetSoftMaxVcn0                0x1F ///< Set soft max for VCN0 clocks (VCLK0 and DCLK0)
 #define PPSMC_MSG_spare_0x20                    0x20
-#define PPSMC_MSG_PowerDownJpeg                 0x21 ///< Power down Jpeg
-#define PPSMC_MSG_PowerUpJpeg                   0x22 ///< Power up Jpeg; VCN is power gated by default
+#define PPSMC_MSG_PowerDownJpeg0                0x21 ///< Power down Jpeg of VCN0
+#define PPSMC_MSG_PowerUpJpeg0                  0x22 ///< Power up Jpeg of VCN0; VCN0 is power gated by default
 
 #define PPSMC_MSG_SetHardMinFclkByFreq          0x23 ///< Set hard min for FCLK
 #define PPSMC_MSG_SetSoftMinSocclkByFreq        0x24 ///< Set soft min for SOC CLK
 #define PPSMC_MSG_AllowZstates                  0x25 ///< Inform PMFM of allowing Zstate entry, i.e. no Miracast activity
-#define PPSMC_MSG_Reserved                      0x26 ///< Not used
-#define PPSMC_MSG_Reserved1                     0x27 ///< Not used, previously PPSMC_MSG_RequestActiveWgp
-#define PPSMC_MSG_Reserved2                     0x28 ///< Not used, previously PPSMC_MSG_QueryActiveWgp
+#define PPSMC_MSG_PowerDownJpeg1                0x26 ///< Power down Jpeg of VCN1
+#define PPSMC_MSG_PowerUpJpeg1                  0x27 ///< Power up Jpeg of VCN1; VCN1 is power gated by default
+#define PPSMC_MSG_SetSoftMaxVcn1                0x28 ///< Set soft max for VCN1 clocks (VCLK1 and DCLK1)
 #define PPSMC_MSG_PowerDownIspByTile            0x29 ///< ISP is power gated by default
 #define PPSMC_MSG_PowerUpIspByTile              0x2A ///< This message is used to power up ISP tiles and enable the ISP DPM
 #define PPSMC_MSG_SetHardMinIspiclkByFreq       0x2B ///< Set HardMin by frequency for ISPICLK
index a941fdbf78b6b3a077303b67e0d3b0f95ae9089d..af427cc7dbb8450862484e27010e7d495fa28bb2 100644 (file)
        __SMU_DUMMY_MAP(PowerDownVcn),                 \
        __SMU_DUMMY_MAP(PowerUpJpeg),                  \
        __SMU_DUMMY_MAP(PowerDownJpeg),                \
+       __SMU_DUMMY_MAP(PowerUpJpeg0),                 \
+       __SMU_DUMMY_MAP(PowerDownJpeg0),               \
+       __SMU_DUMMY_MAP(PowerUpJpeg1),                 \
+       __SMU_DUMMY_MAP(PowerDownJpeg1),               \
        __SMU_DUMMY_MAP(BacoAudioD3PME),               \
        __SMU_DUMMY_MAP(ArmD3),                        \
        __SMU_DUMMY_MAP(RunDcBtc),                     \
        __SMU_DUMMY_MAP(PowerUpSdma),                 \
        __SMU_DUMMY_MAP(SetHardMinIspclkByFreq),      \
        __SMU_DUMMY_MAP(SetHardMinVcn),               \
+       __SMU_DUMMY_MAP(SetHardMinVcn0),               \
+       __SMU_DUMMY_MAP(SetHardMinVcn1),               \
        __SMU_DUMMY_MAP(SetAllowFclkSwitch),          \
        __SMU_DUMMY_MAP(SetMinVideoGfxclkFreq),       \
        __SMU_DUMMY_MAP(ActiveProcessNotify),         \
        __SMU_DUMMY_MAP(SetPhyclkVoltageByFreq),      \
        __SMU_DUMMY_MAP(SetDppclkVoltageByFreq),      \
        __SMU_DUMMY_MAP(SetSoftMinVcn),               \
+       __SMU_DUMMY_MAP(SetSoftMinVcn0),              \
+       __SMU_DUMMY_MAP(SetSoftMinVcn1),              \
        __SMU_DUMMY_MAP(EnablePostCode),              \
        __SMU_DUMMY_MAP(GetGfxclkFrequency),          \
        __SMU_DUMMY_MAP(GetFclkFrequency),            \
        __SMU_DUMMY_MAP(SetSoftMaxSocclkByFreq),      \
        __SMU_DUMMY_MAP(SetSoftMaxFclkByFreq),        \
        __SMU_DUMMY_MAP(SetSoftMaxVcn),               \
+       __SMU_DUMMY_MAP(SetSoftMaxVcn0),              \
+       __SMU_DUMMY_MAP(SetSoftMaxVcn1),              \
        __SMU_DUMMY_MAP(PowerGateMmHub),              \
        __SMU_DUMMY_MAP(UpdatePmeRestore),            \
        __SMU_DUMMY_MAP(GpuChangeState),              \
index b06a3cc433054244fb5d3069a8ba6ee8aee61255..9e39f99154f94df84495dbce069e2651f2b7f104 100644 (file)
@@ -1402,9 +1402,22 @@ int smu_v14_0_set_vcn_enable(struct smu_context *smu,
                if (adev->vcn.harvest_config & (1 << i))
                        continue;
 
-               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                                     SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
-                                                     i << 16U, NULL);
+               if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 0) ||
+                   amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 1)) {
+                       if (i == 0)
+                               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                                     SMU_MSG_PowerUpVcn0 : SMU_MSG_PowerDownVcn0,
+                                                                     i << 16U, NULL);
+                       else if (i == 1)
+                               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                                     SMU_MSG_PowerUpVcn1 : SMU_MSG_PowerDownVcn1,
+                                                                     i << 16U, NULL);
+               } else {
+                       ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                             SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
+                                                             i << 16U, NULL);
+               }
+
                if (ret)
                        return ret;
        }
@@ -1415,9 +1428,34 @@ int smu_v14_0_set_vcn_enable(struct smu_context *smu,
 int smu_v14_0_set_jpeg_enable(struct smu_context *smu,
                              bool enable)
 {
-       return smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                              SMU_MSG_PowerUpJpeg : SMU_MSG_PowerDownJpeg,
-                                              0, NULL);
+       struct amdgpu_device *adev = smu->adev;
+       int i, ret = 0;
+
+       for (i = 0; i < adev->jpeg.num_jpeg_inst; i++) {
+               if (adev->jpeg.harvest_config & (1 << i))
+                       continue;
+
+               if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 0) ||
+                   amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 1)) {
+                       if (i == 0)
+                               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                                     SMU_MSG_PowerUpJpeg0 : SMU_MSG_PowerDownJpeg0,
+                                                                     i << 16U, NULL);
+                       else if (i == 1 && amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 1))
+                               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                                     SMU_MSG_PowerUpJpeg1 : SMU_MSG_PowerDownJpeg1,
+                                                                     i << 16U, NULL);
+               } else {
+                       ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                             SMU_MSG_PowerUpJpeg : SMU_MSG_PowerDownJpeg,
+                                                             i << 16U, NULL);
+               }
+
+               if (ret)
+                       return ret;
+       }
+
+       return ret;
 }
 
 int smu_v14_0_run_btc(struct smu_context *smu)
index 9310c4758e38ce9791ba8d61ce61a2face051fe8..d6de6d97286c6990e24c79b318f533168c967bd0 100644 (file)
@@ -70,9 +70,12 @@ static struct cmn2asic_msg_mapping smu_v14_0_0_message_map[SMU_MSG_MAX_COUNT] =
        MSG_MAP(TestMessage,                    PPSMC_MSG_TestMessage,                          1),
        MSG_MAP(GetSmuVersion,                  PPSMC_MSG_GetPmfwVersion,                       1),
        MSG_MAP(GetDriverIfVersion,             PPSMC_MSG_GetDriverIfVersion,           1),
-       MSG_MAP(PowerDownVcn,                   PPSMC_MSG_PowerDownVcn,                         1),
-       MSG_MAP(PowerUpVcn,                     PPSMC_MSG_PowerUpVcn,                           1),
-       MSG_MAP(SetHardMinVcn,                  PPSMC_MSG_SetHardMinVcn,                        1),
+       MSG_MAP(PowerDownVcn0,                  PPSMC_MSG_PowerDownVcn0,                        1),
+       MSG_MAP(PowerUpVcn0,                    PPSMC_MSG_PowerUpVcn0,                          1),
+       MSG_MAP(SetHardMinVcn0,                 PPSMC_MSG_SetHardMinVcn0,                       1),
+       MSG_MAP(PowerDownVcn1,                  PPSMC_MSG_PowerDownVcn1,                        1),
+       MSG_MAP(PowerUpVcn1,                    PPSMC_MSG_PowerUpVcn1,                          1),
+       MSG_MAP(SetHardMinVcn1,                 PPSMC_MSG_SetHardMinVcn1,                       1),
        MSG_MAP(SetSoftMinGfxclk,               PPSMC_MSG_SetSoftMinGfxclk,                     1),
        MSG_MAP(PrepareMp1ForUnload,            PPSMC_MSG_PrepareMp1ForUnload,          1),
        MSG_MAP(SetDriverDramAddrHigh,          PPSMC_MSG_SetDriverDramAddrHigh,        1),
@@ -83,7 +86,8 @@ static struct cmn2asic_msg_mapping smu_v14_0_0_message_map[SMU_MSG_MAX_COUNT] =
        MSG_MAP(GetEnabledSmuFeatures,          PPSMC_MSG_GetEnabledSmuFeatures,        1),
        MSG_MAP(SetHardMinSocclkByFreq,         PPSMC_MSG_SetHardMinSocclkByFreq,       1),
        MSG_MAP(SetSoftMinFclk,                 PPSMC_MSG_SetSoftMinFclk,                       1),
-       MSG_MAP(SetSoftMinVcn,                  PPSMC_MSG_SetSoftMinVcn,                        1),
+       MSG_MAP(SetSoftMinVcn0,                 PPSMC_MSG_SetSoftMinVcn0,                       1),
+       MSG_MAP(SetSoftMinVcn1,                 PPSMC_MSG_SetSoftMinVcn1,                       1),
        MSG_MAP(EnableGfxImu,                   PPSMC_MSG_EnableGfxImu,                         1),
        MSG_MAP(AllowGfxOff,                    PPSMC_MSG_AllowGfxOff,                          1),
        MSG_MAP(DisallowGfxOff,                 PPSMC_MSG_DisallowGfxOff,                       1),
@@ -91,9 +95,12 @@ static struct cmn2asic_msg_mapping smu_v14_0_0_message_map[SMU_MSG_MAX_COUNT] =
        MSG_MAP(SetHardMinGfxClk,               PPSMC_MSG_SetHardMinGfxClk,                     1),
        MSG_MAP(SetSoftMaxSocclkByFreq,         PPSMC_MSG_SetSoftMaxSocclkByFreq,       1),
        MSG_MAP(SetSoftMaxFclkByFreq,           PPSMC_MSG_SetSoftMaxFclkByFreq,         1),
-       MSG_MAP(SetSoftMaxVcn,                  PPSMC_MSG_SetSoftMaxVcn,                        1),
-       MSG_MAP(PowerDownJpeg,                  PPSMC_MSG_PowerDownJpeg,                        1),
-       MSG_MAP(PowerUpJpeg,                    PPSMC_MSG_PowerUpJpeg,                          1),
+       MSG_MAP(SetSoftMaxVcn0,                 PPSMC_MSG_SetSoftMaxVcn0,                       1),
+       MSG_MAP(SetSoftMaxVcn1,                 PPSMC_MSG_SetSoftMaxVcn1,                       1),
+       MSG_MAP(PowerDownJpeg0,                 PPSMC_MSG_PowerDownJpeg0,                       1),
+       MSG_MAP(PowerUpJpeg0,                   PPSMC_MSG_PowerUpJpeg0,                         1),
+       MSG_MAP(PowerDownJpeg1,                 PPSMC_MSG_PowerDownJpeg1,                       1),
+       MSG_MAP(PowerUpJpeg1,                   PPSMC_MSG_PowerUpJpeg1,                         1),
        MSG_MAP(SetHardMinFclkByFreq,           PPSMC_MSG_SetHardMinFclkByFreq,         1),
        MSG_MAP(SetSoftMinSocclkByFreq,         PPSMC_MSG_SetSoftMinSocclkByFreq,       1),
        MSG_MAP(PowerDownIspByTile,             PPSMC_MSG_PowerDownIspByTile,           1),
index 9ce46edc62a5b1ac5558b3009f7867643d822a2c..2040a470ddb41bfe9af0fe2abd4c5b53c4a6687c 100644 (file)
@@ -913,14 +913,25 @@ enum kfd_dbg_trap_exception_code {
                                 KFD_EC_MASK(EC_DEVICE_NEW))
 #define KFD_EC_MASK_PROCESS    (KFD_EC_MASK(EC_PROCESS_RUNTIME) |      \
                                 KFD_EC_MASK(EC_PROCESS_DEVICE_REMOVE))
+#define KFD_EC_MASK_PACKET     (KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_DIM_INVALID) |    \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID) |     \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_CODE_INVALID) |   \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_RESERVED) |        \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_UNSUPPORTED) |     \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID) |        \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID) |       \
+                                KFD_EC_MASK(EC_QUEUE_PACKET_VENDOR_UNSUPPORTED))
 
 /* Checks for exception code types for KFD search */
+#define KFD_DBG_EC_IS_VALID(ecode) (ecode > EC_NONE && ecode < EC_MAX)
 #define KFD_DBG_EC_TYPE_IS_QUEUE(ecode)                                        \
-                       (!!(KFD_EC_MASK(ecode) & KFD_EC_MASK_QUEUE))
+                       (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_QUEUE))
 #define KFD_DBG_EC_TYPE_IS_DEVICE(ecode)                               \
-                       (!!(KFD_EC_MASK(ecode) & KFD_EC_MASK_DEVICE))
+                       (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_DEVICE))
 #define KFD_DBG_EC_TYPE_IS_PROCESS(ecode)                              \
-                       (!!(KFD_EC_MASK(ecode) & KFD_EC_MASK_PROCESS))
+                       (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_PROCESS))
+#define KFD_DBG_EC_TYPE_IS_PACKET(ecode)                               \
+                       (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_PACKET))
 
 
 /* Runtime enable states */