]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
accel/ivpu: Correct DCT interrupt handling
authorKarol Wachowski <karol.wachowski@intel.com>
Wed, 16 Apr 2025 10:26:16 +0000 (12:26 +0200)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Fri, 25 Apr 2025 08:29:35 +0000 (10:29 +0200)
Fix improper use of dct_active_percent field in DCT interrupt handler
causing DCT to never get enabled. Set dct_active_percent internally before
IPC to ensure correct driver value even if IPC fails.
Set default DCT value to 30 accordingly to HW architecture specification.

Fixes: a19bffb10c46 ("accel/ivpu: Implement DCT handling")
Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
Signed-off-by: Maciej Falkowski <maciej.falkowski@linux.intel.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://lore.kernel.org/r/20250416102616.384577-1-maciej.falkowski@linux.intel.com
drivers/accel/ivpu/ivpu_hw_btrs.h
drivers/accel/ivpu/ivpu_pm.c

index 300f749971d4d620cb35a0401bdb6b9ce30ee8a0..d2d82651976d15869f8d4bc9e73521f902d73f69 100644 (file)
@@ -14,7 +14,7 @@
 #define PLL_PROFILING_FREQ_DEFAULT   38400000
 #define PLL_PROFILING_FREQ_HIGH      400000000
 
-#define DCT_DEFAULT_ACTIVE_PERCENT 15u
+#define DCT_DEFAULT_ACTIVE_PERCENT 30u
 #define DCT_PERIOD_US             35300u
 
 int ivpu_hw_btrs_info_init(struct ivpu_device *vdev);
index b5891e91f7abaf56f711267c0dc2bd19bee214f6..ac0e224545961da769f8c5e8b6707795bf5f7307 100644 (file)
@@ -428,16 +428,17 @@ int ivpu_pm_dct_enable(struct ivpu_device *vdev, u8 active_percent)
        active_us = (DCT_PERIOD_US * active_percent) / 100;
        inactive_us = DCT_PERIOD_US - active_us;
 
+       vdev->pm->dct_active_percent = active_percent;
+
+       ivpu_dbg(vdev, PM, "DCT requested %u%% (D0: %uus, D0i2: %uus)\n",
+                active_percent, active_us, inactive_us);
+
        ret = ivpu_jsm_dct_enable(vdev, active_us, inactive_us);
        if (ret) {
                ivpu_err_ratelimited(vdev, "Failed to enable DCT: %d\n", ret);
                return ret;
        }
 
-       vdev->pm->dct_active_percent = active_percent;
-
-       ivpu_dbg(vdev, PM, "DCT set to %u%% (D0: %uus, D0i2: %uus)\n",
-                active_percent, active_us, inactive_us);
        return 0;
 }
 
@@ -445,15 +446,16 @@ int ivpu_pm_dct_disable(struct ivpu_device *vdev)
 {
        int ret;
 
+       vdev->pm->dct_active_percent = 0;
+
+       ivpu_dbg(vdev, PM, "DCT requested to be disabled\n");
+
        ret = ivpu_jsm_dct_disable(vdev);
        if (ret) {
                ivpu_err_ratelimited(vdev, "Failed to disable DCT: %d\n", ret);
                return ret;
        }
 
-       vdev->pm->dct_active_percent = 0;
-
-       ivpu_dbg(vdev, PM, "DCT disabled\n");
        return 0;
 }
 
@@ -466,7 +468,7 @@ void ivpu_pm_irq_dct_work_fn(struct work_struct *work)
        if (ivpu_hw_btrs_dct_get_request(vdev, &enable))
                return;
 
-       if (vdev->pm->dct_active_percent)
+       if (enable)
                ret = ivpu_pm_dct_enable(vdev, DCT_DEFAULT_ACTIVE_PERCENT);
        else
                ret = ivpu_pm_dct_disable(vdev);