drm/nouveau/client: tidy ctor/dtor interfaces
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
47b2505efb
commit
76ecea5b4b
|
@ -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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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,
|
||||||
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,71 +176,13 @@ 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
|
|
||||||
nvkm_client_create_(const char *name, u64 devname, const char *cfg,
|
|
||||||
const char *dbg, int length, void **pobject)
|
|
||||||
{
|
|
||||||
struct nvkm_object *device;
|
|
||||||
struct nvkm_client *client;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
device = (void *)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;
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = nvkm_handle_create(nv_object(client), ~0, ~0, nv_object(client),
|
|
||||||
&client->root);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* prevent init/fini being called, os in in charge of this */
|
|
||||||
atomic_set(&nv_object(client)->usecount, 2);
|
|
||||||
|
|
||||||
nvkm_object_ref(device, &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
|
int
|
||||||
nvkm_client_fini(struct nvkm_client *client, bool suspend)
|
nvkm_client_fini(struct nvkm_client *client, bool suspend)
|
||||||
{
|
{
|
||||||
|
@ -257,6 +199,68 @@ nvkm_client_fini(struct nvkm_client *client, bool suspend)
|
||||||
return 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_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, NULL,
|
||||||
|
(1ULL << NVDEV_ENGINE_DEVICE),
|
||||||
|
&client);
|
||||||
|
*pclient = client;
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = nvkm_handle_create(nv_object(client), ~0, ~0, nv_object(client),
|
||||||
|
&client->root);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
snprintf(client->name, sizeof(client->name), "%s", name);
|
||||||
|
client->debug = nvkm_dbgopt(dbg, "CLIENT");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
|
|
Loading…
Reference in a new issue