diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-08-20 04:54:16 (GMT) |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-08-28 02:40:32 (GMT) |
commit | bf81df9be28657eea4aca8c6ab4ed3e69f8a051c (patch) | |
tree | a4a7e6f3d4e46696584c930bb7d6b4b2fd941337 /drivers/gpu/drm/nouveau/nvkm/core/client.c | |
parent | a01ca78c8f118e5a24f1527ecf078ab56ddd4805 (diff) | |
download | linux-bf81df9be28657eea4aca8c6ab4ed3e69f8a051c.tar.xz |
drm/nouveau/nvif: replace path-based object identification
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/core/client.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/core/client.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/client.c b/drivers/gpu/drm/nouveau/nvkm/core/client.c index 7615cdd..bfe5357 100644 --- a/drivers/gpu/drm/nouveau/nvkm/core/client.c +++ b/drivers/gpu/drm/nouveau/nvkm/core/client.c @@ -183,6 +183,55 @@ nvkm_client_oclass = { }, }; +void +nvkm_client_remove(struct nvkm_client *client, struct nvkm_handle *object) +{ + if (!RB_EMPTY_NODE(&object->rb)) + rb_erase(&object->rb, &client->objroot); +} + +bool +nvkm_client_insert(struct nvkm_client *client, struct nvkm_handle *object) +{ + struct rb_node **ptr = &client->objroot.rb_node; + struct rb_node *parent = NULL; + + while (*ptr) { + struct nvkm_handle *this = + container_of(*ptr, typeof(*this), rb); + parent = *ptr; + if (object->handle < this->handle) + ptr = &parent->rb_left; + else + if (object->handle > this->handle) + ptr = &parent->rb_right; + else + return false; + } + + rb_link_node(&object->rb, parent, ptr); + rb_insert_color(&object->rb, &client->objroot); + return true; +} + +struct nvkm_handle * +nvkm_client_search(struct nvkm_client *client, u64 handle) +{ + struct rb_node *node = client->objroot.rb_node; + while (node) { + struct nvkm_handle *object = + container_of(node, typeof(*object), rb); + if (handle < object->handle) + node = node->rb_left; + else + if (handle > object->handle) + node = node->rb_right; + else + return object; + } + return NULL; +} + int nvkm_client_fini(struct nvkm_client *client, bool suspend) { @@ -256,6 +305,7 @@ nvkm_client_new(const char *name, u64 device, const char *cfg, client->device = device; snprintf(client->name, sizeof(client->name), "%s", name); client->debug = nvkm_dbgopt(dbg, "CLIENT"); + client->objroot = RB_ROOT; return 0; } |