drm/nouveau/core/object: plumb the unmap ioctl through
authorBen Skeggs <bskeggs@redhat.com>
Tue, 31 Oct 2017 17:56:19 +0000 (03:56 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 2 Nov 2017 03:32:16 +0000 (13:32 +1000)
MMU will be using this for BAR mappings.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/object.h
drivers/gpu/drm/nouveau/nvkm/core/ioctl.c
drivers/gpu/drm/nouveau/nvkm/core/object.c
drivers/gpu/drm/nouveau/nvkm/core/oproxy.c

index 4797577d52ce381e7177902d5b6b6be0f2e9eb0d..916a4b76d430bc31f8594df3e6047596c9b8b330 100644 (file)
@@ -32,6 +32,7 @@ struct nvkm_object_func {
        int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
        int (*map)(struct nvkm_object *, void *argv, u32 argc,
                   enum nvkm_object_map *, u64 *addr, u64 *size);
+       int (*unmap)(struct nvkm_object *);
        int (*rd08)(struct nvkm_object *, u64 addr, u8 *data);
        int (*rd16)(struct nvkm_object *, u64 addr, u16 *data);
        int (*rd32)(struct nvkm_object *, u64 addr, u32 *data);
@@ -58,6 +59,7 @@ int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
 int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
 int nvkm_object_map(struct nvkm_object *, void *argv, u32 argc,
                    enum nvkm_object_map *, u64 *addr, u64 *size);
+int nvkm_object_unmap(struct nvkm_object *);
 int nvkm_object_rd08(struct nvkm_object *, u64 addr, u8  *data);
 int nvkm_object_rd16(struct nvkm_object *, u64 addr, u16 *data);
 int nvkm_object_rd32(struct nvkm_object *, u64 addr, u32 *data);
index bf2507f17baa5063f2e9fe19f6d8e11b3a916b62..a28018ee5b197b26cee1b07b72956248af47c0a0 100644 (file)
@@ -287,6 +287,7 @@ nvkm_ioctl_unmap(struct nvkm_client *client,
        nvif_ioctl(object, "unmap size %d\n", size);
        if (!(ret = nvif_unvers(ret, &data, &size, args->none))) {
                nvif_ioctl(object, "unmap\n");
+               ret = nvkm_object_unmap(object);
        }
 
        return ret;
index 516e73a52665079ef83285b17000005a04646769..301a5e5b5f7f9ca94b2a1817f05107cc9cdc490c 100644 (file)
@@ -110,6 +110,14 @@ nvkm_object_map(struct nvkm_object *object, void *argv, u32 argc,
        return -ENODEV;
 }
 
+int
+nvkm_object_unmap(struct nvkm_object *object)
+{
+       if (likely(object->func->unmap))
+               return object->func->unmap(object);
+       return -ENODEV;
+}
+
 int
 nvkm_object_rd08(struct nvkm_object *object, u64 addr, u8 *data)
 {
@@ -260,6 +268,7 @@ nvkm_object_dtor(struct nvkm_object *object)
        }
 
        nvif_debug(object, "destroy running...\n");
+       nvkm_object_unmap(object);
        if (object->func->dtor)
                data = object->func->dtor(object);
        nvkm_engine_unref(&object->engine);
index e7dd15b97721748266afd43e23b2a3b3a5d07590..16299837a296cdf5eb89fcddeca0a428dbf0b4f9 100644 (file)
@@ -44,6 +44,12 @@ nvkm_oproxy_map(struct nvkm_object *object, void *argv, u32 argc,
        return nvkm_object_map(oproxy->object, argv, argc, type, addr, size);
 }
 
+static int
+nvkm_oproxy_unmap(struct nvkm_object *object)
+{
+       return nvkm_object_unmap(nvkm_oproxy(object)->object);
+}
+
 static int
 nvkm_oproxy_rd08(struct nvkm_object *object, u64 addr, u8 *data)
 {
@@ -173,6 +179,7 @@ nvkm_oproxy_func = {
        .mthd = nvkm_oproxy_mthd,
        .ntfy = nvkm_oproxy_ntfy,
        .map = nvkm_oproxy_map,
+       .unmap = nvkm_oproxy_unmap,
        .rd08 = nvkm_oproxy_rd08,
        .rd16 = nvkm_oproxy_rd16,
        .rd32 = nvkm_oproxy_rd32,