forked from mirrors/linux
		
	drm/msm/gpu: Add devfreq tuning debugfs
Make the handful of tuning knobs available visible via debugfs.
v2: select DEVFREQ_GOV_SIMPLE_ONDEMAND because for some reason
    struct devfreq_simple_ondemand_data depends on this
Signed-off-by: Rob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/517784/
Link: https://lore.kernel.org/r/20230110231447.1939101-2-robdclark@gmail.com
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									3cba4a2cdf
								
							
						
					
					
						commit
						6563f60f14
					
				
					 6 changed files with 27 additions and 6 deletions
				
			
		|  | @ -23,6 +23,7 @@ config DRM_MSM | ||||||
| 	select SHMEM | 	select SHMEM | ||||||
| 	select TMPFS | 	select TMPFS | ||||||
| 	select QCOM_SCM | 	select QCOM_SCM | ||||||
|  | 	select DEVFREQ_GOV_SIMPLE_ONDEMAND | ||||||
| 	select WANT_DEV_COREDUMP | 	select WANT_DEV_COREDUMP | ||||||
| 	select SND_SOC_HDMI_CODEC if SND_SOC | 	select SND_SOC_HDMI_CODEC if SND_SOC | ||||||
| 	select SYNC_FILE | 	select SYNC_FILE | ||||||
|  |  | ||||||
|  | @ -2021,7 +2021,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) | ||||||
| 	 * to cause power supply issues: | 	 * to cause power supply issues: | ||||||
| 	 */ | 	 */ | ||||||
| 	if (adreno_is_a618(adreno_gpu) || adreno_is_7c3(adreno_gpu)) | 	if (adreno_is_a618(adreno_gpu) || adreno_is_7c3(adreno_gpu)) | ||||||
| 		gpu->clamp_to_idle = true; | 		priv->gpu_clamp_to_idle = true; | ||||||
| 
 | 
 | ||||||
| 	/* Check if there is a GMU phandle and set it up */ | 	/* Check if there is a GMU phandle and set it up */ | ||||||
| 	node = of_parse_phandle(pdev->dev.of_node, "qcom,gmu", 0); | 	node = of_parse_phandle(pdev->dev.of_node, "qcom,gmu", 0); | ||||||
|  |  | ||||||
|  | @ -305,6 +305,7 @@ void msm_debugfs_init(struct drm_minor *minor) | ||||||
| { | { | ||||||
| 	struct drm_device *dev = minor->dev; | 	struct drm_device *dev = minor->dev; | ||||||
| 	struct msm_drm_private *priv = dev->dev_private; | 	struct msm_drm_private *priv = dev->dev_private; | ||||||
|  | 	struct dentry *gpu_devfreq; | ||||||
| 
 | 
 | ||||||
| 	drm_debugfs_create_files(msm_debugfs_list, | 	drm_debugfs_create_files(msm_debugfs_list, | ||||||
| 				 ARRAY_SIZE(msm_debugfs_list), | 				 ARRAY_SIZE(msm_debugfs_list), | ||||||
|  | @ -325,6 +326,17 @@ void msm_debugfs_init(struct drm_minor *minor) | ||||||
| 	debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root, | 	debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root, | ||||||
| 		dev, &shrink_fops); | 		dev, &shrink_fops); | ||||||
| 
 | 
 | ||||||
|  | 	gpu_devfreq = debugfs_create_dir("devfreq", minor->debugfs_root); | ||||||
|  | 
 | ||||||
|  | 	debugfs_create_bool("idle_clamp",0600, gpu_devfreq, | ||||||
|  | 			    &priv->gpu_clamp_to_idle); | ||||||
|  | 
 | ||||||
|  | 	debugfs_create_u32("upthreshold",0600, gpu_devfreq, | ||||||
|  | 			   &priv->gpu_devfreq_config.upthreshold); | ||||||
|  | 
 | ||||||
|  | 	debugfs_create_u32("downdifferential",0600, gpu_devfreq, | ||||||
|  | 			   &priv->gpu_devfreq_config.downdifferential); | ||||||
|  | 
 | ||||||
| 	if (priv->kms && priv->kms->funcs->debugfs_init) | 	if (priv->kms && priv->kms->funcs->debugfs_init) | ||||||
| 		priv->kms->funcs->debugfs_init(priv->kms, minor); | 		priv->kms->funcs->debugfs_init(priv->kms, minor); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
| #include <linux/kernel.h> | #include <linux/kernel.h> | ||||||
| #include <linux/clk.h> | #include <linux/clk.h> | ||||||
| #include <linux/cpufreq.h> | #include <linux/cpufreq.h> | ||||||
|  | #include <linux/devfreq.h> | ||||||
| #include <linux/module.h> | #include <linux/module.h> | ||||||
| #include <linux/component.h> | #include <linux/component.h> | ||||||
| #include <linux/platform_device.h> | #include <linux/platform_device.h> | ||||||
|  | @ -233,6 +234,14 @@ struct msm_drm_private { | ||||||
| 	 */ | 	 */ | ||||||
| 	unsigned int hangcheck_period; | 	unsigned int hangcheck_period; | ||||||
| 
 | 
 | ||||||
|  | 	/** gpu_devfreq_config: Devfreq tuning config for the GPU. */ | ||||||
|  | 	struct devfreq_simple_ondemand_data gpu_devfreq_config; | ||||||
|  | 
 | ||||||
|  | 	/**
 | ||||||
|  | 	 * gpu_clamp_to_idle: Enable clamping to idle freq when inactive | ||||||
|  | 	 */ | ||||||
|  | 	bool gpu_clamp_to_idle; | ||||||
|  | 
 | ||||||
| 	/**
 | 	/**
 | ||||||
| 	 * disable_err_irq: | 	 * disable_err_irq: | ||||||
| 	 * | 	 * | ||||||
|  |  | ||||||
|  | @ -275,9 +275,6 @@ struct msm_gpu { | ||||||
| 
 | 
 | ||||||
| 	struct msm_gpu_state *crashstate; | 	struct msm_gpu_state *crashstate; | ||||||
| 
 | 
 | ||||||
| 	/* Enable clamping to idle freq when inactive: */ |  | ||||||
| 	bool clamp_to_idle; |  | ||||||
| 
 |  | ||||||
| 	/* True if the hardware supports expanded apriv (a650 and newer) */ | 	/* True if the hardware supports expanded apriv (a650 and newer) */ | ||||||
| 	bool hw_apriv; | 	bool hw_apriv; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -183,6 +183,7 @@ static bool has_devfreq(struct msm_gpu *gpu) | ||||||
| void msm_devfreq_init(struct msm_gpu *gpu) | void msm_devfreq_init(struct msm_gpu *gpu) | ||||||
| { | { | ||||||
| 	struct msm_gpu_devfreq *df = &gpu->devfreq; | 	struct msm_gpu_devfreq *df = &gpu->devfreq; | ||||||
|  | 	struct msm_drm_private *priv = gpu->dev->dev_private; | ||||||
| 
 | 
 | ||||||
| 	/* We need target support to do devfreq */ | 	/* We need target support to do devfreq */ | ||||||
| 	if (!gpu->funcs->gpu_busy) | 	if (!gpu->funcs->gpu_busy) | ||||||
|  | @ -209,7 +210,7 @@ void msm_devfreq_init(struct msm_gpu *gpu) | ||||||
| 
 | 
 | ||||||
| 	df->devfreq = devm_devfreq_add_device(&gpu->pdev->dev, | 	df->devfreq = devm_devfreq_add_device(&gpu->pdev->dev, | ||||||
| 			&msm_devfreq_profile, DEVFREQ_GOV_SIMPLE_ONDEMAND, | 			&msm_devfreq_profile, DEVFREQ_GOV_SIMPLE_ONDEMAND, | ||||||
| 			NULL); | 			&priv->gpu_devfreq_config); | ||||||
| 
 | 
 | ||||||
| 	if (IS_ERR(df->devfreq)) { | 	if (IS_ERR(df->devfreq)) { | ||||||
| 		DRM_DEV_ERROR(&gpu->pdev->dev, "Couldn't initialize GPU devfreq\n"); | 		DRM_DEV_ERROR(&gpu->pdev->dev, "Couldn't initialize GPU devfreq\n"); | ||||||
|  | @ -358,10 +359,11 @@ static void msm_devfreq_idle_work(struct kthread_work *work) | ||||||
| 	struct msm_gpu_devfreq *df = container_of(work, | 	struct msm_gpu_devfreq *df = container_of(work, | ||||||
| 			struct msm_gpu_devfreq, idle_work.work); | 			struct msm_gpu_devfreq, idle_work.work); | ||||||
| 	struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq); | 	struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq); | ||||||
|  | 	struct msm_drm_private *priv = gpu->dev->dev_private; | ||||||
| 
 | 
 | ||||||
| 	df->idle_time = ktime_get(); | 	df->idle_time = ktime_get(); | ||||||
| 
 | 
 | ||||||
| 	if (gpu->clamp_to_idle) | 	if (priv->gpu_clamp_to_idle) | ||||||
| 		dev_pm_qos_update_request(&df->idle_freq, 0); | 		dev_pm_qos_update_request(&df->idle_freq, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Rob Clark
						Rob Clark