drm/amdgpu/mes11: initialize aggregated doorbell
authorJack Xiao <Jack.Xiao@amd.com>
Tue, 6 Jul 2021 07:39:54 +0000 (15:39 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Jul 2022 15:25:17 +0000 (11:25 -0400)
Allocate and enable aggregated doorbell.

Signed-off-by: Jack Xiao <Jack.Xiao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c

index 8dbce32..777f926 100644 (file)
@@ -348,7 +348,7 @@ static int mes_v11_0_set_hw_resources(struct amdgpu_mes *mes)
 
        for (i = 0; i < AMD_PRIORITY_NUM_LEVELS; i++)
                mes_set_hw_res_pkt.aggregated_doorbells[i] =
-                       mes->agreegated_doorbells[i];
+                       mes->aggregated_doorbells[i];
 
        for (i = 0; i < 5; i++) {
                mes_set_hw_res_pkt.gc_base[i] = adev->reg_offset[GC_HWIP][0][i];
@@ -368,6 +368,60 @@ static int mes_v11_0_set_hw_resources(struct amdgpu_mes *mes)
                        offsetof(union MESAPI_SET_HW_RESOURCES, api_status));
 }
 
+static void mes_v11_0_init_aggregated_doorbell(struct amdgpu_mes *mes)
+{
+       struct amdgpu_device *adev = mes->adev;
+       uint32_t data;
+
+       data = RREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL1);
+       data &= ~(CP_MES_DOORBELL_CONTROL1__DOORBELL_OFFSET_MASK |
+                 CP_MES_DOORBELL_CONTROL1__DOORBELL_EN_MASK |
+                 CP_MES_DOORBELL_CONTROL1__DOORBELL_HIT_MASK);
+       data |= mes->aggregated_doorbells[AMDGPU_MES_PRIORITY_LEVEL_LOW] <<
+               CP_MES_DOORBELL_CONTROL1__DOORBELL_OFFSET__SHIFT;
+       data |= 1 << CP_MES_DOORBELL_CONTROL1__DOORBELL_EN__SHIFT;
+       WREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL1, data);
+
+       data = RREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL2);
+       data &= ~(CP_MES_DOORBELL_CONTROL2__DOORBELL_OFFSET_MASK |
+                 CP_MES_DOORBELL_CONTROL2__DOORBELL_EN_MASK |
+                 CP_MES_DOORBELL_CONTROL2__DOORBELL_HIT_MASK);
+       data |= mes->aggregated_doorbells[AMDGPU_MES_PRIORITY_LEVEL_NORMAL] <<
+               CP_MES_DOORBELL_CONTROL2__DOORBELL_OFFSET__SHIFT;
+       data |= 1 << CP_MES_DOORBELL_CONTROL2__DOORBELL_EN__SHIFT;
+       WREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL2, data);
+
+       data = RREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL3);
+       data &= ~(CP_MES_DOORBELL_CONTROL3__DOORBELL_OFFSET_MASK |
+                 CP_MES_DOORBELL_CONTROL3__DOORBELL_EN_MASK |
+                 CP_MES_DOORBELL_CONTROL3__DOORBELL_HIT_MASK);
+       data |= mes->aggregated_doorbells[AMDGPU_MES_PRIORITY_LEVEL_MEDIUM] <<
+               CP_MES_DOORBELL_CONTROL3__DOORBELL_OFFSET__SHIFT;
+       data |= 1 << CP_MES_DOORBELL_CONTROL3__DOORBELL_EN__SHIFT;
+       WREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL3, data);
+
+       data = RREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL4);
+       data &= ~(CP_MES_DOORBELL_CONTROL4__DOORBELL_OFFSET_MASK |
+                 CP_MES_DOORBELL_CONTROL4__DOORBELL_EN_MASK |
+                 CP_MES_DOORBELL_CONTROL4__DOORBELL_HIT_MASK);
+       data |= mes->aggregated_doorbells[AMDGPU_MES_PRIORITY_LEVEL_HIGH] <<
+               CP_MES_DOORBELL_CONTROL4__DOORBELL_OFFSET__SHIFT;
+       data |= 1 << CP_MES_DOORBELL_CONTROL4__DOORBELL_EN__SHIFT;
+       WREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL4, data);
+
+       data = RREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL5);
+       data &= ~(CP_MES_DOORBELL_CONTROL5__DOORBELL_OFFSET_MASK |
+                 CP_MES_DOORBELL_CONTROL5__DOORBELL_EN_MASK |
+                 CP_MES_DOORBELL_CONTROL5__DOORBELL_HIT_MASK);
+       data |= mes->aggregated_doorbells[AMDGPU_MES_PRIORITY_LEVEL_REALTIME] <<
+               CP_MES_DOORBELL_CONTROL5__DOORBELL_OFFSET__SHIFT;
+       data |= 1 << CP_MES_DOORBELL_CONTROL5__DOORBELL_EN__SHIFT;
+       WREG32_SOC15(GC, 0, regCP_MES_DOORBELL_CONTROL5, data);
+
+       data = 1 << CP_HQD_GFX_CONTROL__DB_UPDATED_MSG_EN__SHIFT;
+       WREG32_SOC15(GC, 0, regCP_HQD_GFX_CONTROL, data);
+}
+
 static const struct amdgpu_mes_funcs mes_v11_0_funcs = {
        .add_hw_queue = mes_v11_0_add_hw_queue,
        .remove_hw_queue = mes_v11_0_remove_hw_queue,
@@ -1167,6 +1221,8 @@ static int mes_v11_0_hw_init(void *handle)
        if (r)
                goto failure;
 
+       mes_v11_0_init_aggregated_doorbell(&adev->mes);
+
        r = mes_v11_0_query_sched_status(&adev->mes);
        if (r) {
                DRM_ERROR("MES is busy\n");