summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-08-20 07:54:15 +0300
committerBen Skeggs <bskeggs@redhat.com>2015-08-28 05:40:30 +0300
commit76ecea5b4b9383edde2bfe49e59e76fec4e21aa4 (patch)
treeffe2996b22f3b7f0eec26a09e26defa1e3bf5907 /drivers/gpu
parent47b2505efb2d951f16c3a229d93450b463d925e5 (diff)
downloadlinux-76ecea5b4b9383edde2bfe49e59e76fec4e21aa4.tar.xz
drm/nouveau/client: tidy ctor/dtor interfaces
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/include/nvkm/core/client.h13
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.c4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_nvif.c8
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/core/client.c104
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/device/base.c2
5 files changed, 64 insertions, 67 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/client.h b/drivers/gpu/drm/nouveau/include/nvkm/core/client.h
index 882ff6ed1e41..473d66b22aeb 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_object *device;
+ struct nvkm_device *device;
char name[32];
u32 debug;
struct nvkm_vm *vm;
@@ -34,14 +34,9 @@ nvkm_client(void *obj)
return (void *)client;
}
-#define nvkm_client_create(n,c,oc,od,d) \
- nvkm_client_create_((n), (c), (oc), (od), sizeof(**d), (void **)d)
-
-int nvkm_client_create_(const char *name, u64 device, const char *cfg,
- const char *dbg, int, void **);
-#define nvkm_client_destroy(p) \
- nvkm_namedb_destroy(&(p)->base)
-
+int nvkm_client_new(const char *name, u64 device, const char *cfg,
+ const char *dbg, struct nvkm_client **);
+void nvkm_client_del(struct nvkm_client **);
int nvkm_client_init(struct nvkm_client *);
int nvkm_client_fini(struct nvkm_client *, bool suspend);
const char *nvkm_client_name(void *obj);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 9e420f6c1a74..6180c3d30287 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -530,14 +530,14 @@ nouveau_drm_device_remove(struct drm_device *dev)
{
struct nouveau_drm *drm = nouveau_drm(dev);
struct nvkm_client *client;
- struct nvkm_object *device;
+ struct nvkm_device *device;
dev->irq_enabled = false;
client = nvxx_client(&drm->client.base);
device = client->device;
drm_put_dev(dev);
- nvkm_object_ref(NULL, &device);
+ nvkm_object_ref(NULL, (struct nvkm_object **)&device);
}
static void
diff --git a/drivers/gpu/drm/nouveau/nouveau_nvif.c b/drivers/gpu/drm/nouveau/nouveau_nvif.c
index ca0ad9d1563d..55eb942847fa 100644
--- a/drivers/gpu/drm/nouveau/nouveau_nvif.c
+++ b/drivers/gpu/drm/nouveau/nouveau_nvif.c
@@ -72,10 +72,8 @@ nvkm_client_suspend(void *priv)
static void
nvkm_client_driver_fini(void *priv)
{
- struct nvkm_object *client = priv;
- nvkm_client_fini(nv_client(client), false);
- atomic_set(&client->refcount, 1);
- nvkm_object_ref(NULL, &client);
+ struct nvkm_client *client = priv;
+ nvkm_client_del(&client);
}
static int
@@ -113,7 +111,7 @@ nvkm_client_driver_init(const char *name, u64 device, const char *cfg,
struct nvkm_client *client;
int ret;
- ret = nvkm_client_create(name, device, cfg, dbg, &client);
+ ret = nvkm_client_new(name, device, cfg, dbg, &client);
*ppriv = client;
if (ret)
return ret;
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)
{
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
index af8f9ccdc8f6..e08418436e0c 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
@@ -308,7 +308,7 @@ nvkm_devobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
oclass = &nvkm_devobj_oclass_super;
/* find the device subdev that matches what the client requested */
- device = nv_device(client->device);
+ device = client->device;
if (args->v0.device != ~0) {
device = nvkm_device_find(args->v0.device);
if (!device)