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

Riana Tauro riana.tauro at intel.com
Mon May 22 05:13:10 UTC 2023


Hi Anshuman

On 5/19/2023 9:55 PM, 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;
The value set should be within the vram total size.
A check against total size?
> +
> +	return ret ?: count;
return count
Already returning if there is an error above
> +}
> +
> +DEVICE_ATTR_RW(vram_d3cold_threshold);
static?
> +
> +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;
> +}
> +
>   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)


More information about the Intel-xe mailing list