Skip to content

Commit da1fbcc

Browse files
Ben Skeggsairlied
authored andcommitted
drm/nouveau/fifo/tu102-: prepare for GSP-RM
- (temporarily) disable if GSP-RM detected, will be added later - add dtor() so GSP-RM paths can cleanup properly - add alternate engine context mapping interface for RM engines - add alternate chid interfaces to handle RM USERD oddities Signed-off-by: Ben Skeggs <[email protected]> Signed-off-by: Dave Airlie <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 8c186c8 commit da1fbcc

File tree

10 files changed

+67
-22
lines changed

10 files changed

+67
-22
lines changed

drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ struct nvkm_fifo {
6666
struct {
6767
struct nvkm_memory *mem;
6868
struct nvkm_vma *bar1;
69+
70+
struct mutex mutex;
71+
struct list_head list;
6972
} userd;
7073

7174
spinlock_t lock;

drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,14 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
347347
nvkm_chid_unref(&fifo->cgid);
348348
nvkm_chid_unref(&fifo->chid);
349349

350+
mutex_destroy(&fifo->userd.mutex);
351+
350352
nvkm_event_fini(&fifo->nonstall.event);
351353
mutex_destroy(&fifo->mutex);
354+
355+
if (fifo->func->dtor)
356+
fifo->func->dtor(fifo);
357+
352358
return fifo;
353359
}
354360

@@ -383,5 +389,8 @@ nvkm_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
383389
spin_lock_init(&fifo->lock);
384390
mutex_init(&fifo->mutex);
385391

392+
INIT_LIST_HEAD(&fifo->userd.list);
393+
mutex_init(&fifo->userd.mutex);
394+
386395
return nvkm_engine_ctor(&nvkm_fifo, device, type, inst, true, &fifo->engine);
387396
}

drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ nvkm_cgrp_vctx_get(struct nvkm_cgrp *cgrp, struct nvkm_engn *engn, struct nvkm_c
156156
atomic_inc(&vctx->vmm->engref[engn->engine->subdev.type]);
157157

158158
/* Allocate the HW structures. */
159+
if (engn->func->ctor2) {
160+
ret = engn->func->ctor2(engn, vctx, chan);
161+
} else
159162
if (engn->func->bind) {
160163
ret = nvkm_object_bind(vctx->ectx->object, NULL, 0, &vctx->inst);
161164
if (ret == 0 && engn->func->ctor)

drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,17 @@ nvkm_chan_del(struct nvkm_chan **pchan)
275275
nvkm_gpuobj_del(&chan->cache);
276276
nvkm_gpuobj_del(&chan->ramfc);
277277

278-
nvkm_memory_unref(&chan->userd.mem);
279-
280278
if (chan->cgrp) {
281-
nvkm_chid_put(chan->cgrp->runl->chid, chan->id, &chan->cgrp->lock);
279+
if (!chan->func->id_put)
280+
nvkm_chid_put(chan->cgrp->runl->chid, chan->id, &chan->cgrp->lock);
281+
else
282+
chan->func->id_put(chan);
283+
282284
nvkm_cgrp_unref(&chan->cgrp);
283285
}
284286

287+
nvkm_memory_unref(&chan->userd.mem);
288+
285289
if (chan->vmm) {
286290
nvkm_vmm_part(chan->vmm, chan->inst->memory);
287291
nvkm_vmm_unref(&chan->vmm);
@@ -438,7 +442,32 @@ nvkm_chan_new_(const struct nvkm_chan_func *func, struct nvkm_runl *runl, int ru
438442
}
439443

440444
/* Allocate channel ID. */
441-
chan->id = nvkm_chid_get(runl->chid, chan);
445+
if (!chan->func->id_get) {
446+
chan->id = nvkm_chid_get(runl->chid, chan);
447+
if (chan->id >= 0) {
448+
if (func->userd->bar < 0) {
449+
if (ouserd + chan->func->userd->size >=
450+
nvkm_memory_size(userd)) {
451+
RUNL_DEBUG(runl, "ouserd %llx", ouserd);
452+
return -EINVAL;
453+
}
454+
455+
ret = nvkm_memory_kmap(userd, &chan->userd.mem);
456+
if (ret) {
457+
RUNL_DEBUG(runl, "userd %d", ret);
458+
return ret;
459+
}
460+
461+
chan->userd.base = ouserd;
462+
} else {
463+
chan->userd.mem = nvkm_memory_ref(fifo->userd.mem);
464+
chan->userd.base = chan->id * chan->func->userd->size;
465+
}
466+
}
467+
} else {
468+
chan->id = chan->func->id_get(chan, userd, ouserd);
469+
}
470+
442471
if (chan->id < 0) {
443472
RUNL_ERROR(runl, "!chids");
444473
return -ENOSPC;
@@ -448,24 +477,6 @@ nvkm_chan_new_(const struct nvkm_chan_func *func, struct nvkm_runl *runl, int ru
448477
cgrp->id = chan->id;
449478

450479
/* Initialise USERD. */
451-
if (func->userd->bar < 0) {
452-
if (ouserd + chan->func->userd->size >= nvkm_memory_size(userd)) {
453-
RUNL_DEBUG(runl, "ouserd %llx", ouserd);
454-
return -EINVAL;
455-
}
456-
457-
ret = nvkm_memory_kmap(userd, &chan->userd.mem);
458-
if (ret) {
459-
RUNL_DEBUG(runl, "userd %d", ret);
460-
return ret;
461-
}
462-
463-
chan->userd.base = ouserd;
464-
} else {
465-
chan->userd.mem = nvkm_memory_ref(fifo->userd.mem);
466-
chan->userd.base = chan->id * chan->func->userd->size;
467-
}
468-
469480
if (chan->func->userd->clear)
470481
chan->func->userd->clear(chan);
471482

drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ struct nvkm_cctx {
1717
};
1818

1919
struct nvkm_chan_func {
20+
int (*id_get)(struct nvkm_chan *, struct nvkm_memory *userd, u64 ouserd);
21+
void (*id_put)(struct nvkm_chan *);
22+
2023
const struct nvkm_chan_func_inst {
2124
u32 size;
2225
bool zero;

drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga100.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "runq.h"
2828

2929
#include <core/gpuobj.h>
30+
#include <subdev/gsp.h>
3031
#include <subdev/top.h>
3132
#include <subdev/vfn.h>
3233

@@ -607,5 +608,8 @@ int
607608
ga100_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
608609
struct nvkm_fifo **pfifo)
609610
{
611+
if (nvkm_gsp_rm(device->gsp))
612+
return -ENODEV;
613+
610614
return nvkm_fifo_new_(&ga100_fifo, device, type, inst, pfifo);
611615
}

drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga102.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
*/
2222
#include "priv.h"
2323

24+
#include <subdev/gsp.h>
25+
2426
#include <nvif/class.h>
2527

2628
static const struct nvkm_fifo_func
@@ -41,5 +43,8 @@ int
4143
ga102_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
4244
struct nvkm_fifo **pfifo)
4345
{
46+
if (nvkm_gsp_rm(device->gsp))
47+
return -ENODEV;
48+
4449
return nvkm_fifo_new_(&ga102_fifo, device, type, inst, pfifo);
4550
}

drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ struct nvkm_runq;
1313
struct nvkm_vctx;
1414

1515
struct nvkm_fifo_func {
16+
void (*dtor)(struct nvkm_fifo *);
17+
1618
int (*chid_nr)(struct nvkm_fifo *);
1719
int (*chid_ctor)(struct nvkm_fifo *, int nr);
1820
int (*runq_nr)(struct nvkm_fifo *);

drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct nvkm_engn {
1818
bool (*mmu_fault_triggered)(struct nvkm_engn *);
1919
int (*ctor)(struct nvkm_engn *, struct nvkm_vctx *);
2020
void (*bind)(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *);
21+
int (*ctor2)(struct nvkm_engn *, struct nvkm_vctx *, struct nvkm_chan *);
2122
int (*ramht_add)(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *);
2223
void (*ramht_del)(struct nvkm_chan *, int hash);
2324
} *func;

drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "runl.h"
2626

2727
#include <core/memory.h>
28+
#include <subdev/gsp.h>
2829
#include <subdev/mc.h>
2930
#include <subdev/vfn.h>
3031

@@ -282,5 +283,8 @@ int
282283
tu102_fifo_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
283284
struct nvkm_fifo **pfifo)
284285
{
286+
if (nvkm_gsp_rm(device->gsp))
287+
return -ENODEV;
288+
285289
return nvkm_fifo_new_(&tu102_fifo, device, type, inst, pfifo);
286290
}

0 commit comments

Comments
 (0)