Applied to drm-misc-fixes
On 4/16/2025 12:26 PM, Maciej Falkowski wrote:
> From: Karol Wachowski <karol.wachow...@intel.com>
>
> 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.wachow...@intel.com>
> Signed-off-by: Maciej Falkowski <maciej.falkow...@linux.intel.com>
> ---
> drivers/accel/ivpu/ivpu_hw_btrs.h | 2 +-
> drivers/accel/ivpu/ivpu_pm.c | 18 ++++++++++--------
> 2 files changed, 11 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/accel/ivpu/ivpu_hw_btrs.h
> b/drivers/accel/ivpu/ivpu_hw_btrs.h
> index 300f749971d4..d2d82651976d 100644
> --- a/drivers/accel/ivpu/ivpu_hw_btrs.h
> +++ b/drivers/accel/ivpu/ivpu_hw_btrs.h
> @@ -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);
> diff --git a/drivers/accel/ivpu/ivpu_pm.c b/drivers/accel/ivpu/ivpu_pm.c
> index 1fe03fc16bbc..ea30db181cd7 100644
> --- a/drivers/accel/ivpu/ivpu_pm.c
> +++ b/drivers/accel/ivpu/ivpu_pm.c
> @@ -448,16 +448,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;
> }
>
> @@ -465,15 +466,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;
> }
>
> @@ -486,7 +488,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);