[PATCH v6 08/12] drm/xe/pm: D3cold target state

Badal Nilawar
2026-01-13T16:32:35Z

From: Anshuman Gupta <anshuman.gupta@intel.com>

Trade-off D3cold target state based upon current vram usage.
If vram usage is greater than vram_d3cold_threshold and GPU
is VRSR capable target D3cold state is D3cold-VRSR
otherwise target state is D3cold-Off.

Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
Reviewed-by: Karthik Poosa <karthik.poosa@intel.com>
---
drivers/gpu/drm/xe/xe_pm.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index ef7a686eb014..1a1edbfcf240 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -167,6 +167,14 @@ static void xe_rpm_lockmap_release(const struct xe_device *xe)
&xe_pm_runtime_d3cold_map);
}

+static void xe_pm_suspend_prepare(struct xe_device *xe)
+{
+ if (pm_suspend_target_state == PM_SUSPEND_TO_IDLE)
+ xe_pm_d3cold_target_state_toggle(xe);
+ else
+ xe->d3cold.target_state = XE_D3COLD_OFF;
+}
+
/**
* xe_pm_suspend - Helper for System suspend, i.e. S0->S3 / S0->S2idle
* @xe: xe device instance
@@ -183,6 +191,8 @@ int xe_pm_suspend(struct xe_device *xe)
xe_pm_block_begin_signalling();
trace_xe_pm_suspend(xe, __builtin_return_address(0));

+ xe_pm_suspend_prepare(xe);
+
err = xe_pxp_pm_suspend(xe->pxp);
if (err)
goto err;
@@ -1115,10 +1125,14 @@ void xe_pm_d3cold_target_state_toggle(struct xe_device *xe)

if (total_vram_used_mb < xe->d3cold.vram_threshold)
xe->d3cold.target_state = XE_D3COLD_OFF;
+ else if (xe->d3cold.vrsr_capable)
+ xe->d3cold.target_state = XE_D3COLD_VRSR;
else
xe->d3cold.target_state = XE_D3HOT;

mutex_unlock(&xe->d3cold.lock);
+
+ drm_dbg(&xe->drm, "Xe D3cold target state %d\n", xe->d3cold.target_state);
}

/**
--
2.52.0