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

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

drm/nouveau/mmu: directly use instmem for page tables



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent d8e83994
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ void nvkm_gpuobj_destroy(struct nvkm_gpuobj *);

int  nvkm_gpuobj_new(struct nvkm_object *, struct nvkm_object *, u32 size,
		     u32 align, u32 flags, struct nvkm_gpuobj **);
int  nvkm_gpuobj_dup(struct nvkm_object *, struct nvkm_gpuobj *,
int  nvkm_gpuobj_dup(struct nvkm_object *, struct nvkm_memory *,
		     struct nvkm_gpuobj **);
int  nvkm_gpuobj_map(struct nvkm_gpuobj *, u32 acc, struct nvkm_vma *);
int  nvkm_gpuobj_map_vm(struct nvkm_gpuobj *, struct nvkm_vm *, u32 access,
+6 −5
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ struct nvkm_device;
struct nvkm_mem;

struct nvkm_vm_pgt {
	struct nvkm_gpuobj *obj[2];
	struct nvkm_memory *mem[2];
	u32 refcount[2];
};

@@ -53,13 +53,14 @@ struct nvkm_mmu {
		       struct nvkm_vm **);

	void (*map_pgt)(struct nvkm_gpuobj *pgd, u32 pde,
			struct nvkm_gpuobj *pgt[2]);
	void (*map)(struct nvkm_vma *, struct nvkm_gpuobj *,
			struct nvkm_memory *pgt[2]);
	void (*map)(struct nvkm_vma *, struct nvkm_memory *,
		    struct nvkm_mem *, u32 pte, u32 cnt,
		    u64 phys, u64 delta);
	void (*map_sg)(struct nvkm_vma *, struct nvkm_gpuobj *,
	void (*map_sg)(struct nvkm_vma *, struct nvkm_memory *,
		       struct nvkm_mem *, u32 pte, u32 cnt, dma_addr_t *);
	void (*unmap)(struct nvkm_gpuobj *pgt, u32 pte, u32 cnt);
	void (*unmap)(struct nvkm_vma *, struct nvkm_memory *pgt,
		      u32 pte, u32 cnt);
	void (*flush)(struct nvkm_vm *);
};

+3 −5
Original line number Diff line number Diff line
@@ -308,7 +308,6 @@ static void
nvkm_gpudup_dtor(struct nvkm_object *object)
{
	struct nvkm_gpuobj *gpuobj = (void *)object;
	nvkm_object_ref(NULL, (struct nvkm_object **)&gpuobj->parent);
	nvkm_object_destroy(&gpuobj->object);
}

@@ -323,7 +322,7 @@ nvkm_gpudup_oclass = {
};

int
nvkm_gpuobj_dup(struct nvkm_object *parent, struct nvkm_gpuobj *base,
nvkm_gpuobj_dup(struct nvkm_object *parent, struct nvkm_memory *base,
		struct nvkm_gpuobj **pgpuobj)
{
	struct nvkm_gpuobj *gpuobj;
@@ -335,8 +334,7 @@ nvkm_gpuobj_dup(struct nvkm_object *parent, struct nvkm_gpuobj *base,
	if (ret)
		return ret;

	nvkm_object_ref(nv_object(base), (struct nvkm_object **)&gpuobj->parent);
	gpuobj->addr = base->addr;
	gpuobj->size = base->size;
	gpuobj->addr = nvkm_memory_addr(base);
	gpuobj->size = nvkm_memory_size(base);
	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ nv04_dmaobj_bind(struct nvkm_dmaobj *obj, struct nvkm_object *parent,

	if (dmaobj->clone) {
		struct nv04_mmu *mmu = nv04_mmu(dmaobj);
		struct nvkm_gpuobj *pgt = mmu->vm->pgt[0].obj[0];
		struct nvkm_memory *pgt = mmu->vm->pgt[0].mem[0];
		if (!dmaobj->base.start)
			return nvkm_gpuobj_dup(parent, pgt, pgpuobj);
		nvkm_kmap(pgt);
+1 −1
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ gf100_bar_dtor(struct nvkm_object *object)
	nvkm_gpuobj_ref(NULL, &bar->bar[1].mem);

	if (bar->bar[0].vm) {
		nvkm_gpuobj_ref(NULL, &bar->bar[0].vm->pgt[0].obj[0]);
		nvkm_memory_del(&bar->bar[0].vm->pgt[0].mem[0]);
		nvkm_vm_ref(NULL, &bar->bar[0].vm, bar->bar[0].pgd);
	}
	nvkm_gpuobj_ref(NULL, &bar->bar[0].pgd);
Loading