Module Name: src
Committed By: riastradh
Date: Mon Aug 27 07:36:07 UTC 2018
Modified Files:
src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core: client.h
object.h
src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine: dma.h
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core:
nouveau_nvkm_core_client.c nouveau_nvkm_core_object.c
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma:
nouveau_nvkm_engine_dma_base.c nouveau_nvkm_engine_dma_user.c
Log Message:
Use our rbtree, which conveniently has find/insert/remove operations.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h \
src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h
cvs rdiff -u -r1.2 -r1.3 \
src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h
cvs rdiff -u -r1.2 -r1.3 \
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c
cvs rdiff -u -r1.2 -r1.3 \
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c
\
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h:1.3 Mon Aug 27 07:35:22 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: client.h,v 1.3 2018/08/27 07:35:22 riastradh Exp $ */
+/* $NetBSD: client.h,v 1.4 2018/08/27 07:36:07 riastradh Exp $ */
#ifndef __NVKM_CLIENT_H__
#define __NVKM_CLIENT_H__
@@ -11,8 +11,13 @@ struct nvkm_client {
u32 debug;
struct nvkm_client_notify *notify[16];
+#ifdef __NetBSD__
+ struct rb_tree objtree;
+ struct rb_tree dmatree;
+#else
struct rb_root objroot;
struct rb_root dmaroot;
+#endif
bool super;
void *data;
@@ -21,6 +26,8 @@ struct nvkm_client {
struct nvkm_vm *vm;
};
+extern const rb_tree_ops_t nvkm_client_dmatree_ops;
+
bool nvkm_client_insert(struct nvkm_client *, struct nvkm_object *);
void nvkm_client_remove(struct nvkm_client *, struct nvkm_object *);
struct nvkm_object *nvkm_client_search(struct nvkm_client *, u64 object);
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h:1.3 Mon Aug 27 07:35:56 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: object.h,v 1.3 2018/08/27 07:35:56 riastradh Exp $ */
+/* $NetBSD: object.h,v 1.4 2018/08/27 07:36:07 riastradh Exp $ */
#ifndef __NVKM_OBJECT_H__
#define __NVKM_OBJECT_H__
@@ -21,6 +21,7 @@ struct nvkm_object {
u64 token;
u64 object;
struct rb_node node;
+ bool on_tree;
};
struct nvkm_object_func {
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h:1.2 Mon Aug 27 04:58:30 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: dma.h,v 1.2 2018/08/27 04:58:30 riastradh Exp $ */
+/* $NetBSD: dma.h,v 1.3 2018/08/27 07:36:07 riastradh Exp $ */
#ifndef __NVKM_DMA_H__
#define __NVKM_DMA_H__
@@ -16,6 +16,7 @@ struct nvkm_dmaobj {
u64 limit;
struct rb_node rb;
+ bool on_tree;
u64 handle; /*XXX HANDLE MERGE */
};
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c:1.2 Mon Aug 27 04:58:30 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: nouveau_nvkm_core_client.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $ */
+/* $NetBSD: nouveau_nvkm_core_client.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
* Authors: Ben Skeggs
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $");
#include <core/client.h>
#include <core/device.h>
@@ -213,13 +213,29 @@ nvkm_client_object_func = {
void
nvkm_client_remove(struct nvkm_client *client, struct nvkm_object *object)
{
+#ifdef __NetBSD__
+ if (object->on_tree) {
+ rb_tree_remove_node(&client->objtree, object);
+ object->on_tree = false;
+ }
+#else
if (!RB_EMPTY_NODE(&object->node))
rb_erase(&object->node, &client->objroot);
+#endif
}
bool
nvkm_client_insert(struct nvkm_client *client, struct nvkm_object *object)
{
+#ifdef __NetBSD__
+ struct nvkm_object *collision;
+
+ collision = rb_tree_insert_node(&client->objtree, object);
+ if (collision != object)
+ return false;
+ object->on_tree = true;
+ return true;
+#else
struct rb_node **ptr = &client->objroot.rb_node;
struct rb_node *parent = NULL;
@@ -239,11 +255,15 @@ nvkm_client_insert(struct nvkm_client *c
rb_link_node(&object->node, parent, ptr);
rb_insert_color(&object->node, &client->objroot);
return true;
+#endif
}
struct nvkm_object *
nvkm_client_search(struct nvkm_client *client, u64 handle)
{
+#ifdef __NetBSD__
+ return rb_tree_find_node(&client->objtree, &handle);
+#else
struct rb_node *node = client->objroot.rb_node;
while (node) {
struct nvkm_object *object =
@@ -257,6 +277,7 @@ nvkm_client_search(struct nvkm_client *c
return object;
}
return NULL;
+#endif
}
int
@@ -292,6 +313,40 @@ nvkm_client_del(struct nvkm_client **pcl
}
}
+#ifdef __NetBSD__
+static int
+compare_object_nodes(void *cookie, const void *va, const void *vb)
+{
+ const struct nvkm_object *oa = va;
+ const struct nvkm_object *ob = vb;
+
+ if (oa->object < ob->object)
+ return -1;
+ if (oa->object > ob->object)
+ return +1;
+ return 0;
+}
+
+static int
+compare_object_key(void *cookie, const void *vo, const void *vk)
+{
+ const struct nvkm_object *o = vo;
+ const u64 *k = vk;
+
+ if (o->object < *k)
+ return -1;
+ if (o->object > *k)
+ return +1;
+ return 0;
+}
+
+static const rb_tree_ops_t nvkm_client_objtree_ops = {
+ .rbto_compare_nodes = compare_object_nodes,
+ .rbto_compare_key = compare_object_key,
+ .rbto_node_offset = offsetof(struct nvkm_object, node),
+};
+#endif
+
int
nvkm_client_new(const char *name, u64 device, const char *cfg,
const char *dbg, struct nvkm_client **pclient)
@@ -307,7 +362,12 @@ nvkm_client_new(const char *name, u64 de
snprintf(client->name, sizeof(client->name), "%s", name);
client->device = device;
client->debug = nvkm_dbgopt(dbg, "CLIENT");
+#ifdef __NetBSD__
+ rb_tree_init(&client->objtree, &nvkm_client_objtree_ops);
+ rb_tree_init(&client->dmatree, &nvkm_client_dmatree_ops);
+#else
client->objroot = RB_ROOT;
client->dmaroot = RB_ROOT;
+#endif
return 0;
}
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c:1.3 Mon Aug 27 07:35:56 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: nouveau_nvkm_core_object.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $ */
+/* $NetBSD: nouveau_nvkm_core_object.c,v 1.4 2018/08/27 07:36:07 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
* Authors: Ben Skeggs
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_object.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_object.c,v 1.4 2018/08/27 07:36:07 riastradh Exp $");
#include <core/object.h>
#include <core/client.h>
@@ -238,7 +238,11 @@ nvkm_object_ctor(const struct nvkm_objec
object->handle = oclass->handle;
INIT_LIST_HEAD(&object->head);
INIT_LIST_HEAD(&object->tree);
+#ifdef __NetBSD__
+ object->on_tree = false;
+#else
RB_CLEAR_NODE(&object->node);
+#endif
WARN_ON(oclass->engine && !object->engine);
}
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c:1.2 Mon Aug 27 04:58:31 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $ */
+/* $NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
* Authors: Ben Skeggs
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $");
#include "priv.h"
@@ -33,9 +33,46 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm
#include <nvif/class.h>
+#ifdef __NetBSD__
+static int
+compare_dmaobj_nodes(void *cookie, const void *va, const void *vb)
+{
+ const struct nvkm_dmaobj *da = va;
+ const struct nvkm_dmaobj *db = vb;
+
+ if (da->handle < db->handle)
+ return -1;
+ if (da->handle > db->handle)
+ return +1;
+ return 0;
+}
+
+static int
+compare_dmaobj_key(void *cookie, const void *vo, const void *vk)
+{
+ const struct nvkm_dmaobj *d = vo;
+ const u64 *k = vk;
+
+ if (d->handle < *k)
+ return -1;
+ if (d->handle > *k)
+ return +1;
+ return 0;
+}
+
+const rb_tree_ops_t nvkm_client_dmatree_ops = {
+ .rbto_compare_nodes = compare_dmaobj_nodes,
+ .rbto_compare_key = compare_dmaobj_key,
+ .rbto_node_offset = offsetof(struct nvkm_dmaobj, rb),
+};
+#endif
+
struct nvkm_dmaobj *
nvkm_dma_search(struct nvkm_dma *dma, struct nvkm_client *client, u64 object)
{
+#ifdef __NetBSD__
+ return rb_tree_find_node(&client->dmatree, &object);
+#else
struct rb_node *node = client->dmaroot.rb_node;
while (node) {
struct nvkm_dmaobj *dmaobj =
@@ -49,6 +86,7 @@ nvkm_dma_search(struct nvkm_dma *dma, st
return dmaobj;
}
return NULL;
+#endif
}
static int
@@ -59,8 +97,12 @@ nvkm_dma_oclass_new(struct nvkm_device *
struct nvkm_dma *dma = nvkm_dma(oclass->engine);
struct nvkm_dmaobj *dmaobj = NULL;
struct nvkm_client *client = oclass->client;
+#ifdef __NetBSD__
+ struct nvkm_dmaobj *collision;
+#else
struct rb_node **ptr = &client->dmaroot.rb_node;
struct rb_node *parent = NULL;
+#endif
int ret;
ret = dma->func->class_new(dma, oclass, data, size, &dmaobj);
@@ -71,6 +113,12 @@ nvkm_dma_oclass_new(struct nvkm_device *
dmaobj->handle = oclass->object;
+#ifdef __NetBSD__
+ collision = rb_tree_insert_node(&client->dmatree, dmaobj);
+ if (collision != dmaobj)
+ /* XXX Don't we have to free this? */
+ return -EEXIST;
+#else
while (*ptr) {
struct nvkm_dmaobj *obj = container_of(*ptr, typeof(*obj), rb);
parent = *ptr;
@@ -85,6 +133,7 @@ nvkm_dma_oclass_new(struct nvkm_device *
rb_link_node(&dmaobj->rb, parent, ptr);
rb_insert_color(&dmaobj->rb, &client->dmaroot);
+#endif
return 0;
}
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c:1.2 Mon Aug 27 04:58:31 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $ */
+/* $NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $ */
/*
* Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
* Authors: Ben Skeggs
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $");
#include "user.h"
@@ -48,8 +48,15 @@ static void *
nvkm_dmaobj_dtor(struct nvkm_object *base)
{
struct nvkm_dmaobj *dmaobj = nvkm_dmaobj(base);
+#ifdef __NetBSD__
+ if (dmaobj->on_tree) {
+ rb_tree_remove_node(&dmaobj->object.client->dmatree, dmaobj);
+ dmaobj->on_tree = false;
+ }
+#else
if (!RB_EMPTY_NODE(&dmaobj->rb))
rb_erase(&dmaobj->rb, &dmaobj->object.client->dmaroot);
+#endif
return dmaobj;
}
@@ -79,7 +86,9 @@ nvkm_dmaobj_ctor(const struct nvkm_dmaob
nvkm_object_ctor(&nvkm_dmaobj_func, oclass, &dmaobj->object);
dmaobj->func = func;
dmaobj->dma = dma;
+#ifndef __NetBSD__
RB_CLEAR_NODE(&dmaobj->rb);
+#endif
nvif_ioctl(parent, "create dma size %d\n", *psize);
if (nvif_unpack(args->v0, 0, 0, true)) {