]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amdgpu: set CP_HQD_PQ_DOORBELL_CONTROL.DOORBELL_MODE to 1
authorZhigang Luo <Zhigang.Luo@amd.com>
Tue, 25 Jun 2024 17:53:56 +0000 (13:53 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 8 Jul 2024 20:56:27 +0000 (16:56 -0400)
to avoid reading wrong WPTR from doorbell in sriov vf, set
CP_HQD_PQ_DOORBELL_CONTROL.DOORBELL_MODE to 1 to read WPTR from MQD.

Signed-off-by: Zhigang Luo <Zhigang.Luo@amd.com>
Acked-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c

index 1149595a02d85d1a20911af03a6680df6ef4e404..c908e585b9ec0c782905e0829834990a25bf0662 100644 (file)
@@ -1613,6 +1613,9 @@ static int gfx_v9_4_3_xcc_mqd_init(struct amdgpu_ring *ring, int xcc_id)
                                    DOORBELL_SOURCE, 0);
                tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
                                    DOORBELL_HIT, 0);
+               if (amdgpu_sriov_vf(adev))
+                       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
+                                           DOORBELL_MODE, 1);
        } else {
                tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
                                         DOORBELL_EN, 0);
index 399fa21066311e733d4dfad000982f32e665cc6f..66c73825c0a04eec1beb1375cfa347e3b0f2f638 100644 (file)
@@ -546,6 +546,9 @@ static void init_mqd_hiq_v9_4_3(struct mqd_manager *mm, void **mqd,
                m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK |
                                        1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT |
                                        1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT;
+               if (amdgpu_sriov_vf(mm->dev->adev))
+                       m->cp_hqd_pq_doorbell_control |= 1 <<
+                               CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT;
                m->cp_mqd_stride_size = kfd_hiq_mqd_stride(mm->dev);
                if (xcc == 0) {
                        /* Set no_update_rptr = 0 in Master XCC */