[Intel-xe] [PATCH 5/5] drm/xe: Ensure memory eviction on s2idle.

Gupta, Anshuman anshuman.gupta at intel.com
Thu Jul 27 11:34:35 UTC 2023



> -----Original Message-----
> From: Vivi, Rodrigo <rodrigo.vivi at intel.com>
> Sent: Wednesday, July 26, 2023 3:42 AM
> To: intel-xe at lists.freedesktop.org
> Cc: Vivi, Rodrigo <rodrigo.vivi at intel.com>; Gupta, Anshuman
> <anshuman.gupta at intel.com>
> Subject: [PATCH 5/5] drm/xe: Ensure memory eviction on s2idle.
> 
> On discrete cards we cannot allow the pci subsystem to skip the regular
> suspend and we need to unblock the d3cold.
> 
> Cc: Anshuman Gupta <anshuman.gupta at intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
Reviewed-by: Anshuman Gupta <anshuman.gupta at intel.com>
> ---
>  drivers/gpu/drm/xe/xe_pci.c | 54 ++++++++++++++++++++++---------------
>  drivers/gpu/drm/xe/xe_pm.c  | 11 ++++++++
>  2 files changed, 43 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index 06759afb4224..ec4ec769a5cc 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -31,6 +31,28 @@ enum toggle_d3cold {
>  	D3COLD_ENABLE,
>  };
> 
> +static void d3cold_toggle(struct pci_dev *pdev, enum toggle_d3cold
> +toggle) {
> +	struct xe_device *xe = pdev_to_xe_device(pdev);
> +	struct pci_dev *root_pdev;
> +
> +	if (!xe->d3cold.capable)
> +		return;
> +
> +	root_pdev = pcie_find_root_port(pdev);
> +	if (!root_pdev)
> +		return;
> +
> +	switch (toggle) {
> +	case D3COLD_DISABLE:
> +		pci_d3cold_disable(root_pdev);
> +		break;
> +	case D3COLD_ENABLE:
> +		pci_d3cold_enable(root_pdev);
> +		break;
> +	}
> +}
> +
>  struct xe_subplatform_desc {
>  	enum xe_subplatform subplatform;
>  	const char *name;
> @@ -725,6 +747,13 @@ static int xe_pci_suspend(struct device *dev)
>  	if (err)
>  		return err;
> 
> +	/*
> +	 * Enabling D3Cold is needed for S2Idle/S0ix.
> +	 * It is save to allow here since xe_pm_suspend has evicted
> +	 * the local memory and the direct complete optimization is disabled.
> +	 */
> +	d3cold_toggle(pdev, D3COLD_ENABLE);
> +
>  	pci_save_state(pdev);
>  	pci_disable_device(pdev);
> 
> @@ -740,6 +769,9 @@ static int xe_pci_resume(struct device *dev)
>  	struct pci_dev *pdev = to_pci_dev(dev);
>  	int err;
> 
> +	/* Give back the D3Cold decision to the runtime P M*/
> +	d3cold_toggle(pdev, D3COLD_DISABLE);
> +
>  	err = pci_set_power_state(pdev, PCI_D0);
>  	if (err)
>  		return err;
> @@ -759,28 +791,6 @@ static int xe_pci_resume(struct device *dev)
>  	return 0;
>  }
> 
> -static void d3cold_toggle(struct pci_dev *pdev, enum toggle_d3cold toggle)
> -{
> -	struct xe_device *xe = pdev_to_xe_device(pdev);
> -	struct pci_dev *root_pdev;
> -
> -	if (!xe->d3cold.capable)
> -		return;
> -
> -	root_pdev = pcie_find_root_port(pdev);
> -	if (!root_pdev)
> -		return;
> -
> -	switch (toggle) {
> -	case D3COLD_DISABLE:
> -		pci_d3cold_disable(root_pdev);
> -		break;
> -	case D3COLD_ENABLE:
> -		pci_d3cold_enable(root_pdev);
> -		break;
> -	}
> -}
> -
>  static int xe_pci_runtime_suspend(struct device *dev)  {
>  	struct pci_dev *pdev = to_pci_dev(dev); diff --git
> a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c index
> 67ca7cb7e8dd..8bb8e154e5f8 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -139,6 +139,17 @@ static void xe_pm_runtime_init(struct xe_device
> *xe)  {
>  	struct device *dev = xe->drm.dev;
> 
> +	/*
> +	 * Disable the system suspend direct complete optimization.
> +	 * We need to ensure that the regular device suspend/resume
> functions
> +	 * are called since our runtime_pm cannot guarantee local memory
> +	 * eviction for d3cold.
> +	 * TODO: Check HDA audio dependencies claimed by i915, and then
> enforce
> +	 *       this option to integrated graphics as well.
> +	 */
> +	if (IS_DGFX(xe))
> +		dev_pm_set_driver_flags(dev,
> DPM_FLAG_NO_DIRECT_COMPLETE);
> +
>  	pm_runtime_use_autosuspend(dev);
>  	pm_runtime_set_autosuspend_delay(dev, 1000);
>  	pm_runtime_set_active(dev);
> --
> 2.41.0



More information about the Intel-xe mailing list