[PATCH v2 07/17] drm/v3d: Add a CPU job submission

Iago Toral itoral at igalia.com
Mon Nov 27 08:59:06 UTC 2023


El jue, 23-11-2023 a las 21:47 -0300, Maíra Canal escribió:
> From: Melissa Wen <mwen at igalia.com>
> 
> Create a new type of job, a CPU job. A CPU job is a type of job that
> performs operations that requires CPU intervention. The overall idea
> is
> to use user extensions to enable different types of CPU job, allowing
> the
> CPU job to perform different operations according to the type of user
> externsion. The user extension ID identify the type of CPU job that
> must
> be dealt.
> 
> Having a CPU job is interesting for synchronization purposes as a CPU
> job has a queue like any other V3D job and can be synchoronized by
> the
> multisync extension.
> 
> Signed-off-by: Melissa Wen <mwen at igalia.com>
> Co-developed-by: Maíra Canal <mcanal at igalia.com>
> Signed-off-by: Maíra Canal <mcanal at igalia.com>
> ---
> 
(...)

> diff --git a/drivers/gpu/drm/v3d/v3d_sched.c
> b/drivers/gpu/drm/v3d/v3d_sched.c
> index fccbea2a5f2e..a32c91b94898 100644
> --- a/drivers/gpu/drm/v3d/v3d_sched.c
> +++ b/drivers/gpu/drm/v3d/v3d_sched.c
> @@ -55,6 +55,12 @@ to_csd_job(struct drm_sched_job *sched_job)
>         return container_of(sched_job, struct v3d_csd_job,
> base.base);
>  }
>  
> +static struct v3d_cpu_job *
> +to_cpu_job(struct drm_sched_job *sched_job)
> +{
> +       return container_of(sched_job, struct v3d_cpu_job,
> base.base);
> +}
> +
>  static void
>  v3d_sched_job_free(struct drm_sched_job *sched_job)
>  {
> @@ -262,6 +268,42 @@ v3d_csd_job_run(struct drm_sched_job *sched_job)
>         return fence;
>  }
>  
> +static struct dma_fence *
> +v3d_cpu_job_run(struct drm_sched_job *sched_job)
> +{
> +       struct v3d_cpu_job *job = to_cpu_job(sched_job);
> +       struct v3d_dev *v3d = job->base.v3d;
> +       struct v3d_file_priv *file = job->base.file->driver_priv;
> +       u64 runtime;
> +
> +       void (*v3d_cpu_job_fn[])(struct v3d_cpu_job *job) = { };

Shouldn't this be a static const? Also, maybe we want declare it
outside the function itself?

Iago

> +
> +       v3d->cpu_job = job;
> +
> +       if (job->job_type >= ARRAY_SIZE(v3d_cpu_job_fn)) {
> +               DRM_DEBUG_DRIVER("Unknown CPU job: %d\n", job-
> >job_type);
> +               return NULL;
> +       }
> +
> +       file->start_ns[V3D_CPU] = local_clock();
> +       v3d->queue[V3D_CPU].start_ns = file->start_ns[V3D_CPU];
> +
> +       v3d_cpu_job_fn[job->job_type](job);
> +
> +       runtime = local_clock() - file->start_ns[V3D_CPU];
> +
> +       file->enabled_ns[V3D_CPU] += runtime;
> +       v3d->queue[V3D_CPU].enabled_ns += runtime;
> +
> +       file->jobs_sent[V3D_CPU]++;
> +       v3d->queue[V3D_CPU].jobs_sent++;
> +
> +       file->start_ns[V3D_CPU] = 0;
> +       v3d->queue[V3D_CPU].start_ns = 0;
> +
> +       return NULL;
> +}


More information about the dri-devel mailing list