[Intel-xe] [PATCH 3/4] drm/xe/pm: Add vram_d3cold_threshold Sysfs

Rodrigo Vivi rodrigo.vivi at kernel.org
Fri May 19 22:07:58 UTC 2023


On Fri, May 19, 2023 at 09:55:54PM +0530, Anshuman Gupta wrote:
> Add per pci device vram_d3cold_threshold Sysfs to
> control the d3cold_allowed knob.
> 
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> Signed-off-by: Anshuman Gupta <anshuman.gupta at intel.com>
> ---
>  drivers/gpu/drm/xe/xe_device_types.h |  8 ++++
>  drivers/gpu/drm/xe/xe_pm.c           | 65 ++++++++++++++++++++++++++++
>  2 files changed, 73 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index 8fd3acf60719..68222a3447cf 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -272,6 +272,14 @@ struct xe_device {
>  	/** @d3cold_allowed: Indicates if d3cold is a valid device state */
>  	bool d3cold_allowed;
>  
> +	/**
> +	 * @vram_d3cold_threshold is the permissible threshold(in megabytes)
> +	 * for vram save/restore. d3cold will be disallowed, when vram_usages is
> +	 * above threshold value to avoid the vram save/restore latency.
> +	 * Default threshold value is 300mb.
> +	 */
> +	u32 vram_d3cold_threshold;
> +
>  	/* private: */
>  
>  #if IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index c250a36b99ad..ebdbdf2e0898 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -7,6 +7,7 @@
>  
>  #include <linux/pm_runtime.h>
>  
> +#include <drm/drm_managed.h>
>  #include <drm/ttm/ttm_placement.h>
>  
>  #include "xe_bo.h"
> @@ -132,6 +133,68 @@ static bool xe_pm_pci_d3cold_capable(struct pci_dev *pdev)
>  	return true;
>  }
>  
> +static ssize_t
> +vram_d3cold_threshold_show(struct device *dev,
> +			   struct device_attribute *attr, char *buf)
> +{
> +	struct pci_dev *pdev = to_pci_dev(dev);
> +	struct xe_device *xe = pdev_to_xe_device(pdev);
> +	int ret;
> +
> +	if (!xe)
> +		return -EINVAL;
> +
> +	ret = sysfs_emit(buf, "%d\n", xe->vram_d3cold_threshold);
> +
> +	return ret;
> +}
> +
> +static ssize_t
> +vram_d3cold_threshold_store(struct device *dev, struct device_attribute *attr,
> +			    const char *buff, size_t count)
> +{
> +	struct pci_dev *pdev = to_pci_dev(dev);
> +	struct xe_device *xe = pdev_to_xe_device(pdev);
> +	u32 vram_d3cold_threshold;
> +	int ret;
> +
> +	if (!xe)
> +		return -EINVAL;
> +
> +	ret = kstrtou32(buff, 0, &vram_d3cold_threshold);
> +	if (ret)
> +		return ret;
> +
> +	dev_dbg(dev, "vram_d3cold_threshold: %d\n", vram_d3cold_threshold);
> +
> +	xe->vram_d3cold_threshold = vram_d3cold_threshold;
> +
> +	return ret ?: count;
> +}
> +
> +DEVICE_ATTR_RW(vram_d3cold_threshold);
> +
> +void xe_pm_sysfs_fini(struct drm_device *drm, void *arg)
> +{
> +	struct xe_device *xe = arg;
> +
> +	sysfs_remove_file(&xe->drm.dev->kobj, &dev_attr_vram_d3cold_threshold.attr);
> +}
> +
> +int xe_pm_sysfs_init(struct xe_device *xe)
> +{
> +	struct device *dev = xe->drm.dev;
> +	int ret;
> +
> +	ret = sysfs_create_file(&dev->kobj, &dev_attr_vram_d3cold_threshold.attr);
> +	if (ret)
> +		return ret;
> +
> +	ret = drmm_add_action_or_reset(&xe->drm, xe_pm_sysfs_fini, xe);
> +
> +	return ret;
> +}
> +

Let's not spread sysfs files all around the code and create new components
as they fit.

I know we only have a sysfs per gt, so probably time to create the per
device: xe_device_sysfs.{c,h,_types.h}

>  static void xe_pm_runtime_init(struct xe_device *xe)
>  {
>  	struct device *dev = xe->drm.dev;
> @@ -150,6 +213,8 @@ void xe_pm_init(struct xe_device *xe)
>  
>  	xe_pm_runtime_init(xe);
>  	xe->d3cold_capable = xe_pm_pci_d3cold_capable(pdev);
> +	xe->vram_d3cold_threshold = 300;
> +	xe_pm_sysfs_init(xe);
>  }
>  
>  void xe_pm_runtime_fini(struct xe_device *xe)
> -- 
> 2.38.0
> 


More information about the Intel-xe mailing list