[PATCH 079/156] drm/nouveau/nvif: rework mmu "sclass" api
Ben Skeggs
bskeggs at nvidia.com
Tue Apr 16 23:38:45 UTC 2024
- transition from "ioctl" interface
Signed-off-by: Ben Skeggs <bskeggs at nvidia.com>
---
.../gpu/drm/nouveau/include/nvif/driverif.h | 8 +++
drivers/gpu/drm/nouveau/include/nvif/mem.h | 4 +-
drivers/gpu/drm/nouveau/include/nvif/mmu.h | 1 -
drivers/gpu/drm/nouveau/include/nvif/vmm.h | 2 +-
drivers/gpu/drm/nouveau/nouveau_bo.c | 10 ++--
drivers/gpu/drm/nouveau/nouveau_chan.c | 2 +-
drivers/gpu/drm/nouveau/nouveau_drm.c | 54 ++++++++-----------
drivers/gpu/drm/nouveau/nouveau_drv.h | 2 -
drivers/gpu/drm/nouveau/nouveau_mem.c | 10 ++--
drivers/gpu/drm/nouveau/nouveau_svm.c | 3 +-
drivers/gpu/drm/nouveau/nouveau_uvmm.c | 3 +-
drivers/gpu/drm/nouveau/nouveau_vmm.c | 4 +-
drivers/gpu/drm/nouveau/nouveau_vmm.h | 2 +-
drivers/gpu/drm/nouveau/nvif/mem.c | 10 ++--
drivers/gpu/drm/nouveau/nvif/mmu.c | 11 ----
drivers/gpu/drm/nouveau/nvif/vmm.c | 4 +-
.../gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c | 4 ++
17 files changed, 60 insertions(+), 74 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index 7bba8c79d71e..a1b97bc5e933 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -84,6 +84,14 @@ struct nvif_mmu_impl {
u8 type_nr;
u16 kind_nr;
+
+ struct {
+ s32 oclass;
+ } mem;
+
+ struct {
+ s32 oclass;
+ } vmm;
};
struct nvif_device_impl {
diff --git a/drivers/gpu/drm/nouveau/include/nvif/mem.h b/drivers/gpu/drm/nouveau/include/nvif/mem.h
index 9e1071dd56a0..217d13126f13 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/mem.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/mem.h
@@ -10,10 +10,10 @@ struct nvif_mem {
u64 size;
};
-int nvif_mem_ctor_type(struct nvif_mmu *mmu, const char *name, s32 oclass,
+int nvif_mem_ctor_type(struct nvif_mmu *mmu, const char *name,
int type, u8 page, u64 size, void *argv, u32 argc,
struct nvif_mem *);
-int nvif_mem_ctor(struct nvif_mmu *mmu, const char *name, s32 oclass, u8 type,
+int nvif_mem_ctor(struct nvif_mmu *mmu, const char *name, u8 type,
u8 page, u64 size, void *argv, u32 argc, struct nvif_mem *);
void nvif_mem_dtor(struct nvif_mem *);
diff --git a/drivers/gpu/drm/nouveau/include/nvif/mmu.h b/drivers/gpu/drm/nouveau/include/nvif/mmu.h
index 414caaa2230a..ed5d011f4237 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/mmu.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/mmu.h
@@ -12,7 +12,6 @@ struct nvif_mmu {
u8 type_nr;
u8 kind_inv;
u16 kind_nr;
- s32 mem;
struct {
u64 size;
diff --git a/drivers/gpu/drm/nouveau/include/nvif/vmm.h b/drivers/gpu/drm/nouveau/include/nvif/vmm.h
index 0ecedd0ee0a5..e8d8fbd56010 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/vmm.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/vmm.h
@@ -36,7 +36,7 @@ struct nvif_vmm {
int page_nr;
};
-int nvif_vmm_ctor(struct nvif_mmu *, const char *name, s32 oclass,
+int nvif_vmm_ctor(struct nvif_mmu *, const char *name,
enum nvif_vmm_type, u64 addr, u64 size, void *argv, u32 argc,
struct nvif_vmm *);
void nvif_vmm_dtor(struct nvif_vmm *);
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index e1483fd5d283..cbb8f54db83f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -1158,7 +1158,7 @@ nouveau_ttm_io_mem_free_locked(struct nouveau_drm *drm,
{
struct nouveau_mem *mem = nouveau_mem(reg);
- if (drm->client.mem->oclass >= NVIF_CLASS_MEM_NV50) {
+ if (drm->mmu.impl->mem.oclass >= NVIF_CLASS_MEM_NV50) {
switch (reg->mem_type) {
case TTM_PL_TT:
if (mem->kind)
@@ -1179,7 +1179,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *reg)
struct nouveau_drm *drm = nouveau_bdev(bdev);
struct nvkm_device *device = nvxx_device(&drm->client.device);
struct nouveau_mem *mem = nouveau_mem(reg);
- struct nvif_mmu *mmu = &drm->client.mmu;
+ struct nvif_mmu *mmu = &drm->mmu;
int ret;
mutex_lock(&drm->ttm.io_reserve_mutex);
@@ -1198,7 +1198,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *reg)
reg->bus.caching = ttm_write_combined;
}
#endif
- if (drm->client.mem->oclass < NVIF_CLASS_MEM_NV50 ||
+ if (mmu->impl->mem.oclass < NVIF_CLASS_MEM_NV50 ||
!mem->kind) {
/* untiled */
ret = 0;
@@ -1217,7 +1217,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *reg)
else
reg->bus.caching = ttm_write_combined;
- if (drm->client.mem->oclass >= NVIF_CLASS_MEM_NV50) {
+ if (mmu->impl->mem.oclass >= NVIF_CLASS_MEM_NV50) {
union {
struct nv50_mem_map_v0 nv50;
struct gf100_mem_map_v0 gf100;
@@ -1225,7 +1225,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *reg)
u64 handle, length;
u32 argc = 0;
- switch (mem->mem.object.oclass) {
+ switch (mmu->impl->mem.oclass) {
case NVIF_CLASS_MEM_NV50:
args.nv50.version = 0;
args.nv50.ro = 0;
diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c
index 636ca1f284f8..dd4f9915ccaf 100644
--- a/drivers/gpu/drm/nouveau/nouveau_chan.c
+++ b/drivers/gpu/drm/nouveau/nouveau_chan.c
@@ -328,7 +328,7 @@ nouveau_channel_ctor(struct nouveau_cli *cli, bool priv, u64 runm,
/* allocate userd */
if (oclass >= VOLTA_CHANNEL_GPFIFO_A) {
- ret = nvif_mem_ctor(&cli->mmu, "abi16ChanUSERD", NVIF_CLASS_MEM_GF100,
+ ret = nvif_mem_ctor(&cli->mmu, "abi16ChanUSERD",
NVIF_MEM_VRAM | NVIF_MEM_COHERENT | NVIF_MEM_MAPPABLE,
0, PAGE_SIZE, NULL, 0, &chan->mem_userd);
if (ret)
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 1dba64a1e590..8ab6b9e03eb5 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -194,22 +194,6 @@ static int
nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
struct nouveau_cli *cli)
{
- static const struct nvif_mclass
- mems[] = {
- { NVIF_CLASS_MEM_GF100, -1 },
- { NVIF_CLASS_MEM_NV50 , -1 },
- { NVIF_CLASS_MEM_NV04 , -1 },
- {}
- };
- static const struct nvif_mclass
- vmms[] = {
- { NVIF_CLASS_VMM_GP100, -1 },
- { NVIF_CLASS_VMM_GM200, -1 },
- { NVIF_CLASS_VMM_GF100, -1 },
- { NVIF_CLASS_VMM_NV50 , -1 },
- { NVIF_CLASS_VMM_NV04 , -1 },
- {}
- };
int ret;
snprintf(cli->name, sizeof(cli->name), "%s", sname);
@@ -242,26 +226,12 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
goto done;
}
- ret = nvif_mclass(&cli->mmu.object, vmms);
- if (ret < 0) {
- NV_PRINTK(err, cli, "No supported VMM class\n");
- goto done;
- }
-
- ret = nouveau_vmm_init(cli, vmms[ret].oclass, &cli->vmm);
+ ret = nouveau_vmm_init(cli, &cli->vmm);
if (ret) {
NV_PRINTK(err, cli, "VMM allocation failed: %d\n", ret);
goto done;
}
- ret = nvif_mclass(&cli->mmu.object, mems);
- if (ret < 0) {
- NV_PRINTK(err, cli, "No supported MEM class\n");
- goto done;
- }
-
- cli->mem = &mems[ret];
-
/* Don't pass in the (shared) sched_wq in order to let
* nouveau_sched_create() create a dedicated one for VM_BIND jobs.
*
@@ -574,6 +544,28 @@ nouveau_drm_device_init(struct drm_device *dev, struct nvkm_device *nvkm)
goto fail_nvif;
}
+ switch (drm->mmu.impl->mem.oclass) {
+ case NVIF_CLASS_MEM_GF100:
+ case NVIF_CLASS_MEM_NV50:
+ case NVIF_CLASS_MEM_NV04:
+ break;
+ default:
+ NV_ERROR(drm, "No supported MEM class (0x%04x)\n", drm->mmu.impl->mem.oclass);
+ goto fail_nvif;
+ }
+
+ switch (drm->mmu.impl->vmm.oclass) {
+ case NVIF_CLASS_VMM_GP100:
+ case NVIF_CLASS_VMM_GM200:
+ case NVIF_CLASS_VMM_GF100:
+ case NVIF_CLASS_VMM_NV50:
+ case NVIF_CLASS_VMM_NV04:
+ break;
+ default:
+ NV_ERROR(drm, "No supported VMM class (0x%04x)\n", drm->mmu.impl->vmm.oclass);
+ goto fail_nvif;
+ }
+
drm->sched_wq = alloc_workqueue("nouveau_sched_wq_shared", 0,
WQ_MAX_ACTIVE);
if (!drm->sched_wq) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 35dfc95b32ed..38d33a4d5c49 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -100,8 +100,6 @@ struct nouveau_cli {
struct nouveau_sched *sched;
- const struct nvif_mclass *mem;
-
struct list_head head;
void *abi16;
struct list_head objects;
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index baea74899fcf..75abd545c92d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -90,7 +90,6 @@ nouveau_mem_host(struct ttm_resource *reg, struct ttm_tt *tt)
{
struct nouveau_mem *mem = nouveau_mem(reg);
struct nouveau_drm *drm = mem->drm;
- struct nouveau_cli *cli = &drm->cli;
struct nvif_mmu *mmu = &drm->mmu;
struct nvif_mem_ram_v0 args = {};
u8 type;
@@ -115,7 +114,7 @@ nouveau_mem_host(struct ttm_resource *reg, struct ttm_tt *tt)
args.dma = tt->dma_address;
mutex_lock(&drm->client_mutex);
- ret = nvif_mem_ctor_type(mmu, "ttmHostMem", cli->mem->oclass, type, PAGE_SHIFT,
+ ret = nvif_mem_ctor_type(mmu, "ttmHostMem", type, PAGE_SHIFT,
reg->size,
&args, sizeof(args), &mem->mem);
mutex_unlock(&drm->client_mutex);
@@ -127,15 +126,14 @@ nouveau_mem_vram(struct ttm_resource *reg, bool contig, u8 page)
{
struct nouveau_mem *mem = nouveau_mem(reg);
struct nouveau_drm *drm = mem->drm;
- struct nouveau_cli *cli = &drm->cli;
struct nvif_mmu *mmu = &drm->mmu;
u64 size = ALIGN(reg->size, 1 << page);
int ret;
mutex_lock(&drm->client_mutex);
- switch (cli->mem->oclass) {
+ switch (drm->mmu.impl->mem.oclass) {
case NVIF_CLASS_MEM_GF100:
- ret = nvif_mem_ctor_type(mmu, "ttmVram", cli->mem->oclass,
+ ret = nvif_mem_ctor_type(mmu, "ttmVram",
drm->ttm.type_vram, page, size,
&(struct gf100_mem_v0) {
.contig = contig,
@@ -143,7 +141,7 @@ nouveau_mem_vram(struct ttm_resource *reg, bool contig, u8 page)
&mem->mem);
break;
case NVIF_CLASS_MEM_NV50:
- ret = nvif_mem_ctor_type(mmu, "ttmVram", cli->mem->oclass,
+ ret = nvif_mem_ctor_type(mmu, "ttmVram",
drm->ttm.type_vram, page, size,
&(struct nv50_mem_v0) {
.bankswz = mmu->kind[mem->kind] == 2,
diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c
index 477336672652..a478b5a9ed0a 100644
--- a/drivers/gpu/drm/nouveau/nouveau_svm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_svm.c
@@ -346,8 +346,7 @@ nouveau_svmm_init(struct drm_device *dev, void *data,
* All future channel/memory allocations will make use of this
* VMM instead of the standard one.
*/
- ret = nvif_vmm_ctor(&cli->mmu, "svmVmm",
- cli->vmm.vmm.object.oclass, MANAGED,
+ ret = nvif_vmm_ctor(&cli->mmu, "svmVmm", MANAGED,
args->unmanaged_addr, args->unmanaged_size,
&(struct gp100_vmm_v0) {
.fault_replay = true,
diff --git a/drivers/gpu/drm/nouveau/nouveau_uvmm.c b/drivers/gpu/drm/nouveau/nouveau_uvmm.c
index 0a0a11dc9ec0..d35096071c1a 100644
--- a/drivers/gpu/drm/nouveau/nouveau_uvmm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_uvmm.c
@@ -1865,8 +1865,7 @@ nouveau_uvmm_ioctl_vm_init(struct drm_device *dev,
/* GPUVM takes care from here on. */
drm_gem_object_put(r_obj);
- ret = nvif_vmm_ctor(&cli->mmu, "uvmm",
- cli->vmm.vmm.object.oclass, RAW,
+ ret = nvif_vmm_ctor(&cli->mmu, "uvmm", RAW,
init->kernel_managed_addr,
init->kernel_managed_size,
NULL, 0, &uvmm->vmm.vmm);
diff --git a/drivers/gpu/drm/nouveau/nouveau_vmm.c b/drivers/gpu/drm/nouveau/nouveau_vmm.c
index 3dda885df5b2..93807d21ceff 100644
--- a/drivers/gpu/drm/nouveau/nouveau_vmm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_vmm.c
@@ -129,9 +129,9 @@ nouveau_vmm_fini(struct nouveau_vmm *vmm)
}
int
-nouveau_vmm_init(struct nouveau_cli *cli, s32 oclass, struct nouveau_vmm *vmm)
+nouveau_vmm_init(struct nouveau_cli *cli, struct nouveau_vmm *vmm)
{
- int ret = nvif_vmm_ctor(&cli->mmu, "drmVmm", oclass, UNMANAGED,
+ int ret = nvif_vmm_ctor(&cli->mmu, "drmVmm", UNMANAGED,
PAGE_SIZE, 0, NULL, 0, &vmm->vmm);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/nouveau/nouveau_vmm.h b/drivers/gpu/drm/nouveau/nouveau_vmm.h
index 2b98d975f37e..196d8a819617 100644
--- a/drivers/gpu/drm/nouveau/nouveau_vmm.h
+++ b/drivers/gpu/drm/nouveau/nouveau_vmm.h
@@ -28,6 +28,6 @@ struct nouveau_vmm {
struct nouveau_svmm *svmm;
};
-int nouveau_vmm_init(struct nouveau_cli *, s32 oclass, struct nouveau_vmm *);
+int nouveau_vmm_init(struct nouveau_cli *, struct nouveau_vmm *);
void nouveau_vmm_fini(struct nouveau_vmm *);
#endif
diff --git a/drivers/gpu/drm/nouveau/nvif/mem.c b/drivers/gpu/drm/nouveau/nvif/mem.c
index 0e1b7b4c2e91..0f0b4a7c5e80 100644
--- a/drivers/gpu/drm/nouveau/nvif/mem.c
+++ b/drivers/gpu/drm/nouveau/nvif/mem.c
@@ -28,7 +28,7 @@ int
nvif_mem_ctor_map(struct nvif_mmu *mmu, const char *name, u8 type, u64 size,
struct nvif_mem *mem)
{
- int ret = nvif_mem_ctor(mmu, name, mmu->mem, NVIF_MEM_MAPPABLE | type,
+ int ret = nvif_mem_ctor(mmu, name, NVIF_MEM_MAPPABLE | type,
0, size, NULL, 0, mem);
if (ret == 0) {
ret = nvif_object_map(&mem->object, NULL, 0);
@@ -45,7 +45,7 @@ nvif_mem_dtor(struct nvif_mem *mem)
}
int
-nvif_mem_ctor_type(struct nvif_mmu *mmu, const char *name, s32 oclass,
+nvif_mem_ctor_type(struct nvif_mmu *mmu, const char *name,
int type, u8 page, u64 size, void *argv, u32 argc,
struct nvif_mem *mem)
{
@@ -69,7 +69,7 @@ nvif_mem_ctor_type(struct nvif_mmu *mmu, const char *name, s32 oclass,
args->size = size;
memcpy(args->data, argv, argc);
- ret = nvif_object_ctor(&mmu->object, name ? name : "nvifMem", 0, oclass,
+ ret = nvif_object_ctor(&mmu->object, name ? name : "nvifMem", 0, mmu->impl->mem.oclass,
args, sizeof(*args) + argc, &mem->object);
if (ret == 0) {
mem->type = mmu->type[type].type;
@@ -85,7 +85,7 @@ nvif_mem_ctor_type(struct nvif_mmu *mmu, const char *name, s32 oclass,
}
int
-nvif_mem_ctor(struct nvif_mmu *mmu, const char *name, s32 oclass, u8 type,
+nvif_mem_ctor(struct nvif_mmu *mmu, const char *name, u8 type,
u8 page, u64 size, void *argv, u32 argc, struct nvif_mem *mem)
{
int ret = -EINVAL, i;
@@ -94,7 +94,7 @@ nvif_mem_ctor(struct nvif_mmu *mmu, const char *name, s32 oclass, u8 type,
for (i = 0; ret && i < mmu->type_nr; i++) {
if ((mmu->type[i].type & type) == type) {
- ret = nvif_mem_ctor_type(mmu, name, oclass, i, page,
+ ret = nvif_mem_ctor_type(mmu, name, i, page,
size, argv, argc, mem);
}
}
diff --git a/drivers/gpu/drm/nouveau/nvif/mmu.c b/drivers/gpu/drm/nouveau/nvif/mmu.c
index cc15cf99462c..7e592a6d8530 100644
--- a/drivers/gpu/drm/nouveau/nvif/mmu.c
+++ b/drivers/gpu/drm/nouveau/nvif/mmu.c
@@ -42,12 +42,6 @@ nvif_mmu_dtor(struct nvif_mmu *mmu)
int
nvif_mmu_ctor(struct nvif_device *device, const char *name, struct nvif_mmu *mmu)
{
- static const struct nvif_mclass mems[] = {
- { NVIF_CLASS_MEM_GF100, -1 },
- { NVIF_CLASS_MEM_NV50 , -1 },
- { NVIF_CLASS_MEM_NV04 , -1 },
- {}
- };
const s32 oclass = device->impl->mmu.oclass;
int ret, i;
@@ -68,11 +62,6 @@ nvif_mmu_ctor(struct nvif_device *device, const char *name, struct nvif_mmu *mmu
mmu->type_nr = mmu->impl->type_nr;
mmu->kind_nr = mmu->impl->kind_nr;
- ret = nvif_mclass(&mmu->object, mems);
- if (ret < 0)
- goto done;
- mmu->mem = mems[ret].oclass;
-
mmu->heap = kmalloc_array(mmu->heap_nr, sizeof(*mmu->heap),
GFP_KERNEL);
mmu->type = kmalloc_array(mmu->type_nr, sizeof(*mmu->type),
diff --git a/drivers/gpu/drm/nouveau/nvif/vmm.c b/drivers/gpu/drm/nouveau/nvif/vmm.c
index 99296f03371a..2738ea9229cc 100644
--- a/drivers/gpu/drm/nouveau/nvif/vmm.c
+++ b/drivers/gpu/drm/nouveau/nvif/vmm.c
@@ -196,7 +196,7 @@ nvif_vmm_dtor(struct nvif_vmm *vmm)
}
int
-nvif_vmm_ctor(struct nvif_mmu *mmu, const char *name, s32 oclass,
+nvif_vmm_ctor(struct nvif_mmu *mmu, const char *name,
enum nvif_vmm_type type, u64 addr, u64 size, void *argv, u32 argc,
struct nvif_vmm *vmm)
{
@@ -225,7 +225,7 @@ nvif_vmm_ctor(struct nvif_mmu *mmu, const char *name, s32 oclass,
memcpy(args->data, argv, argc);
ret = nvif_object_ctor(&mmu->object, name ? name : "nvifVmm", 0,
- oclass, args, argn, &vmm->object);
+ mmu->impl->vmm.oclass, args, argn, &vmm->object);
if (ret)
goto done;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c
index f97dec6c3309..9f44d469b4da 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c
@@ -186,6 +186,10 @@ nvkm_ummu_new(struct nvkm_device *device, const struct nvif_mmu_impl **pimpl,
ummu->impl.type_nr = mmu->type_nr;
ummu->impl.kind_nr = kinds;
+ ummu->impl.mem.oclass = mmu->func->mem.user.oclass;
+
+ ummu->impl.vmm.oclass = mmu->func->vmm.user.oclass;
+
*pimpl = &ummu->impl;
*ppriv = ummu;
*pobject = &ummu->object;
--
2.41.0
More information about the Nouveau
mailing list