]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/display: Add new interface for getting dc_state
authorJouni Högander <jouni.hogander@intel.com>
Mon, 14 Apr 2025 10:04:56 +0000 (13:04 +0300)
committerJouni Högander <jouni.hogander@intel.com>
Wed, 23 Apr 2025 09:16:24 +0000 (12:16 +0300)
To implement workaround for underrun on idle PSR HW issue (Wa_16025596647)
we need to have current configured DC state available. Add new interface
for this purpose.

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
Link: https://lore.kernel.org/r/20250414100508.1208774-2-jouni.hogander@intel.com
drivers/gpu/drm/i915/display/intel_display_power.c
drivers/gpu/drm/i915/display/intel_display_power.h

index 77f26d9856fd008afe5356d05793978353a733d8..16356523816fb8438d88851ab2a19ccc1b7662ef 100644 (file)
@@ -323,6 +323,35 @@ unlock:
        mutex_unlock(&power_domains->lock);
 }
 
+/**
+ * intel_display_power_get_current_dc_state - Set target dc state.
+ * @display: display device
+ *
+ * This function set the "DC off" power well target_dc_state,
+ * based upon this target_dc_stste, "DC off" power well will
+ * enable desired DC state.
+ */
+u32 intel_display_power_get_current_dc_state(struct intel_display *display)
+{
+       struct i915_power_well *power_well;
+       struct i915_power_domains *power_domains = &display->power.domains;
+       u32 current_dc_state = DC_STATE_DISABLE;
+
+       mutex_lock(&power_domains->lock);
+       power_well = lookup_power_well(display, SKL_DISP_DC_OFF);
+
+       if (drm_WARN_ON(display->drm, !power_well))
+               goto unlock;
+
+       current_dc_state = intel_power_well_is_enabled(display, power_well) ?
+               DC_STATE_DISABLE : power_domains->target_dc_state;
+
+unlock:
+       mutex_unlock(&power_domains->lock);
+
+       return current_dc_state;
+}
+
 static void __async_put_domains_mask(struct i915_power_domains *power_domains,
                                     struct intel_power_domain_mask *mask)
 {
index 1b53d67f9b60dea3eb6938b81ab483c0295c6ad3..f8813b0e16dfb7a840f1fe803504a8a5d2c544ee 100644 (file)
@@ -183,6 +183,7 @@ void intel_display_power_suspend(struct intel_display *display);
 void intel_display_power_resume(struct intel_display *display);
 void intel_display_power_set_target_dc_state(struct intel_display *display,
                                             u32 state);
+u32 intel_display_power_get_current_dc_state(struct intel_display *display);
 
 bool intel_display_power_is_enabled(struct intel_display *display,
                                    enum intel_display_power_domain domain);