diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/core/client.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/core/client.c | 104 |
1 files changed, 54 insertions, 50 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/client.c b/drivers/gpu/drm/nouveau/nvkm/core/client.c index 0c7162fbe06c..cd8e51f74aa1 100644 --- a/drivers/gpu/drm/nouveau/nvkm/core/client.c +++ b/drivers/gpu/drm/nouveau/nvkm/core/client.c @@ -176,43 +176,73 @@ nvkm_client_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size) return -EINVAL; } -static void -nvkm_client_dtor(struct nvkm_object *object) -{ - struct nvkm_client *client = (void *)object; - int i; - for (i = 0; i < ARRAY_SIZE(client->notify); i++) - nvkm_client_notify_del(client, i); - nvkm_object_ref(NULL, &client->device); - nvkm_handle_destroy(client->root); - nvkm_namedb_destroy(&client->namedb); -} - static struct nvkm_oclass nvkm_client_oclass = { .ofuncs = &(struct nvkm_ofuncs) { - .dtor = nvkm_client_dtor, .mthd = nvkm_client_mthd, }, }; int -nvkm_client_create_(const char *name, u64 devname, const char *cfg, - const char *dbg, int length, void **pobject) +nvkm_client_fini(struct nvkm_client *client, bool suspend) +{ + struct nvkm_object *object = &client->namedb.parent.object; + const char *name[2] = { "fini", "suspend" }; + int ret, i; + nvif_trace(object, "%s running\n", name[suspend]); + nvif_trace(object, "%s notify\n", name[suspend]); + for (i = 0; i < ARRAY_SIZE(client->notify); i++) + nvkm_client_notify_put(client, i); + nvif_trace(object, "%s object\n", name[suspend]); + ret = nvkm_handle_fini(client->root, suspend); + nvif_trace(object, "%s completed with %d\n", name[suspend], ret); + return ret; +} + +int +nvkm_client_init(struct nvkm_client *client) +{ + struct nvkm_object *object = &client->namedb.parent.object; + int ret; + nvif_trace(object, "init running\n"); + ret = nvkm_handle_init(client->root); + nvif_trace(object, "init completed with %d\n", ret); + return ret; +} + +void +nvkm_client_del(struct nvkm_client **pclient) +{ + struct nvkm_client *client = *pclient; + int i; + if (client) { + 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; + } +} + +int +nvkm_client_new(const char *name, u64 devname, const char *cfg, + const char *dbg, struct nvkm_client **pclient) { - struct nvkm_object *device; + struct nvkm_device *device; struct nvkm_client *client; int ret; - device = (void *)nvkm_device_find(devname); + device = nvkm_device_find(devname); if (!device) return -ENODEV; - ret = nvkm_namedb_create_(NULL, NULL, &nvkm_client_oclass, - NV_CLIENT_CLASS, NULL, - (1ULL << NVDEV_ENGINE_DEVICE), - length, pobject); - client = *pobject; + ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass, + NV_CLIENT_CLASS, NULL, + (1ULL << NVDEV_ENGINE_DEVICE), + &client); + *pclient = client; if (ret) return ret; @@ -224,39 +254,13 @@ nvkm_client_create_(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, &client->device); + nvkm_object_ref(&device->engine.subdev.object, + (struct nvkm_object **)&client->device); snprintf(client->name, sizeof(client->name), "%s", name); client->debug = nvkm_dbgopt(dbg, "CLIENT"); return 0; } -int -nvkm_client_init(struct nvkm_client *client) -{ - struct nvkm_object *object = &client->namedb.parent.object; - int ret; - nvif_trace(object, "init running\n"); - ret = nvkm_handle_init(client->root); - nvif_trace(object, "init completed with %d\n", ret); - return ret; -} - -int -nvkm_client_fini(struct nvkm_client *client, bool suspend) -{ - struct nvkm_object *object = &client->namedb.parent.object; - const char *name[2] = { "fini", "suspend" }; - int ret, i; - nvif_trace(object, "%s running\n", name[suspend]); - nvif_trace(object, "%s notify\n", name[suspend]); - for (i = 0; i < ARRAY_SIZE(client->notify); i++) - nvkm_client_notify_put(client, i); - nvif_trace(object, "%s object\n", name[suspend]); - ret = nvkm_handle_fini(client->root, suspend); - nvif_trace(object, "%s completed with %d\n", name[suspend], ret); - return ret; -} - const char * nvkm_client_name(void *obj) { |