Skip to content

Commit 023adb7

Browse files
committed
drm/lima: use drm_sched for GPU scheduling
Signed-off-by: Qiang Yu
1 parent e7eb3f8 commit 023adb7

8 files changed

Lines changed: 299 additions & 261 deletions

File tree

‎drivers/gpu/drm/lima/Kconfig‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ config DRM_LIMA
33
tristate "LIMA (DRM support for ARM Mali 400/450 GPU)"
44
depends on DRM
55
depends on ARCH_SUNXI || ARCH_ROCKCHIP || ARCH_EXYNOS || ARCH_MESON
6+
select DRM_SCHED
67
help
78
DRM driver for ARM Mali 400/450 GPUs.

‎drivers/gpu/drm/lima/lima.h‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ struct lima_pp {
9191
atomic_t task;
9292
};
9393

94+
#define LIMA_MAX_PIPE 2
95+
9496
struct lima_device {
9597
struct device *dev;
9698
struct drm_device *ddev;
@@ -108,7 +110,7 @@ struct lima_device {
108110

109111
struct lima_l2_cache *l2_cache;
110112

111-
struct lima_sched_pipe *pipe[2];
113+
struct lima_sched_pipe *pipe[LIMA_MAX_PIPE];
112114

113115
struct lima_gp *gp;
114116
struct lima_pp *pp;
@@ -119,6 +121,7 @@ struct lima_device {
119121

120122
struct lima_drm_priv {
121123
struct lima_vm *vm;
124+
struct lima_sched_context context[LIMA_MAX_PIPE];
122125
};
123126

124127
struct lima_bo_va_mapping {
@@ -161,9 +164,9 @@ int lima_gem_mmap_offset(struct drm_file *file, u32 handle, u64 *offset);
161164
int lima_gem_mmap(struct file *filp, struct vm_area_struct *vma);
162165
int lima_gem_va_map(struct drm_file *file, u32 handle, u32 flags, u32 va);
163166
int lima_gem_va_unmap(struct drm_file *file, u32 handle, u32 va);
164-
int lima_gem_submit(struct drm_file *file, struct lima_sched_pipe *pipe,
165-
struct drm_lima_gem_submit_bo *bos, u32 nr_bos,
166-
void *frame, u32 *fence);
167+
int lima_gem_submit(struct drm_file *file, int pipe,
168+
struct drm_lima_gem_submit_bo *bos,
169+
u32 nr_bos, void *frame, u32 *fence);
167170
int lima_gem_wait(struct drm_file *file, u32 handle, u32 op, u64 timeout_ns);
168171
struct drm_gem_object *lima_gem_prime_import_sg_table(struct drm_device *dev,
169172
struct dma_buf_attachment *attach,

‎drivers/gpu/drm/lima/lima_drv.c‎

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ static int lima_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_
118118
break;
119119
}
120120

121-
err = lima_gem_submit(file, ldev->pipe[args->pipe], bos, args->nr_bos,
122-
frame, &args->fence);
121+
err = lima_gem_submit(file, args->pipe, bos, args->nr_bos, frame, &args->fence);
123122

124123
out1:
125124
if (err)
@@ -132,12 +131,13 @@ static int lima_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_
132131
static int lima_ioctl_wait_fence(struct drm_device *dev, void *data, struct drm_file *file)
133132
{
134133
struct drm_lima_wait_fence *args = data;
135-
struct lima_device *ldev = to_lima_dev(dev);
134+
struct lima_drm_priv *priv = file->driver_priv;
136135

137-
if (args->pipe >= ARRAY_SIZE(ldev->pipe))
136+
if (args->pipe >= ARRAY_SIZE(priv->context))
138137
return -EINVAL;
139138

140-
return lima_sched_pipe_wait_fence(ldev->pipe[args->pipe], args->fence, args->timeout_ns);
139+
return lima_sched_context_wait_fence(priv->context + args->pipe,
140+
args->fence, args->timeout_ns);
141141
}
142142

143143
static int lima_ioctl_gem_wait(struct drm_device *dev, void *data, struct drm_file *file)
@@ -152,7 +152,7 @@ static int lima_ioctl_gem_wait(struct drm_device *dev, void *data, struct drm_fi
152152

153153
static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file)
154154
{
155-
int err;
155+
int err, i;
156156
struct lima_drm_priv *priv;
157157
struct lima_device *ldev = to_lima_dev(dev);
158158

@@ -166,9 +166,19 @@ static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file)
166166
goto err_out0;
167167
}
168168

169+
for (i = 0; i < LIMA_MAX_PIPE; i++) {
170+
err = lima_sched_context_init(ldev->pipe[i], priv->context + i);
171+
if (err)
172+
goto err_out1;
173+
}
174+
169175
file->driver_priv = priv;
170176
return 0;
171177

178+
err_out1:
179+
for (i--; i >= 0; i--)
180+
lima_sched_context_fini(ldev->pipe[i], priv->context + i);
181+
lima_vm_put(priv->vm);
172182
err_out0:
173183
kfree(priv);
174184
return err;
@@ -177,6 +187,11 @@ static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file)
177187
static void lima_drm_driver_postclose(struct drm_device *dev, struct drm_file *file)
178188
{
179189
struct lima_drm_priv *priv = file->driver_priv;
190+
struct lima_device *ldev = to_lima_dev(dev);
191+
int i;
192+
193+
for (i = 0; i < LIMA_MAX_PIPE; i++)
194+
lima_sched_context_fini(ldev->pipe[i], priv->context + i);
180195

181196
lima_vm_put(priv->vm);
182197
kfree(priv);

‎drivers/gpu/drm/lima/lima_gem.c‎

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,11 @@ static int lima_gem_lock_bos(struct lima_bo **bos, u32 nr_bos,
374374
return ret;
375375
}
376376

377-
static int lima_gem_sync_bo(struct lima_sched_task *task, u64 context,
378-
struct lima_bo *bo, bool write)
377+
static int lima_gem_sync_bo(struct lima_sched_task *task, struct lima_bo *bo, bool write)
379378
{
380379
int i, err;
381380
struct dma_fence *f;
381+
u64 context = task->base.s_fence->finished.context;
382382

383383
if (write) {
384384
struct reservation_object_list *fobj =
@@ -413,9 +413,9 @@ static int lima_gem_sync_bo(struct lima_sched_task *task, u64 context,
413413
return 0;
414414
}
415415

416-
int lima_gem_submit(struct drm_file *file, struct lima_sched_pipe *pipe,
417-
struct drm_lima_gem_submit_bo *bos, u32 nr_bos,
418-
void *frame, u32 *fence)
416+
int lima_gem_submit(struct drm_file *file, int pipe,
417+
struct drm_lima_gem_submit_bo *bos,
418+
u32 nr_bos, void *frame, u32 *fence)
419419
{
420420
struct lima_bo **lbos;
421421
int i, err = 0;
@@ -442,32 +442,28 @@ int lima_gem_submit(struct drm_file *file, struct lima_sched_pipe *pipe,
442442
if (err)
443443
goto out0;
444444

445-
task = lima_sched_task_create(priv->vm, frame);
445+
task = lima_sched_task_create(priv->context + pipe, priv->vm, frame);
446446
if (IS_ERR(task)) {
447447
err = PTR_ERR(task);
448448
goto out1;
449449
}
450450

451451
for (i = 0; i < nr_bos; i++) {
452-
err = lima_gem_sync_bo(task, pipe->fence_context, lbos[i],
453-
bos[i].flags & LIMA_SUBMIT_BO_WRITE);
452+
err = lima_gem_sync_bo(task, lbos[i], bos[i].flags & LIMA_SUBMIT_BO_WRITE);
454453
if (err)
455454
goto out2;
456455
}
457456

458-
err = lima_sched_task_queue(pipe, task);
459-
if (err)
460-
goto out2;
461-
462457
for (i = 0; i < nr_bos; i++) {
463458
if (bos[i].flags & LIMA_SUBMIT_BO_WRITE)
464-
reservation_object_add_excl_fence(lbos[i]->resv, task->fence);
459+
reservation_object_add_excl_fence(
460+
lbos[i]->resv, &task->base.s_fence->finished);
465461
else
466-
reservation_object_add_shared_fence(lbos[i]->resv, task->fence);
462+
reservation_object_add_shared_fence(
463+
lbos[i]->resv, &task->base.s_fence->finished);
467464
}
468-
dma_fence_put(task->fence);
469465

470-
*fence = task->fence->seqno;
466+
*fence = lima_sched_context_queue_task(priv->context + pipe, task);
471467

472468
out2:
473469
if (err)

‎drivers/gpu/drm/lima/lima_gp.c‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,20 +106,22 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
106106
struct lima_gp *gp = data;
107107
struct lima_device *dev = gp->ip.dev;
108108
u32 state = gp_read(INT_STAT);
109+
bool task_done = false, fail = false;
109110

110111
/* for shared irq case */
111112
if (!state)
112113
return IRQ_NONE;
113114

114115
if (state & LIMA_GP_IRQ_MASK_ERROR) {
115116
u32 status = gp_read(STATUS);
117+
116118
dev_info(dev->dev, "gp error irq state=%x status=%x\n",
117119
state, status);
118-
lima_sched_pipe_task_done(&gp->pipe, true);
120+
121+
fail = true;
122+
task_done = true;
119123
}
120124
else {
121-
bool task_done = false;
122-
123125
if (state & LIMA_GP_IRQ_VS_END_CMD_LST) {
124126
gp->task &= ~LIMA_GP_TASK_VS;
125127
task_done = true;
@@ -129,12 +131,16 @@ static irqreturn_t lima_gp_irq_handler(int irq, void *data)
129131
gp->task &= ~LIMA_GP_TASK_PLBU;
130132
task_done = true;
131133
}
132-
133-
if (task_done && !gp->task)
134-
lima_sched_pipe_task_done(&gp->pipe, false);
135134
}
136135

137136
gp_write(INT_CLEAR, state);
137+
138+
if (task_done) {
139+
if (fail)
140+
lima_sched_pipe_task_done(&gp->pipe, true);
141+
else if (!gp->task)
142+
lima_sched_pipe_task_done(&gp->pipe, false);
143+
}
138144
return IRQ_HANDLED;
139145
}
140146

‎drivers/gpu/drm/lima/lima_pp.c‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,24 +89,32 @@ static irqreturn_t lima_pp_core_irq_handler(int irq, void *data)
8989
struct lima_device *dev = core->ip.dev;
9090
struct lima_pp *pp = dev->pp;
9191
u32 state = pp_read(INT_STATUS);
92+
bool task_done = false, fail = false;
9293

9394
/* for shared irq case */
9495
if (!state)
9596
return IRQ_NONE;
9697

9798
if (state & LIMA_PP_IRQ_MASK_ERROR) {
9899
u32 status = pp_read(STATUS);
100+
99101
dev_info(dev->dev, "pp error irq state=%x status=%x\n",
100102
state, status);
101-
lima_sched_pipe_task_done(&pp->pipe, true);
103+
104+
task_done = true;
105+
fail = true;
102106
}
103107
else {
104108
if ((state & LIMA_PP_IRQ_END_OF_FRAME) &&
105109
atomic_dec_and_test(&pp->task))
106-
lima_sched_pipe_task_done(&pp->pipe, false);
110+
task_done = true;
107111
}
108112

109113
pp_write(INT_CLEAR, state);
114+
115+
if (task_done)
116+
lima_sched_pipe_task_done(&pp->pipe, fail);
117+
110118
return IRQ_HANDLED;
111119
}
112120

0 commit comments

Comments
 (0)