Skip to content

Commit 616c5b6

Browse files
larunbestevenprice-arm
authored andcommitted
drm/panfrost: Handle job HW submit errors
Avoid waiting for the DRM scheduler job timedout handler, and instead, let the DRM scheduler core signal the error fence immediately when HW job submission fails. That means we must also decrement the runtime-PM refcnt for the device, because the job will never be enqueued or inflight. Reviewed-by: Steven Price <steven.price@arm.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com> Link: https://lore.kernel.org/r/20251019145225.3621989-4-adrian.larumbe@collabora.com Signed-off-by: Steven Price <steven.price@arm.com>
1 parent 16dd7e0 commit 616c5b6

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

drivers/gpu/drm/panfrost/panfrost_job.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,26 +200,27 @@ panfrost_enqueue_job(struct panfrost_device *pfdev, int slot,
200200
return 1;
201201
}
202202

203-
static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
203+
static int panfrost_job_hw_submit(struct panfrost_job *job, int js)
204204
{
205205
struct panfrost_device *pfdev = job->pfdev;
206206
unsigned int subslot;
207207
u32 cfg;
208208
u64 jc_head = job->jc;
209209
int ret;
210210

211-
panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
212-
213211
ret = pm_runtime_get_sync(pfdev->base.dev);
214212
if (ret < 0)
215-
return;
213+
goto err_hwsubmit;
216214

217215
if (WARN_ON(job_read(pfdev, JS_COMMAND_NEXT(js)))) {
218-
return;
216+
ret = -EINVAL;
217+
goto err_hwsubmit;
219218
}
220219

221220
cfg = panfrost_mmu_as_get(pfdev, job->mmu);
222221

222+
panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
223+
223224
job_write(pfdev, JS_HEAD_NEXT_LO(js), lower_32_bits(jc_head));
224225
job_write(pfdev, JS_HEAD_NEXT_HI(js), upper_32_bits(jc_head));
225226

@@ -266,6 +267,12 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
266267
job, js, subslot, jc_head, cfg & 0xf);
267268
}
268269
spin_unlock(&pfdev->js->job_lock);
270+
271+
return 0;
272+
273+
err_hwsubmit:
274+
pm_runtime_put_autosuspend(pfdev->base.dev);
275+
return ret;
269276
}
270277

271278
static int panfrost_acquire_object_fences(struct drm_gem_object **bos,
@@ -388,6 +395,7 @@ static struct dma_fence *panfrost_job_run(struct drm_sched_job *sched_job)
388395
struct panfrost_device *pfdev = job->pfdev;
389396
int slot = panfrost_job_get_slot(job);
390397
struct dma_fence *fence = NULL;
398+
int ret;
391399

392400
if (job->ctx->destroyed)
393401
return ERR_PTR(-ECANCELED);
@@ -409,7 +417,11 @@ static struct dma_fence *panfrost_job_run(struct drm_sched_job *sched_job)
409417
dma_fence_put(job->done_fence);
410418
job->done_fence = dma_fence_get(fence);
411419

412-
panfrost_job_hw_submit(job, slot);
420+
ret = panfrost_job_hw_submit(job, slot);
421+
if (ret) {
422+
dma_fence_put(fence);
423+
return ERR_PTR(ret);
424+
}
413425

414426
return fence;
415427
}

0 commit comments

Comments
 (0)