All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Matthew Auld <matthew.auld@intel.com>
Cc: intel-xe@lists.freedesktop.org,
	"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
	"Matthew Brost" <matthew.brost@intel.com>,
	"Carlos Santa" <carlos.santa@intel.com>
Subject: Re: [PATCH 2/2] drm/xe/pm: skip BO eviction on iGPU for non-hibernation sleep
Date: Fri, 6 Nov 2026 19:07:43 +0200	[thread overview]
Message-ID: <au4JX697iiUe-KCj@intel.com> (raw)
In-Reply-To: <20261106-s4-opti-v1-2-5edaea2c6d31@intel.com>

On Fri, Nov 06, 2026 at 10:16:43AM +0000, Matthew Auld wrote:
> On iGPU platforms, system RAM and graphics stolen memory remain powered
> during S2idle and S3 (< S4) suspend, so evicting user buffers or
> preparing pinned BOs is unnecessary and needlessly purges DONTNEED
> buffers in userspace caches.
> 
> Distinguish S4 hibernation (.freeze and PM_HIBERNATION_PREPARE) from
> < S4 suspend (.suspend and PM_SUSPEND_PREPARE), and skip BO eviction on
> iGPU when not creating a hibernation image.

Is Intel Rapid Start still a thing?

> 
> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Carlos Santa <carlos.santa@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_pci.c | 21 ++++++++++++++++++---
>  drivers/gpu/drm/xe/xe_pm.c  | 26 ++++++++++++++++++++------
>  drivers/gpu/drm/xe/xe_pm.h  |  2 +-
>  3 files changed, 39 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index ba23ec60477b..67be6e707361 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -1335,7 +1335,7 @@ static void d3cold_toggle(struct pci_dev *pdev, enum toggle_d3cold toggle)
>  	}
>  }
>  
> -static int xe_pci_suspend(struct device *dev)
> +static int __xe_pci_suspend(struct device *dev, bool hibernate)
>  {
>  	struct pci_dev *pdev = to_pci_dev(dev);
>  	struct xe_device *xe = pdev_to_xe_device(pdev);
> @@ -1344,7 +1344,7 @@ static int xe_pci_suspend(struct device *dev)
>  	if (xe_survivability_mode_is_boot_enabled(xe))
>  		return -EBUSY;
>  
> -	err = xe_pm_suspend(xe);
> +	err = xe_pm_suspend(xe, hibernate);
>  	if (err)
>  		return err;
>  
> @@ -1362,6 +1362,16 @@ static int xe_pci_suspend(struct device *dev)
>  	return 0;
>  }
>  
> +static int xe_pci_suspend(struct device *dev)
> +{
> +	return __xe_pci_suspend(dev, false);
> +}
> +
> +static int xe_pci_freeze(struct device *dev)
> +{
> +	return __xe_pci_suspend(dev, true);
> +}
> +
>  static int xe_pci_resume(struct device *dev)
>  {
>  	struct pci_dev *pdev = to_pci_dev(dev);
> @@ -1491,7 +1501,12 @@ static int xe_pci_runtime_idle(struct device *dev)
>  }
>  
>  static const struct dev_pm_ops xe_pm_ops = {
> -	SET_SYSTEM_SLEEP_PM_OPS(xe_pci_suspend, xe_pci_resume)
> +	.suspend = pm_sleep_ptr(xe_pci_suspend),
> +	.resume = pm_sleep_ptr(xe_pci_resume),
> +	.freeze = pm_sleep_ptr(xe_pci_freeze),
> +	.thaw = pm_sleep_ptr(xe_pci_resume),
> +	.poweroff = pm_sleep_ptr(xe_pci_suspend),
> +	.restore = pm_sleep_ptr(xe_pci_resume),
>  	SET_RUNTIME_PM_OPS(xe_pci_runtime_suspend, xe_pci_runtime_resume, xe_pci_runtime_idle)
>  };
>  #endif
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 61d68c09189f..e73192b03074 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -166,13 +166,19 @@ static void xe_rpm_lockmap_release(const struct xe_device *xe)
>  			 &xe_pm_runtime_d3cold_map);
>  }
>  
> +static bool xe_pm_needs_bo_evict(struct xe_device *xe, bool hibernate)
> +{
> +	return IS_DGFX(xe) || hibernate;
> +}
> +
>  /**
> - * xe_pm_suspend - Helper for System suspend, i.e. S0->S3 / S0->S2idle
> + * xe_pm_suspend - Helper for System suspend, i.e. S0->S3 / S0->S2idle / S0->S4
>   * @xe: xe device instance
> + * @hibernate: true if preparing for S4 hibernation, false for < S4 suspend
>   *
>   * Return: 0 on success
>   */
> -int xe_pm_suspend(struct xe_device *xe)
> +int xe_pm_suspend(struct xe_device *xe, bool hibernate)
>  {
>  	struct xe_gt *gt;
>  	u8 id;
> @@ -193,10 +199,12 @@ int xe_pm_suspend(struct xe_device *xe)
>  
>  	xe_display_pm_suspend(xe);
>  
> -	/* FIXME: Super racey... */
> -	err = xe_bo_evict_all(xe);
> -	if (err)
> -		goto err_display;
> +	if (xe_pm_needs_bo_evict(xe, hibernate)) {
> +		/* FIXME: Super racey... */
> +		err = xe_bo_evict_all(xe);
> +		if (err)
> +			goto err_display;
> +	}
>  
>  	for_each_gt(gt, xe, id) {
>  		err = xe_gt_suspend(gt);
> @@ -461,6 +469,9 @@ static int xe_pm_notifier_callback(struct notifier_block *nb,
>  		struct xe_validation_ctx ctx;
>  
>  		reinit_completion(&xe->pm_block);
> +		if (!xe_pm_needs_bo_evict(xe, action == PM_HIBERNATION_PREPARE))
> +			break;
> +
>  		xe_pm_block_begin_signalling();
>  		xe_pm_runtime_get(xe);
>  		(void)xe_validation_ctx_init(&ctx, &xe->val, NULL,
> @@ -485,6 +496,9 @@ static int xe_pm_notifier_callback(struct notifier_block *nb,
>  	case PM_POST_SUSPEND:
>  		complete_all(&xe->pm_block);
>  		xe_pm_wake_rebind_workers(xe);
> +		if (!xe_pm_needs_bo_evict(xe, action == PM_POST_HIBERNATION))
> +			break;
> +
>  		xe_bo_notifier_unprepare_all_pinned(xe);
>  		xe_pm_runtime_put(xe);
>  		break;
> diff --git a/drivers/gpu/drm/xe/xe_pm.h b/drivers/gpu/drm/xe/xe_pm.h
> index 16d4e6c629f1..af81f2a2975f 100644
> --- a/drivers/gpu/drm/xe/xe_pm.h
> +++ b/drivers/gpu/drm/xe/xe_pm.h
> @@ -13,7 +13,7 @@
>  
>  struct xe_device;
>  
> -int xe_pm_suspend(struct xe_device *xe);
> +int xe_pm_suspend(struct xe_device *xe, bool hibernate);
>  int xe_pm_resume(struct xe_device *xe);
>  
>  int xe_pm_init_early(struct xe_device *xe);
> 
> -- 
> 2.56.0

-- 
Ville Syrjälä
Intel

  parent reply	other threads:[~2026-11-06 17:07 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-06 10:16 [PATCH 0/2] Optimise suspend handling for CCS igpu platforms Matthew Auld
2026-11-06 10:16 ` [PATCH 1/2] drm/xe: only evict CCS buffers from TT on iGPU Matthew Auld
2026-11-06 10:50   ` sashiko-bot
2026-11-06 11:34     ` Matthew Auld
2026-11-06 15:07   ` Thomas Hellström
2026-11-06 10:16 ` [PATCH 2/2] drm/xe/pm: skip BO eviction on iGPU for non-hibernation sleep Matthew Auld
2026-11-06 10:31   ` sashiko-bot
2026-11-06 10:32   ` Thomas Hellström
2026-11-06 11:02     ` Matthew Auld
2026-11-06 13:16       ` Matthew Auld
2026-11-06 15:11   ` Thomas Hellström
2026-11-06 17:07   ` Ville Syrjälä [this message]
2026-11-09  9:31     ` Matthew Auld
2026-11-06 11:06 ` ✓ CI.KUnit: success for Optimise suspend handling for CCS igpu platforms Patchwork
2026-11-06 11:40 ` ✓ Xe.CI.BAT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=au4JX697iiUe-KCj@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=carlos.santa@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=matthew.auld@intel.com \
    --cc=matthew.brost@intel.com \
    --cc=thomas.hellstrom@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.