]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 12:54:40 +0000 (13:54 +0100)
[ Upstream commit aa1c2b073ad23847dd2e7bdc7d30009f34ed7f59 ]

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
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/accel/ivpu/ivpu_hw_btrs.c
drivers/accel/ivpu/ivpu_hw_btrs.h
drivers/accel/ivpu/ivpu_pm.c

index 2d88357b9a3a4b8f8b9e0fda23df49eb70742799..4af1b164d85a73fd7e33995387a0ef27bccd7e58 100644 (file)
@@ -759,7 +759,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 7650f15b7ffa4a80449651885ffbb277c44a2137..ac0cf50f004ff5f745bac180f56e35323daf4e25 100644 (file)
@@ -35,7 +35,7 @@ u32 ivpu_hw_btrs_dpu_max_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 ad02b71c73bbfa8cc0f79ff09119310941c77d2f..bd8adba5ba70ca415fafbc760d5978f918bb2622 100644 (file)
@@ -466,6 +466,11 @@ void ivpu_pm_dct_irq_thread_handler(struct ivpu_device *vdev)
        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);
+       }
+
 }