this is somehow copied from i915

Signed-off-by: Karol Herbst <nouv...@karolherbst.de>
---
 drm/nouveau/nouveau_debugfs.c | 56 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 54 insertions(+), 2 deletions(-)

diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c
index 5392e07..762441f 100644
--- a/drm/nouveau/nouveau_debugfs.c
+++ b/drm/nouveau/nouveau_debugfs.c
@@ -28,6 +28,7 @@
  *  Ben Skeggs <bske...@redhat.com>
  */
 
+#include <linux/debugfs.h>
 #include "nouveau_debugfs.h"
 #include "nouveau_drm.h"
 
@@ -48,17 +49,68 @@ static struct drm_info_list nouveau_debugfs_list[] = {
 };
 #define NOUVEAU_DEBUGFS_ENTRIES ARRAY_SIZE(nouveau_debugfs_list)
 
+static const struct nouveau_debugfs_files {
+       const char *name;
+       const struct file_operations *fops;
+} nouveau_debugfs_files[] = {};
+
+
+static int
+nouveau_debugfs_create_file(struct drm_minor *minor,
+               const struct nouveau_debugfs_files *ndf)
+{
+       struct dentry *ent;
+       struct drm_info_node *node;
+
+       ent = debugfs_create_file(ndf->name, S_IRUGO | S_IWUSR, 
minor->debugfs_root,
+                       minor->dev, ndf->fops);
+
+       if (!ent)
+               return -ENOMEM;
+
+       node = kmalloc(sizeof(*node), GFP_KERNEL);
+       if (node == NULL) {
+               debugfs_remove(ent);
+               return -ENOMEM;
+       }
+
+       node->minor = minor;
+       node->dent = ent;
+       node->info_ent = (const void *)ndf->fops;
+
+       mutex_lock(&minor->debugfs_lock);
+       list_add(&node->list, &minor->debugfs_list);
+       mutex_unlock(&minor->debugfs_lock);
+
+       return 0;
+}
+
 int
 nouveau_debugfs_init(struct drm_minor *minor)
 {
-       drm_debugfs_create_files(nouveau_debugfs_list, NOUVEAU_DEBUGFS_ENTRIES,
+       int i, ret;
+
+       for (i = 0; i < ARRAY_SIZE(nouveau_debugfs_files); i++) {
+               ret = nouveau_debugfs_create_file(minor, 
&nouveau_debugfs_files[i]);
+
+               if (ret)
+                       return ret;
+       }
+
+       return drm_debugfs_create_files(nouveau_debugfs_list, 
NOUVEAU_DEBUGFS_ENTRIES,
                                 minor->debugfs_root, minor);
-       return 0;
 }
 
 void
 nouveau_debugfs_takedown(struct drm_minor *minor)
 {
+       int i;
+
        drm_debugfs_remove_files(nouveau_debugfs_list, NOUVEAU_DEBUGFS_ENTRIES,
                                 minor);
+
+       for (i = 0; i < ARRAY_SIZE(nouveau_debugfs_files); i++) {
+               drm_debugfs_remove_files((struct drm_info_list 
*)nouveau_debugfs_files[i].fops,
+                               1, minor);
+       }
 }
-- 
2.6.1

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to