[PATCH 3/8] drm/etnaviv: move runtime PM handling to events

Christian Gmeiner christian.gmeiner at gmail.com
Wed Jun 14 18:41:27 UTC 2023


Hi Lucas

>
> Conceptually events are the right abstraction to handle the GPU
> runtime PM state: as long as any event is pending the GPU can not
> be idle. Events are also properly freed and reallocated when the
> GPU has been reset after a hang.
>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c |  3 ---
>  drivers/gpu/drm/etnaviv/etnaviv_gpu.c        | 27 ++++++++++++--------
>  3 files changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> index baa81cbf701a..a42d260cac2c 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> @@ -97,7 +97,6 @@ struct etnaviv_gem_submit {
>         struct list_head node; /* GPU active submit list */
>         struct etnaviv_cmdbuf cmdbuf;
>         struct pid *pid;       /* submitting process */
> -       bool runtime_resumed;
>         u32 exec_state;
>         u32 flags;
>         unsigned int nr_pmrs;
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index 45403ea38906..2416c526f9b0 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -362,9 +362,6 @@ static void submit_cleanup(struct kref *kref)
>                         container_of(kref, struct etnaviv_gem_submit, refcount);
>         unsigned i;
>
> -       if (submit->runtime_resumed)
> -               pm_runtime_put_autosuspend(submit->gpu->dev);
> -
>         if (submit->cmdbuf.suballoc)
>                 etnaviv_cmdbuf_free(&submit->cmdbuf);
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> index 4e18aa8566c6..54a1249c5bca 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> @@ -1139,7 +1139,8 @@ static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>         unsigned int *events)
>  {
>         unsigned long timeout = msecs_to_jiffies(10 * 10000);
> -       unsigned i, acquired = 0;
> +       unsigned i, acquired = 0, rpm_count = 0;

rpm is the short form of runtime power management?

> +       int ret;
>
>         for (i = 0; i < nr_events; i++) {
>                 unsigned long ret;
> @@ -1148,6 +1149,7 @@ static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>
>                 if (!ret) {
>                         dev_err(gpu->dev, "wait_for_completion_timeout failed");
> +                       ret = -EBUSY;
>                         goto out;
>                 }
>
> @@ -1167,13 +1169,23 @@ static int event_alloc(struct etnaviv_gpu *gpu, unsigned nr_events,
>
>         spin_unlock(&gpu->event_spinlock);
>
> +       for (i = 0; i < nr_events; i++) {
> +               ret = pm_runtime_resume_and_get(gpu->dev);
> +               if (ret)
> +                       goto out_rpm;
> +               rpm_count++;
> +       }
> +
>         return 0;
>
> +out_rpm:
> +       for (i = 0; i < rpm_count; i++)
> +               pm_runtime_put_autosuspend(gpu->dev);
>  out:
>         for (i = 0; i < acquired; i++)
>                 complete(&gpu->event_free);
>
> -       return -EBUSY;
> +       return ret;
>  }
>
>  static void event_free(struct etnaviv_gpu *gpu, unsigned int event)
> @@ -1185,6 +1197,8 @@ static void event_free(struct etnaviv_gpu *gpu, unsigned int event)
>                 clear_bit(event, gpu->event_bitmap);
>                 complete(&gpu->event_free);
>         }
> +
> +       pm_runtime_put_autosuspend(gpu->dev);
>  }
>
>  /*
> @@ -1327,15 +1341,6 @@ struct dma_fence *etnaviv_gpu_submit(struct etnaviv_gem_submit *submit)
>         unsigned int i, nr_events = 1, event[3];
>         int ret;
>
> -       if (!submit->runtime_resumed) {
> -               ret = pm_runtime_get_sync(gpu->dev);
> -               if (ret < 0) {
> -                       pm_runtime_put_noidle(gpu->dev);
> -                       return NULL;
> -               }
> -               submit->runtime_resumed = true;
> -       }
> -
>         /*
>          * if there are performance monitor requests we need to have
>          * - a sync point to re-configure gpu and process ETNA_PM_PROCESS_PRE
> --
> 2.39.2
>


-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info/privacypolicy


More information about the etnaviv mailing list