El jue, 23-11-2023 a las 21:47 -0300, Maíra Canal escribió: > From: Melissa Wen <mwen@xxxxxxxxxx> > > 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@xxxxxxxxxx> > Co-developed-by: Maíra Canal <mcanal@xxxxxxxxxx> > Signed-off-by: Maíra Canal <mcanal@xxxxxxxxxx> > --- > (...) > 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; > +}