Commit 24bd0930 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/client: convert to new-style nvkm_object



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 61570911
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -23,6 +23,6 @@ int nvif_client_resume(struct nvif_client *);
#include <core/client.h>
#define nvxx_client(a) ({                                                      \
	struct nvif_client *_client = (a);                                     \
	nvkm_client(_client->object.priv);                                     \
	(struct nvkm_client *)_client->object.priv;                            \
})
#endif
+18 −18
Original line number Diff line number Diff line
#ifndef __NVKM_CLIENT_H__
#define __NVKM_CLIENT_H__
#include <core/namedb.h>
#include <core/object.h>

struct nvkm_client {
	struct nvkm_namedb namedb;
	struct nvkm_handle *root;
	u64 device;
	struct nvkm_object object;
	char name[32];
	u64 device;
	u32 debug;
	struct nvkm_vm *vm;

	struct nvkm_client_notify *notify[16];
	struct rb_root objroot;

	struct nvkm_handle *root;

	bool super;
	void *data;

	int (*ntfy)(const void *, u32, const void *, u32);
	struct nvkm_client_notify *notify[16];

	struct rb_root objroot;
	struct nvkm_vm *vm;
};

bool nvkm_client_insert(struct nvkm_client *, struct nvkm_handle *);
void nvkm_client_remove(struct nvkm_client *, struct nvkm_handle *);
struct nvkm_handle *nvkm_client_search(struct nvkm_client *, u64 handle);

static inline struct nvkm_client *
nvkm_client(struct nvkm_object *object)
{
	while (object && object->parent)
		object = object->parent;
	if (object && nv_iclass(object, NV_CLIENT_CLASS))
		return container_of(object, struct nvkm_client, namedb.parent.object);
	return NULL;
}

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 **);
@@ -39,6 +31,14 @@ int nvkm_client_init(struct nvkm_client *);
int  nvkm_client_fini(struct nvkm_client *, bool suspend);
const char *nvkm_client_name(void *obj);

static inline struct nvkm_client *
nvkm_client(struct nvkm_object *object)
{
	while (object && object->parent)
		object = object->parent;
	return container_of(object, struct nvkm_client, object);
}

int nvkm_client_notify_new(struct nvkm_object *, struct nvkm_event *,
			   void *data, u32 size);
int nvkm_client_notify_del(struct nvkm_client *, int index);
+1 −0
Original line number Diff line number Diff line
#ifndef __NVKM_ENGCTX_H__
#define __NVKM_ENGCTX_H__
#include <core/gpuobj.h>
#include <core/parent.h>

#include <subdev/mmu.h>

+43 −29
Original line number Diff line number Diff line
@@ -176,11 +176,35 @@ nvkm_client_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
	return -EINVAL;
}

static struct nvkm_oclass
nvkm_client_oclass = {
	.ofuncs = &(struct nvkm_ofuncs) {
static int
nvkm_client_child_new(const struct nvkm_oclass *oclass,
		      void *data, u32 size, struct nvkm_object **pobject)
{
	static struct nvkm_oclass devobj = {
		.handle = NV_DEVICE,
		.ofuncs = &nvkm_udevice_ofuncs,
	};
	return nvkm_object_old(oclass->parent, NULL, &devobj, data, size, pobject);
}

static int
nvkm_client_child_get(struct nvkm_object *object, int index,
		      struct nvkm_oclass *oclass)
{
	if (index == 0) {
		oclass->base.oclass = NV_DEVICE;
		oclass->base.minver = 0;
		oclass->base.maxver = 0;
		oclass->ctor = nvkm_client_child_new;
		return 0;
	}
	return -EINVAL;
}

static const struct nvkm_object_func
nvkm_client_object_func = {
	.mthd = nvkm_client_mthd,
	},
	.sclass = nvkm_client_child_get,
};

void
@@ -235,7 +259,7 @@ nvkm_client_search(struct nvkm_client *client, u64 handle)
int
nvkm_client_fini(struct nvkm_client *client, bool suspend)
{
	struct nvkm_object *object = &client->namedb.parent.object;
	struct nvkm_object *object = &client->object;
	const char *name[2] = { "fini", "suspend" };
	int ret, i;
	nvif_trace(object, "%s running\n", name[suspend]);
@@ -251,7 +275,7 @@ nvkm_client_fini(struct nvkm_client *client, bool suspend)
int
nvkm_client_init(struct nvkm_client *client)
{
	struct nvkm_object *object = &client->namedb.parent.object;
	struct nvkm_object *object = &client->object;
	int ret;
	nvif_trace(object, "init running\n");
	ret = nvkm_handle_init(client->root);
@@ -269,43 +293,33 @@ nvkm_client_del(struct nvkm_client **pclient)
		for (i = 0; i < ARRAY_SIZE(client->notify); i++)
			nvkm_client_notify_del(client, i);
		nvkm_handle_destroy(client->root);
		nvkm_namedb_destroy(&client->namedb);
		kfree(*pclient);
		*pclient = NULL;
	}
}

static struct nvkm_oclass
nvkm_client_sclass[] = {
	{ NV_DEVICE, &nvkm_udevice_ofuncs },
	{}
};

int
nvkm_client_new(const char *name, u64 device, const char *cfg,
		const char *dbg, struct nvkm_client **pclient)
{
	struct nvkm_oclass oclass = {};
	struct nvkm_client *client;
	int ret;

	ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass,
				 NV_CLIENT_CLASS, nvkm_client_sclass,
				 0, &client);
	*pclient = client;
	if (ret)
		return ret;

	ret = nvkm_handle_create(NULL, ~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);
	if (!(client = *pclient = kzalloc(sizeof(*client), GFP_KERNEL)))
		return -ENOMEM;
	oclass.client = client;

	client->device = device;
	nvkm_object_ctor(&nvkm_client_object_func, &oclass, &client->object);
	snprintf(client->name, sizeof(client->name), "%s", name);
	client->device = device;
	client->debug = nvkm_dbgopt(dbg, "CLIENT");
	client->objroot = RB_ROOT;
	return 0;

	ret = nvkm_handle_create(NULL, ~0, &client->object, &client->root);
	if (ret)
		nvkm_client_del(pclient);
	return ret;
}

const char *
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
 */
#include <core/handle.h>
#include <core/client.h>
#include <core/namedb.h>

#define hprintk(h,l,f,a...) do {                                               \
	struct nvkm_handle *p = (h)->parent; u32 n = p ? p->name : ~0;         \
Loading