- transition from "ioctl" interface Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> --- .../gpu/drm/nouveau/include/nvif/driverif.h | 1 + drivers/gpu/drm/nouveau/nouveau_svm.c | 26 +++++++++++-------- .../gpu/drm/nouveau/nvkm/subdev/fault/user.c | 16 +++--------- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h b/drivers/gpu/drm/nouveau/include/nvif/driverif.h index a1aab5735146..ba987233ec74 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h +++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h @@ -198,6 +198,7 @@ struct nvif_mmu_impl { struct nvif_faultbuf_impl { void (*del)(struct nvif_faultbuf_priv *); + struct nvif_mapinfo map; u32 entries; u32 get; u32 put; diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c index 83702a86da1d..43218da5d0f3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_svm.c +++ b/drivers/gpu/drm/nouveau/nouveau_svm.c @@ -47,6 +47,7 @@ struct nouveau_svm { const struct nvif_faultbuf_impl *impl; struct nvif_faultbuf_priv *priv; struct nvif_object object; + struct nvif_map map; int id; u32 entries; @@ -449,15 +450,14 @@ static void nouveau_svm_fault_cache(struct nouveau_svm *svm, struct nouveau_svm_fault_buffer *buffer, u32 offset) { - struct nvif_object *memory = &buffer->object; - const u32 instlo = nvif_rd32(memory, offset + 0x00); - const u32 insthi = nvif_rd32(memory, offset + 0x04); - const u32 addrlo = nvif_rd32(memory, offset + 0x08); - const u32 addrhi = nvif_rd32(memory, offset + 0x0c); - const u32 timelo = nvif_rd32(memory, offset + 0x10); - const u32 timehi = nvif_rd32(memory, offset + 0x14); - const u32 engine = nvif_rd32(memory, offset + 0x18); - const u32 info = nvif_rd32(memory, offset + 0x1c); + const u32 instlo = nvif_rd32(buffer, offset + 0x00); + const u32 insthi = nvif_rd32(buffer, offset + 0x04); + const u32 addrlo = nvif_rd32(buffer, offset + 0x08); + const u32 addrhi = nvif_rd32(buffer, offset + 0x0c); + const u32 timelo = nvif_rd32(buffer, offset + 0x10); + const u32 timehi = nvif_rd32(buffer, offset + 0x14); + const u32 engine = nvif_rd32(buffer, offset + 0x18); + const u32 info = nvif_rd32(buffer, offset + 0x1c); const u64 inst = (u64)insthi << 32 | instlo; const u8 gpc = (info & 0x1f000000) >> 24; const u8 hub = (info & 0x00100000) >> 20; @@ -468,7 +468,7 @@ nouveau_svm_fault_cache(struct nouveau_svm *svm, if (WARN_ON(!(info & 0x80000000))) return; - nvif_mask(memory, offset + 0x1c, 0x80000000, 0x00000000); + nvif_mask(buffer, offset + 0x1c, 0x80000000, 0x00000000); if (!buffer->fault[buffer->fault_nr]) { fault = kmalloc(sizeof(*fault), GFP_KERNEL); @@ -965,6 +965,7 @@ nouveau_svm_fault_buffer_dtor(struct nouveau_svm *svm, int id) nvif_event_dtor(&buffer->notify); if (buffer->impl) { + nvif_object_unmap_cpu(&buffer->map); buffer->impl->del(buffer->priv); buffer->impl = NULL; } @@ -991,7 +992,10 @@ nouveau_svm_fault_buffer_ctor(struct nouveau_svm *svm, s32 oclass, int id) buffer->getaddr = buffer->impl->get; buffer->putaddr = buffer->impl->put; - nvif_object_map(&buffer->object, NULL, 0); + ret = nvif_object_map_cpu(&buffer->object, &buffer->impl->map, &buffer->map); + if (ret) + return ret; + INIT_WORK(&buffer->work, nouveau_svm_fault); ret = nvif_event_ctor(&buffer->object, "svmFault", id, nouveau_svm_event, true, NULL, 0, diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.c index e6eb6df1f982..de7a79607eff 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.c @@ -51,18 +51,6 @@ nvkm_ufault_uevent(struct nvkm_object *object, void *argv, u32 argc, struct nvkm NVKM_FAULT_BUFFER_EVENT_PENDING, NULL); } -static int -nvkm_ufault_map(struct nvkm_object *object, void *argv, u32 argc, - enum nvkm_object_map *type, u64 *addr, u64 *size) -{ - struct nvkm_fault_buffer *buffer = container_of(object, struct nvif_faultbuf_priv, object)->buffer; - struct nvkm_device *device = buffer->fault->subdev.device; - *type = NVKM_OBJECT_MAP_IO; - *addr = device->func->resource_addr(device, 3) + buffer->addr; - *size = nvkm_memory_size(buffer->mem); - return 0; -} - static void nvkm_ufault_del(struct nvif_faultbuf_priv *ufault) { @@ -108,7 +96,6 @@ nvkm_ufault = { .dtor = nvkm_ufault_dtor, .init = nvkm_ufault_init, .fini = nvkm_ufault_fini, - .map = nvkm_ufault_map, .uevent = nvkm_ufault_uevent, }; @@ -134,6 +121,9 @@ nvkm_ufault_new(struct nvkm_device *device, const struct nvif_faultbuf_impl **pi } ufault->impl = nvkm_ufault_impl; + ufault->impl.map.type = NVIF_MAP_IO; + ufault->impl.map.handle = device->func->resource_addr(device, 3) + ufault->buffer->addr; + ufault->impl.map.length = nvkm_memory_size(ufault->buffer->mem); ufault->impl.entries = ufault->buffer->entries; ufault->impl.get = ufault->buffer->get; ufault->impl.put = ufault->buffer->put; -- 2.41.0