summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-08-20 14:54:15 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-08-28 12:40:31 +1000
commit4e7e62d607a711bc8e8576a0fc7d8f242d25c9b3 (patch)
treefc62b911c58058802a8897dcf20b7eb080d57335
parent102b49da15834c1d2ba508457fdf69b3d07c6fee (diff)
drm/nouveau/client: store default device by handle, not reference
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/include/nvkm/core/client.h2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/core/client.c11
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/device/user.c10
4 files changed, 9 insertions, 16 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/client.h b/drivers/gpu/drm/nouveau/include/nvkm/core/client.h
index 473d66b22aeb..f79f9025d1c5 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/client.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/client.h
@@ -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;
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 0c293fe410bf..86f567d4e5cd 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -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);
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/client.c b/drivers/gpu/drm/nouveau/nvkm/core/client.c
index 5a1ddb3433de..7615cdd75294 100644
--- a/drivers/gpu/drm/nouveau/nvkm/core/client.c
+++ b/drivers/gpu/drm/nouveau/nvkm/core/client.c
@@ -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;
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
index 4867bbd0788f..c16bde41c279 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
@@ -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) |