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

Commit 524bdbf2 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/core: prepare for new-style objects



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 6cf813fb
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -23,13 +23,12 @@ 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(void *obj)
nvkm_client(struct nvkm_object *object)
{
	struct nvkm_object *client = nv_object(obj);
	while (client && client->parent)
		client = client->parent;
	if (client && nv_iclass(client, NV_CLIENT_CLASS))
		return (void *)client;
	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;
}

+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ struct nvkm_handle {
	u64 handle;
};

int  nvkm_handle_create(struct nvkm_object *, u32 parent, u32 handle,
int  nvkm_handle_create(struct nvkm_handle *, u32 handle,
			struct nvkm_object *, struct nvkm_handle **);
void nvkm_handle_destroy(struct nvkm_handle *);
int  nvkm_handle_init(struct nvkm_handle *);
+1 −2
Original line number Diff line number Diff line
@@ -294,8 +294,7 @@ nvkm_client_new(const char *name, u64 device, const char *cfg,
	if (ret)
		return ret;

	ret = nvkm_handle_create(nv_object(client), ~0, ~0, nv_object(client),
				 &client->root);
	ret = nvkm_handle_create(NULL, ~0, nv_object(client), &client->root);
	if (ret)
		return ret;

+1 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ void
nvkm_engctx_destroy(struct nvkm_engctx *engctx)
{
	struct nvkm_engine *engine = engctx->gpuobj.object.engine;
	struct nvkm_client *client = nvkm_client(engctx);
	struct nvkm_client *client = nvkm_client(&engctx->gpuobj.object);
	unsigned long save;

	nvkm_gpuobj_unmap(&engctx->vma);
+24 −24
Original line number Diff line number Diff line
@@ -94,15 +94,15 @@ nvkm_handle_fini(struct nvkm_handle *handle, bool suspend)
}

int
nvkm_handle_create(struct nvkm_object *parent, u32 _parent, u32 _handle,
nvkm_handle_create(struct nvkm_handle *parent, u32 _handle,
		   struct nvkm_object *object, struct nvkm_handle **phandle)
{
	struct nvkm_object *namedb;
	struct nvkm_handle *handle;
	int ret;

	namedb = parent;
	while (!nv_iclass(namedb, NV_NAMEDB_CLASS))
	namedb = parent ? parent->object : NULL;
	while (namedb && !nv_iclass(namedb, NV_NAMEDB_CLASS))
		namedb = namedb->parent;

	handle = kzalloc(sizeof(*handle), GFP_KERNEL);
@@ -114,15 +114,23 @@ nvkm_handle_create(struct nvkm_object *parent, u32 _parent, u32 _handle,
	handle->name = _handle;
	handle->priv = ~0;
	RB_CLEAR_NODE(&handle->rb);
	handle->parent = parent;
	nvkm_object_ref(object, &handle->object);

	ret = nvkm_namedb_insert(nv_namedb(namedb), _handle, object, handle);
	if (namedb) {
		ret = nvkm_namedb_insert(nv_namedb(namedb), _handle,
					 object, handle);
		if (ret) {
			kfree(handle);
			return ret;
		}
	}

	if (nv_parent(parent)->object_attach) {
		ret = nv_parent(parent)->object_attach(parent, object, _handle);
	if (parent) {
		if (nv_iclass(parent->object, NV_PARENT_CLASS) &&
		    nv_parent(parent->object)->object_attach) {
			ret = nv_parent(parent->object)->
				object_attach(parent->object, object, _handle);
			if (ret < 0) {
				nvkm_handle_destroy(handle);
				return ret;
@@ -131,15 +139,7 @@ nvkm_handle_create(struct nvkm_object *parent, u32 _parent, u32 _handle,
			handle->priv = ret;
		}

	if (object != namedb) {
		while (!nv_iclass(namedb, NV_CLIENT_CLASS))
			namedb = namedb->parent;

		handle->parent = nvkm_namedb_get(nv_namedb(namedb), _parent);
		if (handle->parent) {
		list_add(&handle->head, &handle->parent->tree);
			nvkm_namedb_put(handle->parent);
		}
	}

	hprintk(handle, TRACE, "created\n");
Loading