Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

drm/nouveau/client: tidy ctor/dtor interfaces



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 47b2505e
Loading
Loading
Loading
Loading
+4 −9
Original line number Original line Diff line number Diff line
@@ -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);
+2 −2
Original line number Original line Diff line number Diff line
@@ -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
+3 −5
Original line number Original line Diff line number Diff line
@@ -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;
+54 −50
Original line number Original line Diff line number Diff line
@@ -176,43 +176,73 @@ nvkm_client_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
	return -EINVAL;
	return -EINVAL;
}
}


static void
static struct nvkm_oclass
nvkm_client_dtor(struct nvkm_object *object)
nvkm_client_oclass = {
	.ofuncs = &(struct nvkm_ofuncs) {
		.mthd = nvkm_client_mthd,
	},
};

int
nvkm_client_fini(struct nvkm_client *client, bool suspend)
{
{
	struct nvkm_client *client = (void *)object;
	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;
	int i;
	if (client) {
		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, &client->device);
		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;
	}
}
}

static struct nvkm_oclass
nvkm_client_oclass = {
	.ofuncs = &(struct nvkm_ofuncs) {
		.dtor = nvkm_client_dtor,
		.mthd = nvkm_client_mthd,
	},
};


int
int
nvkm_client_create_(const char *name, u64 devname, const char *cfg,
nvkm_client_new(const char *name, u64 devname, const char *cfg,
		    const char *dbg, int length, void **pobject)
		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,
	/* 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)
{
{
+1 −1
Original line number Original line Diff line number Diff line
@@ -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)