[PATCH 082/156] drm/nouveau/nvif: rework mmu "kind" api
Ben Skeggs
bskeggs at nvidia.com
Tue Apr 16 23:38:48 UTC 2024
- transition from "ioctl" interface
Signed-off-by: Ben Skeggs <bskeggs at nvidia.com>
---
.../gpu/drm/nouveau/include/nvif/driverif.h | 3 ++
drivers/gpu/drm/nouveau/include/nvif/if0008.h | 12 -----
drivers/gpu/drm/nouveau/include/nvif/mmu.h | 6 +--
drivers/gpu/drm/nouveau/nouveau_bo.c | 4 +-
drivers/gpu/drm/nouveau/nouveau_mem.c | 4 +-
drivers/gpu/drm/nouveau/nvif/mmu.c | 31 -----------
.../gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c | 53 ++-----------------
7 files changed, 13 insertions(+), 100 deletions(-)
delete mode 100644 drivers/gpu/drm/nouveau/include/nvif/if0008.h
diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index fa08478cc38f..f387ec622a45 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -83,6 +83,7 @@ struct nvif_mmu_impl {
u8 heap_nr;
u8 type_nr;
+ u8 kind_inv;
u16 kind_nr;
struct {
@@ -102,6 +103,8 @@ struct nvif_mmu_impl {
u8 heap;
} type[16];
+ const u8 *kind;
+
struct {
s32 oclass;
} mem;
diff --git a/drivers/gpu/drm/nouveau/include/nvif/if0008.h b/drivers/gpu/drm/nouveau/include/nvif/if0008.h
deleted file mode 100644
index 0413e7e4ca0c..000000000000
--- a/drivers/gpu/drm/nouveau/include/nvif/if0008.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __NVIF_IF0008_H__
-#define __NVIF_IF0008_H__
-
-#define NVIF_MMU_V0_KIND 0x02
-
-struct nvif_mmu_kind_v0 {
- __u8 version;
- __u8 kind_inv;
- __u16 count;
- __u8 data[];
-};
-#endif
diff --git a/drivers/gpu/drm/nouveau/include/nvif/mmu.h b/drivers/gpu/drm/nouveau/include/nvif/mmu.h
index 203328a2d611..f1e51a5544da 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/mmu.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/mmu.h
@@ -8,10 +8,6 @@ struct nvif_mmu {
const struct nvif_mmu_impl *impl;
struct nvif_mmu_priv *priv;
struct nvif_object object;
- u8 kind_inv;
- u16 kind_nr;
-
- u8 *kind;
};
int nvif_mmu_ctor(struct nvif_device *, const char *name, struct nvif_mmu *);
@@ -21,7 +17,7 @@ static inline bool
nvif_mmu_kind_valid(struct nvif_mmu *mmu, u8 kind)
{
if (kind) {
- if (kind >= mmu->kind_nr || mmu->kind[kind] == mmu->kind_inv)
+ if (kind >= mmu->impl->kind_nr || mmu->impl->kind[kind] == mmu->impl->kind_inv)
return false;
}
return true;
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 08d522aaae38..0d946e31bccd 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -250,7 +250,7 @@ nouveau_bo_alloc(struct nouveau_cli *cli, u64 *size, int *align, u32 domain,
return ERR_PTR(-EINVAL);
}
- nvbo->comp = mmu->kind[nvbo->kind] != nvbo->kind;
+ nvbo->comp = mmu->impl->kind[nvbo->kind] != nvbo->kind;
} else if (cli->device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
nvbo->kind = (tile_flags & 0x00007f00) >> 8;
nvbo->comp = (tile_flags & 0x00030000) >> 16;
@@ -299,7 +299,7 @@ nouveau_bo_alloc(struct nouveau_cli *cli, u64 *size, int *align, u32 domain,
/* Disable compression if suitable settings couldn't be found. */
if (nvbo->comp && !vmm->page[pi].comp) {
if (mmu->object.oclass >= NVIF_CLASS_MMU_GF100)
- nvbo->kind = mmu->kind[nvbo->kind];
+ nvbo->kind = mmu->impl->kind[nvbo->kind];
nvbo->comp = 0;
}
nvbo->page = vmm->page[pi].shift;
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index 554500a650db..872d689db7ba 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -104,7 +104,7 @@ nouveau_mem_host(struct ttm_resource *reg, struct ttm_tt *tt)
mem->comp = mem->kind = 0;
if (mem->comp && !(mmu->impl->type[type].type & NVIF_MEM_COMP)) {
if (mmu->object.oclass >= NVIF_CLASS_MMU_GF100)
- mem->kind = mmu->kind[mem->kind];
+ mem->kind = mmu->impl->kind[mem->kind];
mem->comp = 0;
}
@@ -144,7 +144,7 @@ nouveau_mem_vram(struct ttm_resource *reg, bool contig, u8 page)
ret = nvif_mem_ctor_type(mmu, "ttmVram",
drm->ttm.type_vram, page, size,
&(struct nv50_mem_v0) {
- .bankswz = mmu->kind[mem->kind] == 2,
+ .bankswz = mmu->impl->kind[mem->kind] == 2,
.contig = contig,
}, sizeof(struct nv50_mem_v0),
&mem->mem);
diff --git a/drivers/gpu/drm/nouveau/nvif/mmu.c b/drivers/gpu/drm/nouveau/nvif/mmu.c
index e727a6587658..d1d09e5a6909 100644
--- a/drivers/gpu/drm/nouveau/nvif/mmu.c
+++ b/drivers/gpu/drm/nouveau/nvif/mmu.c
@@ -24,7 +24,6 @@
#include <nvif/printf.h>
#include <nvif/class.h>
-#include <nvif/if0008.h>
void
nvif_mmu_dtor(struct nvif_mmu *mmu)
@@ -32,7 +31,6 @@ nvif_mmu_dtor(struct nvif_mmu *mmu)
if (!mmu->impl)
return;
- kfree(mmu->kind);
mmu->impl->del(mmu->priv);
mmu->impl = NULL;
}
@@ -44,7 +42,6 @@ nvif_mmu_ctor(struct nvif_device *device, const char *name, struct nvif_mmu *mmu
int ret;
mmu->impl = NULL;
- mmu->kind = NULL;
ret = device->impl->mmu.new(device->priv, &mmu->impl, &mmu->priv,
nvif_handle(&mmu->object));
@@ -53,33 +50,5 @@ nvif_mmu_ctor(struct nvif_device *device, const char *name, struct nvif_mmu *mmu
return ret;
nvif_object_ctor(&device->object, name ?: "nvifMmu", 0, oclass, &mmu->object);
-
- mmu->kind_nr = mmu->impl->kind_nr;
-
- mmu->kind = kmalloc_array(mmu->kind_nr, sizeof(*mmu->kind),
- GFP_KERNEL);
- if (!mmu->kind && mmu->kind_nr)
- goto done;
-
- if (mmu->kind_nr) {
- struct nvif_mmu_kind_v0 *kind;
- size_t argc = struct_size(kind, data, mmu->kind_nr);
-
- if (ret = -ENOMEM, !(kind = kmalloc(argc, GFP_KERNEL)))
- goto done;
- kind->version = 0;
- kind->count = mmu->kind_nr;
-
- ret = nvif_object_mthd(&mmu->object, NVIF_MMU_V0_KIND,
- kind, argc);
- if (ret == 0)
- memcpy(mmu->kind, kind->data, kind->count);
- mmu->kind_inv = kind->kind_inv;
- kfree(kind);
- }
-
-done:
- if (ret)
- nvif_mmu_dtor(mmu);
return ret;
}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c
index 8be5b1034bc1..05ec276facd9 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c
@@ -25,9 +25,6 @@
#include <core/client.h>
-#include <nvif/if0008.h>
-#include <nvif/unpack.h>
-
static int
nvkm_ummu_sclass(struct nvkm_object *object, int index,
struct nvkm_oclass *oclass)
@@ -53,33 +50,6 @@ nvkm_ummu_sclass(struct nvkm_object *object, int index,
return -EINVAL;
}
-static int
-nvkm_ummu_kind(struct nvkm_ummu *ummu, void *argv, u32 argc)
-{
- struct nvkm_mmu *mmu = ummu->mmu;
- union {
- struct nvif_mmu_kind_v0 v0;
- } *args = argv;
- const u8 *kind = NULL;
- int ret = -ENOSYS, count = 0;
- u8 kind_inv = 0;
-
- if (mmu->func->kind)
- kind = mmu->func->kind(mmu, &count, &kind_inv);
-
- if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, true))) {
- if (argc != args->v0.count * sizeof(*args->v0.data))
- return -EINVAL;
- if (args->v0.count > count)
- return -EINVAL;
- args->v0.kind_inv = kind_inv;
- memcpy(args->v0.data, kind, args->v0.count);
- } else
- return ret;
-
- return 0;
-}
-
static void
nvkm_ummu_del(struct nvif_mmu_priv *ummu)
{
@@ -93,21 +63,8 @@ nvkm_ummu_impl = {
.del = nvkm_ummu_del,
};
-static int
-nvkm_ummu_mthd(struct nvkm_object *object, u32 mthd, void *argv, u32 argc)
-{
- struct nvif_mmu_priv *ummu = container_of(object, typeof(*ummu), object);
- switch (mthd) {
- case NVIF_MMU_V0_KIND: return nvkm_ummu_kind(ummu, argv, argc);
- default:
- break;
- }
- return -EINVAL;
-}
-
static const struct nvkm_object_func
nvkm_ummu = {
- .mthd = nvkm_ummu_mthd,
.sclass = nvkm_ummu_sclass,
};
@@ -118,7 +75,6 @@ nvkm_ummu_new(struct nvkm_device *device, const struct nvif_mmu_impl **pimpl,
struct nvkm_mmu *mmu = device->mmu;
struct nvif_mmu_priv *ummu;
int kinds = 0;
- u8 unused = 0;
if (!(ummu = kzalloc(sizeof(*ummu), GFP_KERNEL)))
return -ENOMEM;
@@ -127,13 +83,9 @@ nvkm_ummu_new(struct nvkm_device *device, const struct nvif_mmu_impl **pimpl,
ummu->mmu = mmu;
ummu->impl = nvkm_ummu_impl;
- if (mmu->func->kind)
- mmu->func->kind(mmu, &kinds, &unused);
-
ummu->impl.dmabits = mmu->dma_bits;
ummu->impl.heap_nr = mmu->heap_nr;
ummu->impl.type_nr = mmu->type_nr;
- ummu->impl.kind_nr = kinds;
for (int i = 0; i < mmu->heap_nr; i++)
ummu->impl.heap[i].size = mmu->heap[i].size;
@@ -152,6 +104,11 @@ nvkm_ummu_new(struct nvkm_device *device, const struct nvif_mmu_impl **pimpl,
ummu->impl.type[i].heap = mmu->type[i].heap;
}
+ if (mmu->func->kind) {
+ ummu->impl.kind = mmu->func->kind(mmu, &kinds, &ummu->impl.kind_inv);
+ ummu->impl.kind_nr = kinds;
+ }
+
ummu->impl.mem.oclass = mmu->func->mem.user.oclass;
ummu->impl.vmm.oclass = mmu->func->vmm.user.oclass;
--
2.41.0
More information about the Nouveau
mailing list