drm/nouveau/client: store default device by handle, not reference

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Ben Skeggs 2015-08-20 14:54:15 +10:00
parent 102b49da15
commit 4e7e62d607
4 changed files with 9 additions and 16 deletions

View file

@ -5,7 +5,7 @@
struct nvkm_client { struct nvkm_client {
struct nvkm_namedb namedb; struct nvkm_namedb namedb;
struct nvkm_handle *root; struct nvkm_handle *root;
struct nvkm_device *device; u64 device;
char name[32]; char name[32];
u32 debug; u32 debug;
struct nvkm_vm *vm; struct nvkm_vm *vm;

View file

@ -507,7 +507,7 @@ nouveau_drm_device_remove(struct drm_device *dev)
dev->irq_enabled = false; dev->irq_enabled = false;
client = nvxx_client(&drm->client.base); client = nvxx_client(&drm->client.base);
device = client->device; device = nvkm_device_find(client->device);
drm_put_dev(dev); drm_put_dev(dev);
nvkm_device_del(&device); nvkm_device_del(&device);

View file

@ -219,7 +219,6 @@ nvkm_client_del(struct nvkm_client **pclient)
nvkm_client_fini(client, false); nvkm_client_fini(client, false);
for (i = 0; i < ARRAY_SIZE(client->notify); i++) for (i = 0; i < ARRAY_SIZE(client->notify); i++)
nvkm_client_notify_del(client, i); nvkm_client_notify_del(client, i);
nvkm_object_ref(NULL, (struct nvkm_object **)&client->device);
nvkm_handle_destroy(client->root); nvkm_handle_destroy(client->root);
nvkm_namedb_destroy(&client->namedb); nvkm_namedb_destroy(&client->namedb);
*pclient = NULL; *pclient = NULL;
@ -233,17 +232,12 @@ nvkm_client_sclass[] = {
}; };
int 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) const char *dbg, struct nvkm_client **pclient)
{ {
struct nvkm_device *device;
struct nvkm_client *client; struct nvkm_client *client;
int ret; int ret;
device = nvkm_device_find(devname);
if (!device)
return -ENODEV;
ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass, ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass,
NV_CLIENT_CLASS, nvkm_client_sclass, NV_CLIENT_CLASS, nvkm_client_sclass,
0, &client); 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 */ /* prevent init/fini being called, os in in charge of this */
atomic_set(&nv_object(client)->usecount, 2); atomic_set(&nv_object(client)->usecount, 2);
nvkm_object_ref(&device->engine.subdev.object, client->device = device;
(struct nvkm_object **)&client->device);
snprintf(client->name, sizeof(client->name), "%s", name); snprintf(client->name, sizeof(client->name), "%s", name);
client->debug = nvkm_dbgopt(dbg, "CLIENT"); client->debug = nvkm_dbgopt(dbg, "CLIENT");
return 0; return 0;

View file

@ -258,12 +258,12 @@ nvkm_udevice_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
oclass = &nvkm_udevice_oclass_super; oclass = &nvkm_udevice_oclass_super;
/* find the device subdev that matches what the client requested */ /* 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); device = nvkm_device_find(args->v0.device);
if (!device) else
return -ENODEV; device = nvkm_device_find(client->device);
} if (!device)
return -ENODEV;
ret = nvkm_parent_create(parent, NULL, oclass, 0, nvkm_control_oclass, ret = nvkm_parent_create(parent, NULL, oclass, 0, nvkm_control_oclass,
(1ULL << NVDEV_ENGINE_DMAOBJ) | (1ULL << NVDEV_ENGINE_DMAOBJ) |