Re: [PATCH] drm/komeda: Add runtime_pm support

2019-12-23 Thread Mihail Atanassov
On Thursday, 12 December 2019 07:48:13 GMT james qian wang (Arm Technology 
China) wrote:
> - Add pm_runtime_get/put to crtc_enable/disable along with the real
>   display usage
> - Add runtime_get/put to register_show, since register_show() will
>   access register, need to wakeup HW.
> - For the case that PM is not enabled or configured, manually wakeup HW
> 
> Signed-off-by: james qian wang (Arm Technology China) 
> 
> ---
>  .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  3 +
>  .../gpu/drm/arm/display/komeda/komeda_dev.c   | 55 +--
>  .../gpu/drm/arm/display/komeda/komeda_drv.c   | 42 --
>  .../gpu/drm/arm/display/komeda/komeda_kms.c   |  6 --
>  4 files changed, 53 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> index 1c452ea75999..56bd938961ee 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> @@ -5,6 +5,7 @@
>   *
>   */
>  #include 
> +#include 
>  #include 
>  
>  #include 
> @@ -274,6 +275,7 @@ static void
>  komeda_crtc_atomic_enable(struct drm_crtc *crtc,
> struct drm_crtc_state *old)
>  {
> + pm_runtime_get_sync(crtc->dev->dev);
>   komeda_crtc_prepare(to_kcrtc(crtc));
>   drm_crtc_vblank_on(crtc);
>   WARN_ON(drm_crtc_vblank_get(crtc));
> @@ -372,6 +374,7 @@ komeda_crtc_atomic_disable(struct drm_crtc *crtc,
>   drm_crtc_vblank_put(crtc);
>   drm_crtc_vblank_off(crtc);
>   komeda_crtc_unprepare(kcrtc);
> + pm_runtime_put(crtc->dev->dev);
>  }
>  
>  static void
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
> index 38b832804bad..1d767473ba8a 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
> @@ -10,6 +10,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #ifdef CONFIG_DEBUG_FS
>  #include 
> @@ -27,12 +28,16 @@ static int komeda_register_show(struct seq_file *sf, void 
> *x)
>  
>   seq_puts(sf, "\n== Komeda register dump =\n");
>  
> + pm_runtime_get_sync(mdev->dev);
> +
>   if (mdev->funcs->dump_register)
>   mdev->funcs->dump_register(mdev, sf);
>  
>   for (i = 0; i < mdev->n_pipelines; i++)
>   komeda_pipeline_dump_register(mdev->pipelines[i], sf);
>  
> + pm_runtime_put(mdev->dev);
> +
>   return 0;
>  }
>  
> @@ -263,15 +268,6 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
>   if (!mdev->iommu)
>   DRM_INFO("continue without IOMMU support!\n");
>  
> - if (mdev->iommu && mdev->funcs->connect_iommu) {
> - err = mdev->funcs->connect_iommu(mdev);
> - if (err) {
> - DRM_ERROR("connect iommu failed.\n");
> - mdev->iommu = NULL;
> - goto disable_clk;
> - }
> - }
> -
>   clk_disable_unprepare(mdev->aclk);
>  
>   err = sysfs_create_group(>kobj, _sysfs_attr_group);
> @@ -310,11 +306,6 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
>   if (mdev->aclk)
>   clk_prepare_enable(mdev->aclk);
>  
> - if (mdev->iommu && mdev->funcs->disconnect_iommu)
> - if (mdev->funcs->disconnect_iommu(mdev))
> - DRM_ERROR("disconnect iommu failed.\n");
> - mdev->iommu = NULL;
> -
>   for (i = 0; i < mdev->n_pipelines; i++) {
>   komeda_pipeline_destroy(mdev, mdev->pipelines[i]);
>   mdev->pipelines[i] = NULL;
> @@ -343,44 +334,26 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
>  
>  int komeda_dev_resume(struct komeda_dev *mdev)
>  {
> - int ret = 0;
> -
>   clk_prepare_enable(mdev->aclk);
>  
> - if (mdev->iommu && mdev->funcs->connect_iommu) {
> - ret = mdev->funcs->connect_iommu(mdev);
> - if (ret < 0) {
> - DRM_ERROR("connect iommu failed.\n");
> - goto disable_clk;
> - }
> - }
> -
> - ret = mdev->funcs->enable_irq(mdev);
> + mdev->funcs->enable_irq(mdev);
>  
> -disable_clk:
> - clk_disable_unprepare(mdev->aclk);
> + if (mdev->iommu && mdev->funcs->connect_iommu)
> + if (mdev->funcs->connect_iommu(mdev))
> + DRM_ERROR("connect iommu failed.\n");
>  
> - return ret;
> + return 0;
>  }
>  
>  int komeda_dev_suspend(struct komeda_dev *mdev)
>  {
> - int ret = 0;
> -
> - clk_prepare_enable(mdev->aclk);
> -
> - if (mdev->iommu && mdev->funcs->disconnect_iommu) {
> - ret = mdev->funcs->disconnect_iommu(mdev);
> - if (ret < 0) {
> + if (mdev->iommu && mdev->funcs->disconnect_iommu)
> + if (mdev->funcs->disconnect_iommu(mdev))
>   DRM_ERROR("disconnect iommu failed.\n");
> - 

[PATCH] drm/komeda: Add runtime_pm support

2019-12-11 Thread james qian wang (Arm Technology China)
- Add pm_runtime_get/put to crtc_enable/disable along with the real
  display usage
- Add runtime_get/put to register_show, since register_show() will
  access register, need to wakeup HW.
- For the case that PM is not enabled or configured, manually wakeup HW

Signed-off-by: james qian wang (Arm Technology China) 
---
 .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  3 +
 .../gpu/drm/arm/display/komeda/komeda_dev.c   | 55 +--
 .../gpu/drm/arm/display/komeda/komeda_drv.c   | 42 --
 .../gpu/drm/arm/display/komeda/komeda_kms.c   |  6 --
 4 files changed, 53 insertions(+), 53 deletions(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index 1c452ea75999..56bd938961ee 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -5,6 +5,7 @@
  *
  */
 #include 
+#include 
 #include 
 
 #include 
@@ -274,6 +275,7 @@ static void
 komeda_crtc_atomic_enable(struct drm_crtc *crtc,
  struct drm_crtc_state *old)
 {
+   pm_runtime_get_sync(crtc->dev->dev);
komeda_crtc_prepare(to_kcrtc(crtc));
drm_crtc_vblank_on(crtc);
WARN_ON(drm_crtc_vblank_get(crtc));
@@ -372,6 +374,7 @@ komeda_crtc_atomic_disable(struct drm_crtc *crtc,
drm_crtc_vblank_put(crtc);
drm_crtc_vblank_off(crtc);
komeda_crtc_unprepare(kcrtc);
+   pm_runtime_put(crtc->dev->dev);
 }
 
 static void
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
index 38b832804bad..1d767473ba8a 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #ifdef CONFIG_DEBUG_FS
 #include 
@@ -27,12 +28,16 @@ static int komeda_register_show(struct seq_file *sf, void 
*x)
 
seq_puts(sf, "\n== Komeda register dump =\n");
 
+   pm_runtime_get_sync(mdev->dev);
+
if (mdev->funcs->dump_register)
mdev->funcs->dump_register(mdev, sf);
 
for (i = 0; i < mdev->n_pipelines; i++)
komeda_pipeline_dump_register(mdev->pipelines[i], sf);
 
+   pm_runtime_put(mdev->dev);
+
return 0;
 }
 
@@ -263,15 +268,6 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
if (!mdev->iommu)
DRM_INFO("continue without IOMMU support!\n");
 
-   if (mdev->iommu && mdev->funcs->connect_iommu) {
-   err = mdev->funcs->connect_iommu(mdev);
-   if (err) {
-   DRM_ERROR("connect iommu failed.\n");
-   mdev->iommu = NULL;
-   goto disable_clk;
-   }
-   }
-
clk_disable_unprepare(mdev->aclk);
 
err = sysfs_create_group(>kobj, _sysfs_attr_group);
@@ -310,11 +306,6 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
if (mdev->aclk)
clk_prepare_enable(mdev->aclk);
 
-   if (mdev->iommu && mdev->funcs->disconnect_iommu)
-   if (mdev->funcs->disconnect_iommu(mdev))
-   DRM_ERROR("disconnect iommu failed.\n");
-   mdev->iommu = NULL;
-
for (i = 0; i < mdev->n_pipelines; i++) {
komeda_pipeline_destroy(mdev, mdev->pipelines[i]);
mdev->pipelines[i] = NULL;
@@ -343,44 +334,26 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
 
 int komeda_dev_resume(struct komeda_dev *mdev)
 {
-   int ret = 0;
-
clk_prepare_enable(mdev->aclk);
 
-   if (mdev->iommu && mdev->funcs->connect_iommu) {
-   ret = mdev->funcs->connect_iommu(mdev);
-   if (ret < 0) {
-   DRM_ERROR("connect iommu failed.\n");
-   goto disable_clk;
-   }
-   }
-
-   ret = mdev->funcs->enable_irq(mdev);
+   mdev->funcs->enable_irq(mdev);
 
-disable_clk:
-   clk_disable_unprepare(mdev->aclk);
+   if (mdev->iommu && mdev->funcs->connect_iommu)
+   if (mdev->funcs->connect_iommu(mdev))
+   DRM_ERROR("connect iommu failed.\n");
 
-   return ret;
+   return 0;
 }
 
 int komeda_dev_suspend(struct komeda_dev *mdev)
 {
-   int ret = 0;
-
-   clk_prepare_enable(mdev->aclk);
-
-   if (mdev->iommu && mdev->funcs->disconnect_iommu) {
-   ret = mdev->funcs->disconnect_iommu(mdev);
-   if (ret < 0) {
+   if (mdev->iommu && mdev->funcs->disconnect_iommu)
+   if (mdev->funcs->disconnect_iommu(mdev))
DRM_ERROR("disconnect iommu failed.\n");
-   goto disable_clk;
-   }
-   }
 
-   ret = mdev->funcs->disable_irq(mdev);
+   mdev->funcs->disable_irq(mdev);
 
-disable_clk:
clk_disable_unprepare(mdev->aclk);
 
-   return ret;
+   return 0;
 }
diff --git