]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
accel/ivpu: Fix DCT active percent format
authorKarol Wachowski <karol.wachowski@linux.intel.com>
Wed, 1 Oct 2025 10:43:22 +0000 (12:43 +0200)
committerKarol Wachowski <karol.wachowski@linux.intel.com>
Thu, 2 Oct 2025 05:44:53 +0000 (07:44 +0200)
The pcode MAILBOX STATUS register PARAM2 field expects DCT active
percent in U1.7 value format. Convert percentage value to this
format before writing to the register.

Fixes: a19bffb10c46 ("accel/ivpu: Implement DCT handling")
Reviewed-by: Lizhi Hou <lizhi.hou@amd.com>
Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com>
Link: https://lore.kernel.org/r/20251001104322.1249896-1-karol.wachowski@linux.intel.com
drivers/accel/ivpu/ivpu_hw_btrs.c
drivers/accel/ivpu/ivpu_hw_btrs.h
drivers/accel/ivpu/ivpu_pm.c

index afdb3b2aa72a7009f610d973265a8a5cb765cac4..aa33f562d29c12f0ae3801204992d980b1e91326 100644 (file)
@@ -752,7 +752,7 @@ int ivpu_hw_btrs_dct_get_request(struct ivpu_device *vdev, bool *enable)
        }
 }
 
-void ivpu_hw_btrs_dct_set_status(struct ivpu_device *vdev, bool enable, u32 active_percent)
+void ivpu_hw_btrs_dct_set_status(struct ivpu_device *vdev, bool enable, u8 active_percent)
 {
        u32 val = 0;
        u32 cmd = enable ? DCT_ENABLE : DCT_DISABLE;
index 032c384ac3d4d59803986678464ce41ecf8e05f0..c4c10e22f30f37ff14de465fc62f99ef714e16f0 100644 (file)
@@ -36,7 +36,7 @@ u32 ivpu_hw_btrs_dpu_freq_get(struct ivpu_device *vdev);
 bool ivpu_hw_btrs_irq_handler_mtl(struct ivpu_device *vdev, int irq);
 bool ivpu_hw_btrs_irq_handler_lnl(struct ivpu_device *vdev, int irq);
 int ivpu_hw_btrs_dct_get_request(struct ivpu_device *vdev, bool *enable);
-void ivpu_hw_btrs_dct_set_status(struct ivpu_device *vdev, bool enable, u32 active_percent);
+void ivpu_hw_btrs_dct_set_status(struct ivpu_device *vdev, bool enable, u8 active_percent);
 u32 ivpu_hw_btrs_telemetry_offset_get(struct ivpu_device *vdev);
 u32 ivpu_hw_btrs_telemetry_size_get(struct ivpu_device *vdev);
 u32 ivpu_hw_btrs_telemetry_enable_get(struct ivpu_device *vdev);
index 7514f580eef4338769c94311ad7157bedbf3665d..63c95307faa15978d2cee5245562939d80838d80 100644 (file)
@@ -502,6 +502,11 @@ void ivpu_pm_irq_dct_work_fn(struct work_struct *work)
        else
                ret = ivpu_pm_dct_disable(vdev);
 
-       if (!ret)
-               ivpu_hw_btrs_dct_set_status(vdev, enable, vdev->pm->dct_active_percent);
+       if (!ret) {
+               /* Convert percent to U1.7 format */
+               u8 val = DIV_ROUND_CLOSEST(vdev->pm->dct_active_percent * 128, 100);
+
+               ivpu_hw_btrs_dct_set_status(vdev, enable, val);
+       }
+
 }