]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amdgpu: Enable MES to handle doorbell ring on unmapped queue
authorshaoyunl <shaoyun.liu@amd.com>
Thu, 2 Nov 2023 23:26:39 +0000 (19:26 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 May 2024 20:18:10 +0000 (16:18 -0400)
On MES12, HW can monitor up to 2048 doorbells that not be
mapped currently and trigger the interrupt to MES when these unmapped
doorbell been ringed.

Signed-off-by: shaoyunl <shaoyun.liu@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c

index d20bb78280b15b05bdf959bfb7a7922a26d83010..d8ccf580bcf4b30950fff6dc21d1c614b5e57263 100644 (file)
@@ -454,6 +454,27 @@ static void mes_v12_0_init_aggregated_doorbell(struct amdgpu_mes *mes)
        WREG32_SOC15(GC, 0, regCP_HQD_GFX_CONTROL, data);
 }
 
+
+static void mes_v12_0_enable_unmapped_doorbell_handling(
+               struct amdgpu_mes *mes, bool enable)
+{
+       struct amdgpu_device *adev = mes->adev;
+       uint32_t data = RREG32_SOC15(GC, 0, regCP_UNMAPPED_DOORBELL);
+
+       /*
+        * The default PROC_LSB settng is 0xc which means doorbell
+        * addr[16:12] gives the doorbell page number. For kfd, each
+        * process will use 2 pages of doorbell, we need to change the
+        * setting to 0xd
+        */
+       data &= ~CP_UNMAPPED_DOORBELL__PROC_LSB_MASK;
+       data |= 0xd <<  CP_UNMAPPED_DOORBELL__PROC_LSB__SHIFT;
+
+       data |= (enable ? 1 : 0) << CP_UNMAPPED_DOORBELL__ENABLE__SHIFT;
+
+       WREG32_SOC15(GC, 0, regCP_UNMAPPED_DOORBELL, data);
+}
+
 static const struct amdgpu_mes_funcs mes_v12_0_funcs = {
        .add_hw_queue = mes_v12_0_add_hw_queue,
        .remove_hw_queue = mes_v12_0_remove_hw_queue,
@@ -1233,6 +1254,9 @@ static int mes_v12_0_hw_init(void *handle)
 
        mes_v12_0_init_aggregated_doorbell(&adev->mes);
 
+       /* Enable the MES to handle doorbell ring on unmapped queue */
+       mes_v12_0_enable_unmapped_doorbell_handling(&adev->mes, true);
+
        r = mes_v12_0_query_sched_status(&adev->mes);
        if (r) {
                DRM_ERROR("MES is busy\n");