Commit f90491d4 authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

drm/xe: Remove runtime argument from display s/r functions



The previous change ensures that pm_suspend is only called when
suspending or resuming. This ensures no further bugs like those
in the previous commit.

Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: default avatarVinod Govindapillai <vinod.govindapillai@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240905150052.174895-3-maarten.lankhorst@linux.intel.com
parent 474f64cb
Loading
Loading
Loading
Loading
+32 −21
Original line number Diff line number Diff line
@@ -309,18 +309,7 @@ static void xe_display_flush_cleanup_work(struct xe_device *xe)
}

/* TODO: System and runtime suspend/resume sequences will be sanitized as a follow-up. */
void xe_display_pm_runtime_suspend(struct xe_device *xe)
{
	if (!xe->info.probe_display)
		return;

	if (xe->d3cold.allowed)
		xe_display_pm_suspend(xe, true);

	intel_hpd_poll_enable(xe);
}

void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
{
	struct intel_display *display = &xe->display;
	bool s2idle = suspend_to_idle();
@@ -355,26 +344,31 @@ void xe_display_pm_suspend(struct xe_device *xe, bool runtime)
	intel_dmc_suspend(xe);
}

void xe_display_pm_suspend_late(struct xe_device *xe)
void xe_display_pm_suspend(struct xe_device *xe)
{
	__xe_display_pm_suspend(xe, false);
}

void xe_display_pm_runtime_suspend(struct xe_device *xe)
{
	bool s2idle = suspend_to_idle();
	if (!xe->info.probe_display)
		return;

	intel_power_domains_suspend(xe, s2idle);
	if (xe->d3cold.allowed)
		__xe_display_pm_suspend(xe, true);

	intel_display_power_suspend_late(xe);
	intel_hpd_poll_enable(xe);
}

void xe_display_pm_runtime_resume(struct xe_device *xe)
void xe_display_pm_suspend_late(struct xe_device *xe)
{
	bool s2idle = suspend_to_idle();
	if (!xe->info.probe_display)
		return;

	intel_hpd_poll_disable(xe);
	intel_power_domains_suspend(xe, s2idle);

	if (xe->d3cold.allowed)
		xe_display_pm_resume(xe, true);
	intel_display_power_suspend_late(xe);
}

void xe_display_pm_resume_early(struct xe_device *xe)
@@ -387,7 +381,7 @@ void xe_display_pm_resume_early(struct xe_device *xe)
	intel_power_domains_resume(xe);
}

void xe_display_pm_resume(struct xe_device *xe, bool runtime)
static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
{
	struct intel_display *display = &xe->display;

@@ -421,6 +415,23 @@ void xe_display_pm_resume(struct xe_device *xe, bool runtime)
	intel_power_domains_enable(xe);
}

void xe_display_pm_resume(struct xe_device *xe)
{
	__xe_display_pm_resume(xe, false);
}

void xe_display_pm_runtime_resume(struct xe_device *xe)
{
	if (!xe->info.probe_display)
		return;

	intel_hpd_poll_disable(xe);

	if (xe->d3cold.allowed)
		__xe_display_pm_resume(xe, true);
}


static void display_device_remove(struct drm_device *dev, void *arg)
{
	struct xe_device *xe = arg;
+4 −4
Original line number Diff line number Diff line
@@ -34,10 +34,10 @@ void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir);
void xe_display_irq_reset(struct xe_device *xe);
void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt);

void xe_display_pm_suspend(struct xe_device *xe, bool runtime);
void xe_display_pm_suspend(struct xe_device *xe);
void xe_display_pm_suspend_late(struct xe_device *xe);
void xe_display_pm_resume_early(struct xe_device *xe);
void xe_display_pm_resume(struct xe_device *xe, bool runtime);
void xe_display_pm_resume(struct xe_device *xe);
void xe_display_pm_runtime_suspend(struct xe_device *xe);
void xe_display_pm_runtime_resume(struct xe_device *xe);

@@ -65,10 +65,10 @@ static inline void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir)
static inline void xe_display_irq_reset(struct xe_device *xe) {}
static inline void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt) {}

static inline void xe_display_pm_suspend(struct xe_device *xe, bool runtime) {}
static inline void xe_display_pm_suspend(struct xe_device *xe) {}
static inline void xe_display_pm_suspend_late(struct xe_device *xe) {}
static inline void xe_display_pm_resume_early(struct xe_device *xe) {}
static inline void xe_display_pm_resume(struct xe_device *xe, bool runtime) {}
static inline void xe_display_pm_resume(struct xe_device *xe) {}
static inline void xe_display_pm_runtime_suspend(struct xe_device *xe) {}
static inline void xe_display_pm_runtime_resume(struct xe_device *xe) {}

+3 −3
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ int xe_pm_suspend(struct xe_device *xe)
	for_each_gt(gt, xe, id)
		xe_gt_suspend_prepare(gt);

	xe_display_pm_suspend(xe, false);
	xe_display_pm_suspend(xe);

	/* FIXME: Super racey... */
	err = xe_bo_evict_all(xe);
@@ -133,7 +133,7 @@ int xe_pm_suspend(struct xe_device *xe)
	for_each_gt(gt, xe, id) {
		err = xe_gt_suspend(gt);
		if (err) {
			xe_display_pm_resume(xe, false);
			xe_display_pm_resume(xe);
			goto err;
		}
	}
@@ -187,7 +187,7 @@ int xe_pm_resume(struct xe_device *xe)
	for_each_gt(gt, xe, id)
		xe_gt_resume(gt);

	xe_display_pm_resume(xe, false);
	xe_display_pm_resume(xe);

	err = xe_bo_restore_user(xe);
	if (err)