Commit f66c57d9 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/fifo: initialise vmm with new interfaces

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 85f7c3a0
...@@ -22,7 +22,7 @@ struct nvkm_fifo_chan { ...@@ -22,7 +22,7 @@ struct nvkm_fifo_chan {
u16 chid; u16 chid;
struct nvkm_gpuobj *inst; struct nvkm_gpuobj *inst;
struct nvkm_gpuobj *push; struct nvkm_gpuobj *push;
struct nvkm_vm *vm; struct nvkm_vmm *vmm;
void __iomem *user; void __iomem *user;
u64 addr; u64 addr;
u32 size; u32 size;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <core/gpuobj.h> #include <core/gpuobj.h>
#include <core/oproxy.h> #include <core/oproxy.h>
#include <subdev/mmu.h> #include <subdev/mmu.h>
#include <subdev/mmu/priv.h>
#include <engine/dma.h> #include <engine/dma.h>
struct nvkm_fifo_chan_object { struct nvkm_fifo_chan_object {
...@@ -117,8 +118,8 @@ nvkm_fifo_chan_child_del(struct nvkm_oproxy *base) ...@@ -117,8 +118,8 @@ nvkm_fifo_chan_child_del(struct nvkm_oproxy *base)
if (chan->func->engine_dtor) if (chan->func->engine_dtor)
chan->func->engine_dtor(chan, engine); chan->func->engine_dtor(chan, engine);
nvkm_object_del(&engn->object); nvkm_object_del(&engn->object);
if (chan->vm) if (chan->vmm)
atomic_dec(&chan->vm->engref[engine->subdev.index]); atomic_dec(&chan->vmm->engref[engine->subdev.index]);
} }
} }
...@@ -151,8 +152,8 @@ nvkm_fifo_chan_child_new(const struct nvkm_oclass *oclass, void *data, u32 size, ...@@ -151,8 +152,8 @@ nvkm_fifo_chan_child_new(const struct nvkm_oclass *oclass, void *data, u32 size,
.engine = oclass->engine, .engine = oclass->engine,
}; };
if (chan->vm) if (chan->vmm)
atomic_inc(&chan->vm->engref[engine->subdev.index]); atomic_inc(&chan->vmm->engref[engine->subdev.index]);
if (engine->func->fifo.cclass) { if (engine->func->fifo.cclass) {
ret = engine->func->fifo.cclass(chan, &cclass, ret = engine->func->fifo.cclass(chan, &cclass,
...@@ -327,7 +328,10 @@ nvkm_fifo_chan_dtor(struct nvkm_object *object) ...@@ -327,7 +328,10 @@ nvkm_fifo_chan_dtor(struct nvkm_object *object)
if (chan->user) if (chan->user)
iounmap(chan->user); iounmap(chan->user);
nvkm_vm_ref(NULL, &chan->vm, NULL); if (chan->vmm) {
nvkm_vmm_part(chan->vmm, chan->inst->memory);
nvkm_vmm_unref(&chan->vmm);
}
nvkm_gpuobj_del(&chan->push); nvkm_gpuobj_del(&chan->push);
nvkm_gpuobj_del(&chan->inst); nvkm_gpuobj_del(&chan->inst);
...@@ -355,7 +359,6 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *func, ...@@ -355,7 +359,6 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *func,
{ {
struct nvkm_client *client = oclass->client; struct nvkm_client *client = oclass->client;
struct nvkm_device *device = fifo->engine.subdev.device; struct nvkm_device *device = fifo->engine.subdev.device;
struct nvkm_mmu *mmu = device->mmu;
struct nvkm_dmaobj *dmaobj; struct nvkm_dmaobj *dmaobj;
unsigned long flags; unsigned long flags;
int ret; int ret;
...@@ -384,16 +387,16 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *func, ...@@ -384,16 +387,16 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *func,
} }
/* channel address space */ /* channel address space */
if (!vm && mmu) { if (!device->mmu->func->vmm.global) {
if (!client->vm || client->vm->mmu == mmu) { struct nvkm_vmm *vmm = client->vm;
ret = nvkm_vm_ref(client->vm, &chan->vm, NULL); if (vmm->mmu != device->mmu)
return -EINVAL;
ret = nvkm_vmm_join(vmm, chan->inst->memory);
if (ret) if (ret)
return ret; return ret;
} else {
return -EINVAL; chan->vmm = nvkm_vmm_ref(vmm);
}
} else {
return -ENOENT;
} }
/* allocate channel id */ /* allocate channel id */
......
...@@ -277,9 +277,5 @@ g84_fifo_chan_ctor(struct nv50_fifo *fifo, u64 vm, u64 push, ...@@ -277,9 +277,5 @@ g84_fifo_chan_ctor(struct nv50_fifo *fifo, u64 vm, u64 push,
if (ret) if (ret)
return ret; return ret;
ret = nvkm_ramht_new(device, 0x8000, 16, chan->base.inst, &chan->ramht); return nvkm_ramht_new(device, 0x8000, 16, chan->base.inst, &chan->ramht);
if (ret)
return ret;
return nvkm_vm_ref(chan->base.vm, &chan->vm, chan->base.inst->memory);
} }
...@@ -11,8 +11,6 @@ struct gf100_fifo_chan { ...@@ -11,8 +11,6 @@ struct gf100_fifo_chan {
struct list_head head; struct list_head head;
bool killed; bool killed;
struct nvkm_vm *vm;
struct { struct {
struct nvkm_gpuobj *inst; struct nvkm_gpuobj *inst;
struct nvkm_vma vma; struct nvkm_vma vma;
......
...@@ -12,8 +12,6 @@ struct gk104_fifo_chan { ...@@ -12,8 +12,6 @@ struct gk104_fifo_chan {
struct list_head head; struct list_head head;
bool killed; bool killed;
struct nvkm_vm *vm;
struct { struct {
struct nvkm_gpuobj *inst; struct nvkm_gpuobj *inst;
struct nvkm_vma vma; struct nvkm_vma vma;
......
...@@ -206,8 +206,6 @@ void * ...@@ -206,8 +206,6 @@ void *
nv50_fifo_chan_dtor(struct nvkm_fifo_chan *base) nv50_fifo_chan_dtor(struct nvkm_fifo_chan *base)
{ {
struct nv50_fifo_chan *chan = nv50_fifo_chan(base); struct nv50_fifo_chan *chan = nv50_fifo_chan(base);
if (chan->base.inst)
nvkm_vm_ref(NULL, &chan->vm, chan->base.inst->memory);
nvkm_ramht_del(&chan->ramht); nvkm_ramht_del(&chan->ramht);
nvkm_gpuobj_del(&chan->pgd); nvkm_gpuobj_del(&chan->pgd);
nvkm_gpuobj_del(&chan->eng); nvkm_gpuobj_del(&chan->eng);
...@@ -263,9 +261,5 @@ nv50_fifo_chan_ctor(struct nv50_fifo *fifo, u64 vm, u64 push, ...@@ -263,9 +261,5 @@ nv50_fifo_chan_ctor(struct nv50_fifo *fifo, u64 vm, u64 push,
if (ret) if (ret)
return ret; return ret;
ret = nvkm_ramht_new(device, 0x8000, 16, chan->base.inst, &chan->ramht); return nvkm_ramht_new(device, 0x8000, 16, chan->base.inst, &chan->ramht);
if (ret)
return ret;
return nvkm_vm_ref(chan->base.vm, &chan->vm, chan->base.inst->memory);
} }
...@@ -13,7 +13,6 @@ struct nv50_fifo_chan { ...@@ -13,7 +13,6 @@ struct nv50_fifo_chan {
struct nvkm_gpuobj *eng; struct nvkm_gpuobj *eng;
struct nvkm_gpuobj *pgd; struct nvkm_gpuobj *pgd;
struct nvkm_ramht *ramht; struct nvkm_ramht *ramht;
struct nvkm_vm *vm;
struct nvkm_gpuobj *engn[NVKM_SUBDEV_NR]; struct nvkm_gpuobj *engn[NVKM_SUBDEV_NR];
}; };
......
...@@ -150,12 +150,12 @@ gf100_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *base, ...@@ -150,12 +150,12 @@ gf100_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *base,
if (ret) if (ret)
return ret; return ret;
ret = nvkm_vm_get(chan->vm, chan->engn[engn].inst->size, 12, ret = nvkm_vm_get(chan->base.vmm, chan->engn[engn].inst->size, 12,
NV_MEM_ACCESS_RW, &chan->engn[engn].vma); NV_MEM_ACCESS_RW, &chan->engn[engn].vma);
if (ret) if (ret)
return ret; return ret;
return nvkm_memory_map(chan->engn[engn].inst, 0, chan->vm, return nvkm_memory_map(chan->engn[engn].inst, 0, chan->base.vmm,
&chan->engn[engn].vma, NULL, 0); &chan->engn[engn].vma, NULL, 0);
} }
...@@ -199,10 +199,7 @@ gf100_fifo_gpfifo_init(struct nvkm_fifo_chan *base) ...@@ -199,10 +199,7 @@ gf100_fifo_gpfifo_init(struct nvkm_fifo_chan *base)
static void * static void *
gf100_fifo_gpfifo_dtor(struct nvkm_fifo_chan *base) gf100_fifo_gpfifo_dtor(struct nvkm_fifo_chan *base)
{ {
struct gf100_fifo_chan *chan = gf100_fifo_chan(base); return gf100_fifo_chan(base);
if (chan->base.inst)
nvkm_vm_ref(NULL, &chan->vm, chan->base.inst->memory);
return chan;
} }
static const struct nvkm_fifo_chan_func static const struct nvkm_fifo_chan_func
...@@ -262,10 +259,6 @@ gf100_fifo_gpfifo_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass, ...@@ -262,10 +259,6 @@ gf100_fifo_gpfifo_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
args->v0.chid = chan->base.chid; args->v0.chid = chan->base.chid;
ret = nvkm_vm_ref(chan->base.vm, &chan->vm, chan->base.inst->memory);
if (ret)
return ret;
/* clear channel control registers */ /* clear channel control registers */
usermem = chan->base.chid * 0x1000; usermem = chan->base.chid * 0x1000;
......
...@@ -162,12 +162,12 @@ gk104_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *base, ...@@ -162,12 +162,12 @@ gk104_fifo_gpfifo_engine_ctor(struct nvkm_fifo_chan *base,
if (ret) if (ret)
return ret; return ret;
ret = nvkm_vm_get(chan->vm, chan->engn[engn].inst->size, 12, ret = nvkm_vm_get(chan->base.vmm, chan->engn[engn].inst->size, 12,
NV_MEM_ACCESS_RW, &chan->engn[engn].vma); NV_MEM_ACCESS_RW, &chan->engn[engn].vma);
if (ret) if (ret)
return ret; return ret;
return nvkm_memory_map(chan->engn[engn].inst, 0, chan->vm, return nvkm_memory_map(chan->engn[engn].inst, 0, chan->base.vmm,
&chan->engn[engn].vma, NULL, 0); &chan->engn[engn].vma, NULL, 0);
} }
...@@ -212,10 +212,7 @@ gk104_fifo_gpfifo_init(struct nvkm_fifo_chan *base) ...@@ -212,10 +212,7 @@ gk104_fifo_gpfifo_init(struct nvkm_fifo_chan *base)
static void * static void *
gk104_fifo_gpfifo_dtor(struct nvkm_fifo_chan *base) gk104_fifo_gpfifo_dtor(struct nvkm_fifo_chan *base)
{ {
struct gk104_fifo_chan *chan = gk104_fifo_chan(base); return gk104_fifo_chan(base);
if (chan->base.inst)
nvkm_vm_ref(NULL, &chan->vm, chan->base.inst->memory);
return chan;
} }
static const struct nvkm_fifo_chan_func static const struct nvkm_fifo_chan_func
...@@ -301,10 +298,6 @@ gk104_fifo_gpfifo_new_(const struct gk104_fifo_chan_func *func, ...@@ -301,10 +298,6 @@ gk104_fifo_gpfifo_new_(const struct gk104_fifo_chan_func *func,
*chid = chan->base.chid; *chid = chan->base.chid;
ret = nvkm_vm_ref(chan->base.vm, &chan->vm, chan->base.inst->memory);
if (ret)
return ret;
/* Clear channel control registers. */ /* Clear channel control registers. */
usermem = chan->base.chid * 0x200; usermem = chan->base.chid * 0x200;
ilength = order_base_2(ilength / 8); ilength = order_base_2(ilength / 8);
......
...@@ -398,12 +398,12 @@ gf100_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch, ...@@ -398,12 +398,12 @@ gf100_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch,
if (ret) if (ret)
return ret; return ret;
ret = nvkm_vm_get(fifoch->vm, 0x1000, 12, NV_MEM_ACCESS_RW | ret = nvkm_vm_get(fifoch->vmm, 0x1000, 12, NV_MEM_ACCESS_RW |
NV_MEM_ACCESS_SYS, &chan->mmio_vma); NV_MEM_ACCESS_SYS, &chan->mmio_vma);
if (ret) if (ret)
return ret; return ret;
ret = nvkm_memory_map(chan->mmio, 0, fifoch->vm, ret = nvkm_memory_map(chan->mmio, 0, fifoch->vmm,
&chan->mmio_vma, NULL, 0); &chan->mmio_vma, NULL, 0);
if (ret) if (ret)
return ret; return ret;
...@@ -416,13 +416,13 @@ gf100_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch, ...@@ -416,13 +416,13 @@ gf100_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch,
if (ret) if (ret)
return ret; return ret;
ret = nvkm_vm_get(fifoch->vm, ret = nvkm_vm_get(fifoch->vmm,
nvkm_memory_size(chan->data[i].mem), 12, nvkm_memory_size(chan->data[i].mem), 12,
data->access, &chan->data[i].vma); data->access, &chan->data[i].vma);
if (ret) if (ret)
return ret; return ret;
ret = nvkm_memory_map(chan->data[i].mem, 0, fifoch->vm, ret = nvkm_memory_map(chan->data[i].mem, 0, fifoch->vmm,
&chan->data[i].vma, NULL, 0); &chan->data[i].vma, NULL, 0);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment