diff mbox series

[v6,2/6] drm/v3d: Get rid of pm code

Message ID 20220603092610.1909675-3-pbrobinson@gmail.com (mailing list archive)
State New, archived
Headers show
Series Raspberry PI 4 V3D enablement | expand

Commit Message

Peter Robinson June 3, 2022, 9:26 a.m. UTC
Runtime PM doesn't seem to work correctly on this driver. On top of
that, commit 8b6864e3e138 ("drm/v3d/v3d_drv: Remove unused static
variable 'v3d_v3d_pm_ops'") hints that it most likely never did as the
driver's PM ops were not hooked-up.

So, in order to support regular operation with V3D on BCM2711 (Raspberry
Pi 4), get rid of the PM code. PM will be reinstated once we figure out
the underlying issues.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
Changes since v4:
- Rebase

Changes since v3:
- Minor updates for rebase

 drivers/gpu/drm/v3d/v3d_debugfs.c | 18 +-----------------
 drivers/gpu/drm/v3d/v3d_drv.c     | 11 -----------
 drivers/gpu/drm/v3d/v3d_gem.c     | 12 +-----------
 3 files changed, 2 insertions(+), 39 deletions(-)

Comments

Melissa Wen June 3, 2022, 11:29 a.m. UTC | #1
On 06/03, Peter Robinson wrote:
> Runtime PM doesn't seem to work correctly on this driver. On top of
> that, commit 8b6864e3e138 ("drm/v3d/v3d_drv: Remove unused static
> variable 'v3d_v3d_pm_ops'") hints that it most likely never did as the
> driver's PM ops were not hooked-up.
> 
> So, in order to support regular operation with V3D on BCM2711 (Raspberry
> Pi 4), get rid of the PM code. PM will be reinstated once we figure out
> the underlying issues.

I've spent some time trying to get PM working properly on RPi4, but I
havenĀ“t gotten good results yet, and all attempts ended up disabling the
auto suspend option somehow. Keeping in mind how long this has been
unresolved, I agree to clean it now as we continue to investigate the
issue.

Acked-by: Melissa Wen <mwen@igalia.com>
> 
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
> ---
> Changes since v4:
> - Rebase
> 
> Changes since v3:
> - Minor updates for rebase
> 
>  drivers/gpu/drm/v3d/v3d_debugfs.c | 18 +-----------------
>  drivers/gpu/drm/v3d/v3d_drv.c     | 11 -----------
>  drivers/gpu/drm/v3d/v3d_gem.c     | 12 +-----------
>  3 files changed, 2 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
> index 29fd13109e43..efbde124c296 100644
> --- a/drivers/gpu/drm/v3d/v3d_debugfs.c
> +++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
> @@ -4,7 +4,6 @@
>  #include <linux/circ_buf.h>
>  #include <linux/ctype.h>
>  #include <linux/debugfs.h>
> -#include <linux/pm_runtime.h>
>  #include <linux/seq_file.h>
>  #include <linux/string_helpers.h>
>  
> @@ -131,11 +130,7 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
>  	struct drm_device *dev = node->minor->dev;
>  	struct v3d_dev *v3d = to_v3d_dev(dev);
>  	u32 ident0, ident1, ident2, ident3, cores;
> -	int ret, core;
> -
> -	ret = pm_runtime_get_sync(v3d->drm.dev);
> -	if (ret < 0)
> -		return ret;
> +	int core;
>  
>  	ident0 = V3D_READ(V3D_HUB_IDENT0);
>  	ident1 = V3D_READ(V3D_HUB_IDENT1);
> @@ -188,9 +183,6 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
>  			   (misccfg & V3D_MISCCFG_OVRTMUOUT) != 0);
>  	}
>  
> -	pm_runtime_mark_last_busy(v3d->drm.dev);
> -	pm_runtime_put_autosuspend(v3d->drm.dev);
> -
>  	return 0;
>  }
>  
> @@ -218,11 +210,6 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
>  	uint32_t cycles;
>  	int core = 0;
>  	int measure_ms = 1000;
> -	int ret;
> -
> -	ret = pm_runtime_get_sync(v3d->drm.dev);
> -	if (ret < 0)
> -		return ret;
>  
>  	if (v3d->ver >= 40) {
>  		V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
> @@ -246,9 +233,6 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
>  		   cycles / (measure_ms * 1000),
>  		   (cycles / (measure_ms * 100)) % 10);
>  
> -	pm_runtime_mark_last_busy(v3d->drm.dev);
> -	pm_runtime_put_autosuspend(v3d->drm.dev);
> -
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
> index 1afcd54fbbd5..56d5f831e48b 100644
> --- a/drivers/gpu/drm/v3d/v3d_drv.c
> +++ b/drivers/gpu/drm/v3d/v3d_drv.c
> @@ -19,7 +19,6 @@
>  #include <linux/module.h>
>  #include <linux/of_platform.h>
>  #include <linux/platform_device.h>
> -#include <linux/pm_runtime.h>
>  #include <linux/reset.h>
>  
>  #include <drm/drm_drv.h>
> @@ -43,7 +42,6 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
>  {
>  	struct v3d_dev *v3d = to_v3d_dev(dev);
>  	struct drm_v3d_get_param *args = data;
> -	int ret;
>  	static const u32 reg_map[] = {
>  		[DRM_V3D_PARAM_V3D_UIFCFG] = V3D_HUB_UIFCFG,
>  		[DRM_V3D_PARAM_V3D_HUB_IDENT1] = V3D_HUB_IDENT1,
> @@ -69,17 +67,12 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
>  		if (args->value != 0)
>  			return -EINVAL;
>  
> -		ret = pm_runtime_get_sync(v3d->drm.dev);
> -		if (ret < 0)
> -			return ret;
>  		if (args->param >= DRM_V3D_PARAM_V3D_CORE0_IDENT0 &&
>  		    args->param <= DRM_V3D_PARAM_V3D_CORE0_IDENT2) {
>  			args->value = V3D_CORE_READ(0, offset);
>  		} else {
>  			args->value = V3D_READ(offset);
>  		}
> -		pm_runtime_mark_last_busy(v3d->drm.dev);
> -		pm_runtime_put_autosuspend(v3d->drm.dev);
>  		return 0;
>  	}
>  
> @@ -280,10 +273,6 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
>  		return -ENOMEM;
>  	}
>  
> -	pm_runtime_use_autosuspend(dev);
> -	pm_runtime_set_autosuspend_delay(dev, 50);
> -	pm_runtime_enable(dev);
> -
>  	ret = v3d_gem_init(drm);
>  	if (ret)
>  		goto dma_free;
> diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
> index 92bc0faee84f..7026214a09f0 100644
> --- a/drivers/gpu/drm/v3d/v3d_gem.c
> +++ b/drivers/gpu/drm/v3d/v3d_gem.c
> @@ -6,7 +6,6 @@
>  #include <linux/io.h>
>  #include <linux/module.h>
>  #include <linux/platform_device.h>
> -#include <linux/pm_runtime.h>
>  #include <linux/reset.h>
>  #include <linux/sched/signal.h>
>  #include <linux/uaccess.h>
> @@ -367,9 +366,6 @@ v3d_job_free(struct kref *ref)
>  	dma_fence_put(job->irq_fence);
>  	dma_fence_put(job->done_fence);
>  
> -	pm_runtime_mark_last_busy(job->v3d->drm.dev);
> -	pm_runtime_put_autosuspend(job->v3d->drm.dev);
> -
>  	if (job->perfmon)
>  		v3d_perfmon_put(job->perfmon);
>  
> @@ -471,14 +467,10 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
>  	job->v3d = v3d;
>  	job->free = free;
>  
> -	ret = pm_runtime_get_sync(v3d->drm.dev);
> -	if (ret < 0)
> -		goto fail;
> -
>  	ret = drm_sched_job_init(&job->base, &v3d_priv->sched_entity[queue],
>  				 v3d_priv);
>  	if (ret)
> -		goto fail_job;
> +		goto fail;
>  
>  	if (has_multisync) {
>  		if (se->in_sync_count && se->wait_stage == queue) {
> @@ -509,8 +501,6 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
>  
>  fail_deps:
>  	drm_sched_job_cleanup(&job->base);
> -fail_job:
> -	pm_runtime_put_autosuspend(v3d->drm.dev);
>  fail:
>  	kfree(*container);
>  	*container = NULL;
> -- 
> 2.36.1
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
index 29fd13109e43..efbde124c296 100644
--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
+++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
@@ -4,7 +4,6 @@ 
 #include <linux/circ_buf.h>
 #include <linux/ctype.h>
 #include <linux/debugfs.h>
-#include <linux/pm_runtime.h>
 #include <linux/seq_file.h>
 #include <linux/string_helpers.h>
 
@@ -131,11 +130,7 @@  static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
 	struct drm_device *dev = node->minor->dev;
 	struct v3d_dev *v3d = to_v3d_dev(dev);
 	u32 ident0, ident1, ident2, ident3, cores;
-	int ret, core;
-
-	ret = pm_runtime_get_sync(v3d->drm.dev);
-	if (ret < 0)
-		return ret;
+	int core;
 
 	ident0 = V3D_READ(V3D_HUB_IDENT0);
 	ident1 = V3D_READ(V3D_HUB_IDENT1);
@@ -188,9 +183,6 @@  static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
 			   (misccfg & V3D_MISCCFG_OVRTMUOUT) != 0);
 	}
 
-	pm_runtime_mark_last_busy(v3d->drm.dev);
-	pm_runtime_put_autosuspend(v3d->drm.dev);
-
 	return 0;
 }
 
@@ -218,11 +210,6 @@  static int v3d_measure_clock(struct seq_file *m, void *unused)
 	uint32_t cycles;
 	int core = 0;
 	int measure_ms = 1000;
-	int ret;
-
-	ret = pm_runtime_get_sync(v3d->drm.dev);
-	if (ret < 0)
-		return ret;
 
 	if (v3d->ver >= 40) {
 		V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
@@ -246,9 +233,6 @@  static int v3d_measure_clock(struct seq_file *m, void *unused)
 		   cycles / (measure_ms * 1000),
 		   (cycles / (measure_ms * 100)) % 10);
 
-	pm_runtime_mark_last_busy(v3d->drm.dev);
-	pm_runtime_put_autosuspend(v3d->drm.dev);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 1afcd54fbbd5..56d5f831e48b 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -19,7 +19,6 @@ 
 #include <linux/module.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
-#include <linux/pm_runtime.h>
 #include <linux/reset.h>
 
 #include <drm/drm_drv.h>
@@ -43,7 +42,6 @@  static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
 {
 	struct v3d_dev *v3d = to_v3d_dev(dev);
 	struct drm_v3d_get_param *args = data;
-	int ret;
 	static const u32 reg_map[] = {
 		[DRM_V3D_PARAM_V3D_UIFCFG] = V3D_HUB_UIFCFG,
 		[DRM_V3D_PARAM_V3D_HUB_IDENT1] = V3D_HUB_IDENT1,
@@ -69,17 +67,12 @@  static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
 		if (args->value != 0)
 			return -EINVAL;
 
-		ret = pm_runtime_get_sync(v3d->drm.dev);
-		if (ret < 0)
-			return ret;
 		if (args->param >= DRM_V3D_PARAM_V3D_CORE0_IDENT0 &&
 		    args->param <= DRM_V3D_PARAM_V3D_CORE0_IDENT2) {
 			args->value = V3D_CORE_READ(0, offset);
 		} else {
 			args->value = V3D_READ(offset);
 		}
-		pm_runtime_mark_last_busy(v3d->drm.dev);
-		pm_runtime_put_autosuspend(v3d->drm.dev);
 		return 0;
 	}
 
@@ -280,10 +273,6 @@  static int v3d_platform_drm_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
-	pm_runtime_use_autosuspend(dev);
-	pm_runtime_set_autosuspend_delay(dev, 50);
-	pm_runtime_enable(dev);
-
 	ret = v3d_gem_init(drm);
 	if (ret)
 		goto dma_free;
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 92bc0faee84f..7026214a09f0 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -6,7 +6,6 @@ 
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
-#include <linux/pm_runtime.h>
 #include <linux/reset.h>
 #include <linux/sched/signal.h>
 #include <linux/uaccess.h>
@@ -367,9 +366,6 @@  v3d_job_free(struct kref *ref)
 	dma_fence_put(job->irq_fence);
 	dma_fence_put(job->done_fence);
 
-	pm_runtime_mark_last_busy(job->v3d->drm.dev);
-	pm_runtime_put_autosuspend(job->v3d->drm.dev);
-
 	if (job->perfmon)
 		v3d_perfmon_put(job->perfmon);
 
@@ -471,14 +467,10 @@  v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
 	job->v3d = v3d;
 	job->free = free;
 
-	ret = pm_runtime_get_sync(v3d->drm.dev);
-	if (ret < 0)
-		goto fail;
-
 	ret = drm_sched_job_init(&job->base, &v3d_priv->sched_entity[queue],
 				 v3d_priv);
 	if (ret)
-		goto fail_job;
+		goto fail;
 
 	if (has_multisync) {
 		if (se->in_sync_count && se->wait_stage == queue) {
@@ -509,8 +501,6 @@  v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
 
 fail_deps:
 	drm_sched_job_cleanup(&job->base);
-fail_job:
-	pm_runtime_put_autosuspend(v3d->drm.dev);
 fail:
 	kfree(*container);
 	*container = NULL;