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);