Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f66c57d9 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fifo: initialise vmm with new interfaces



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 85f7c3a0
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;
+18 −15
Original line number Original line Diff line number Diff line
@@ -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)
		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,
			.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)
	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,
{
{
	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,
	}
	}


	/* 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 */
+1 −5
Original line number Original line Diff line number Diff line
@@ -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);
}
}
+0 −2
Original line number Original line Diff line number Diff line
@@ -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;
+0 −2
Original line number Original line Diff line number Diff line
@@ -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;
Loading