drm/nouveau/debugfs: we need a ctrl object for debugfs
authorKarol Herbst <nouveau@karolherbst.de>
Thu, 30 Jul 2015 09:52:23 +0000 (11:52 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 11 Jan 2016 01:28:25 +0000 (11:28 +1000)
Signed-off-by: Karol Herbst <nouveau@karolherbst.de>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_debugfs.c
drivers/gpu/drm/nouveau/nouveau_debugfs.h
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drm.h

index 5085c98181401a21b765a58d7295a149aa3a7900..fd4140be5472702f61b9db06ee4e39ee023ebf55 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include <linux/debugfs.h>
+#include <nvif/class.h>
 #include "nouveau_debugfs.h"
 #include "nouveau_drm.h"
 
@@ -112,3 +113,30 @@ nouveau_drm_debugfs_cleanup(struct drm_minor *minor)
                                         1, minor);
        }
 }
+
+int
+nouveau_debugfs_init(struct nouveau_drm *drm)
+{
+       int ret;
+
+       drm->debugfs = kzalloc(sizeof(*drm->debugfs), GFP_KERNEL);
+       if (!drm->debugfs)
+               return -ENOMEM;
+
+       ret = nvif_object_init(&drm->device.object, 0, NVIF_CLASS_CONTROL,
+                              NULL, 0, &drm->debugfs->ctrl);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+void
+nouveau_debugfs_fini(struct nouveau_drm *drm)
+{
+       if (drm->debugfs && drm->debugfs->ctrl.priv)
+               nvif_object_fini(&drm->debugfs->ctrl);
+
+       kfree(drm->debugfs);
+       drm->debugfs = NULL;
+}
index 42d65c9d1db7ebd53f66e91553746a123bed5bfd..52c7161297d798ff6305db56816a4690f825f3aa 100644 (file)
@@ -4,8 +4,23 @@
 #include <drm/drmP.h>
 
 #if defined(CONFIG_DEBUG_FS)
+
+#include "nouveau_drm.h"
+
+struct nouveau_debugfs {
+       struct nvif_object ctrl;
+};
+
+static inline struct nouveau_debugfs *
+nouveau_debugfs(struct drm_device *dev)
+{
+       return nouveau_drm(dev)->debugfs;
+}
+
 extern int  nouveau_drm_debugfs_init(struct drm_minor *);
 extern void nouveau_drm_debugfs_cleanup(struct drm_minor *);
+extern int  nouveau_debugfs_init(struct nouveau_drm *);
+extern void nouveau_debugfs_fini(struct nouveau_drm *);
 #else
 static inline int
 nouveau_drm_debugfs_init(struct drm_minor *minor)
@@ -18,6 +33,17 @@ nouveau_drm_debugfs_cleanup(struct drm_minor *minor)
 {
 }
 
+static inline int
+nouveau_debugfs_init(struct nouveau_drm *)
+{
+       return 0;
+}
+
+static inline void
+nouveau_debugfs_fini(struct nouveau_drm *)
+{
+}
+
 #endif
 
 #endif
index f75111138cf694e188a76355afa629d9279c0473..7d336a42da0280023088009a607c5eb318da4871 100644 (file)
@@ -453,6 +453,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
                        goto fail_dispinit;
        }
 
+       nouveau_debugfs_init(drm);
        nouveau_sysfs_init(dev);
        nouveau_hwmon_init(dev);
        nouveau_accel_init(drm);
@@ -492,6 +493,7 @@ nouveau_drm_unload(struct drm_device *dev)
        nouveau_accel_fini(drm);
        nouveau_hwmon_fini(dev);
        nouveau_sysfs_fini(dev);
+       nouveau_debugfs_fini(drm);
 
        if (dev->mode_config.num_crtc)
                nouveau_display_fini(dev);
index a02813e994ec574d57b695c310f6c60e443584f2..feecb90e5c3e017c72d29024acaddbbac9ead0cb 100644 (file)
@@ -165,6 +165,7 @@ struct nouveau_drm {
        /* power management */
        struct nouveau_hwmon *hwmon;
        struct nouveau_sysfs *sysfs;
+       struct nouveau_debugfs *debugfs;
 
        /* display power reference */
        bool have_disp_power_ref;