Commit 76ecea5b authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/client: tidy ctor/dtor interfaces

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 47b2505e
...@@ -5,7 +5,7 @@ ...@@ -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_object *device; struct nvkm_device *device;
char name[32]; char name[32];
u32 debug; u32 debug;
struct nvkm_vm *vm; struct nvkm_vm *vm;
...@@ -34,14 +34,9 @@ nvkm_client(void *obj) ...@@ -34,14 +34,9 @@ nvkm_client(void *obj)
return (void *)client; return (void *)client;
} }
#define nvkm_client_create(n,c,oc,od,d) \ int nvkm_client_new(const char *name, u64 device, const char *cfg,
nvkm_client_create_((n), (c), (oc), (od), sizeof(**d), (void **)d) const char *dbg, struct nvkm_client **);
void nvkm_client_del(struct nvkm_client **);
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_init(struct nvkm_client *); int nvkm_client_init(struct nvkm_client *);
int nvkm_client_fini(struct nvkm_client *, bool suspend); int nvkm_client_fini(struct nvkm_client *, bool suspend);
const char *nvkm_client_name(void *obj); const char *nvkm_client_name(void *obj);
......
...@@ -530,14 +530,14 @@ nouveau_drm_device_remove(struct drm_device *dev) ...@@ -530,14 +530,14 @@ nouveau_drm_device_remove(struct drm_device *dev)
{ {
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct nvkm_client *client; struct nvkm_client *client;
struct nvkm_object *device; struct nvkm_device *device;
dev->irq_enabled = false; dev->irq_enabled = false;
client = nvxx_client(&drm->client.base); client = nvxx_client(&drm->client.base);
device = client->device; device = client->device;
drm_put_dev(dev); drm_put_dev(dev);
nvkm_object_ref(NULL, &device); nvkm_object_ref(NULL, (struct nvkm_object **)&device);
} }
static void static void
......
...@@ -72,10 +72,8 @@ nvkm_client_suspend(void *priv) ...@@ -72,10 +72,8 @@ nvkm_client_suspend(void *priv)
static void static void
nvkm_client_driver_fini(void *priv) nvkm_client_driver_fini(void *priv)
{ {
struct nvkm_object *client = priv; struct nvkm_client *client = priv;
nvkm_client_fini(nv_client(client), false); nvkm_client_del(&client);
atomic_set(&client->refcount, 1);
nvkm_object_ref(NULL, &client);
} }
static int static int
...@@ -113,7 +111,7 @@ nvkm_client_driver_init(const char *name, u64 device, const char *cfg, ...@@ -113,7 +111,7 @@ nvkm_client_driver_init(const char *name, u64 device, const char *cfg,
struct nvkm_client *client; struct nvkm_client *client;
int ret; int ret;
ret = nvkm_client_create(name, device, cfg, dbg, &client); ret = nvkm_client_new(name, device, cfg, dbg, &client);
*ppriv = client; *ppriv = client;
if (ret) if (ret)
return ret; return ret;
......
...@@ -176,43 +176,73 @@ nvkm_client_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size) ...@@ -176,43 +176,73 @@ nvkm_client_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
return -EINVAL; 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 static struct nvkm_oclass
nvkm_client_oclass = { nvkm_client_oclass = {
.ofuncs = &(struct nvkm_ofuncs) { .ofuncs = &(struct nvkm_ofuncs) {
.dtor = nvkm_client_dtor,
.mthd = nvkm_client_mthd, .mthd = nvkm_client_mthd,
}, },
}; };
int int
nvkm_client_create_(const char *name, u64 devname, const char *cfg, nvkm_client_fini(struct nvkm_client *client, bool suspend)
const char *dbg, int length, void **pobject) {
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; struct nvkm_client *client;
int ret; int ret;
device = (void *)nvkm_device_find(devname); device = nvkm_device_find(devname);
if (!device) if (!device)
return -ENODEV; return -ENODEV;
ret = nvkm_namedb_create_(NULL, NULL, &nvkm_client_oclass, ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass,
NV_CLIENT_CLASS, NULL, NV_CLIENT_CLASS, NULL,
(1ULL << NVDEV_ENGINE_DEVICE), (1ULL << NVDEV_ENGINE_DEVICE),
length, pobject); &client);
client = *pobject; *pclient = client;
if (ret) if (ret)
return ret; return ret;
...@@ -224,39 +254,13 @@ nvkm_client_create_(const char *name, u64 devname, const char *cfg, ...@@ -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 */ /* 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, &client->device); nvkm_object_ref(&device->engine.subdev.object,
(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;
} }
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 * const char *
nvkm_client_name(void *obj) nvkm_client_name(void *obj)
{ {
......
...@@ -308,7 +308,7 @@ nvkm_devobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine, ...@@ -308,7 +308,7 @@ nvkm_devobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
oclass = &nvkm_devobj_oclass_super; oclass = &nvkm_devobj_oclass_super;
/* find the device subdev that matches what the client requested */ /* find the device subdev that matches what the client requested */
device = nv_device(client->device); 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) if (!device)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment