drm/nouveau/client: store default device by handle, not reference
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:15 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:31 +0000 (12:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/client.h
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nvkm/core/client.c
drivers/gpu/drm/nouveau/nvkm/engine/device/user.c

index 473d66b22aeb087a013aa9129639fc321ccd7f15..f79f9025d1c56fc8324ba7bebe1d22f136dfe633 100644 (file)
@@ -5,7 +5,7 @@
 struct nvkm_client {
        struct nvkm_namedb namedb;
        struct nvkm_handle *root;
-       struct nvkm_device *device;
+       u64 device;
        char name[32];
        u32 debug;
        struct nvkm_vm *vm;
index 0c293fe410bf4041cbb969647305dd434eafb3b4..86f567d4e5cd2c37727c19997a3d91320f81d50f 100644 (file)
@@ -507,7 +507,7 @@ nouveau_drm_device_remove(struct drm_device *dev)
 
        dev->irq_enabled = false;
        client = nvxx_client(&drm->client.base);
-       device = client->device;
+       device = nvkm_device_find(client->device);
        drm_put_dev(dev);
 
        nvkm_device_del(&device);
index 5a1ddb3433de27c399c97d6848f78fdd479ce7d5..7615cdd75294951bd361e6ffb5a147c76a653ad1 100644 (file)
@@ -219,7 +219,6 @@ nvkm_client_del(struct nvkm_client **pclient)
                nvkm_client_fini(client, false);
                for (i = 0; i < ARRAY_SIZE(client->notify); i++)
                        nvkm_client_notify_del(client, i);
-               nvkm_object_ref(NULL, (struct nvkm_object **)&client->device);
                nvkm_handle_destroy(client->root);
                nvkm_namedb_destroy(&client->namedb);
                *pclient = NULL;
@@ -233,17 +232,12 @@ nvkm_client_sclass[] = {
 };
 
 int
-nvkm_client_new(const char *name, u64 devname, const char *cfg,
+nvkm_client_new(const char *name, u64 device, const char *cfg,
                const char *dbg, struct nvkm_client **pclient)
 {
-       struct nvkm_device *device;
        struct nvkm_client *client;
        int ret;
 
-       device = nvkm_device_find(devname);
-       if (!device)
-               return -ENODEV;
-
        ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass,
                                 NV_CLIENT_CLASS, nvkm_client_sclass,
                                 0, &client);
@@ -259,8 +253,7 @@ nvkm_client_new(const char *name, u64 devname, const char *cfg,
        /* prevent init/fini being called, os in in charge of this */
        atomic_set(&nv_object(client)->usecount, 2);
 
-       nvkm_object_ref(&device->engine.subdev.object,
-                       (struct nvkm_object **)&client->device);
+       client->device = device;
        snprintf(client->name, sizeof(client->name), "%s", name);
        client->debug = nvkm_dbgopt(dbg, "CLIENT");
        return 0;
index 4867bbd0788f3b3d513e24f993b48db1f8109b4d..c16bde41c279aba0b0c31fd34ee9b6e12f4098fc 100644 (file)
@@ -258,12 +258,12 @@ nvkm_udevice_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
                oclass = &nvkm_udevice_oclass_super;
 
        /* find the device subdev that matches what the client requested */
-       device = client->device;
-       if (args->v0.device != ~0) {
+       if (args->v0.device != ~0)
                device = nvkm_device_find(args->v0.device);
-               if (!device)
-                       return -ENODEV;
-       }
+       else
+               device = nvkm_device_find(client->device);
+       if (!device)
+               return -ENODEV;
 
        ret = nvkm_parent_create(parent, NULL, oclass, 0, nvkm_control_oclass,
                                 (1ULL << NVDEV_ENGINE_DMAOBJ) |