drm/radeon: fix debugfs handling v3
authorChristian König <deathsimple@vodafone.de>
Mon, 24 Oct 2011 12:54:54 +0000 (14:54 +0200)
committerDave Airlie <airlied@redhat.com>
Tue, 20 Dec 2011 19:28:05 +0000 (19:28 +0000)
Having registered debugfs files globally causes
the files to not show up on the second, third
etc.. card in the system.

v2: fix crash on module unloading
v3: fix space indentation

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_device.c

index c8f4dbd2d17ce1bed480a486263d87f40e41cdce..599361466a24c6bc6a31056bfacb712588550e1c 100644 (file)
@@ -873,6 +873,11 @@ void radeon_test_moves(struct radeon_device *rdev);
 /*
  * Debugfs
  */
+struct radeon_debugfs {
+       struct drm_info_list    *files;
+       unsigned                num_files;
+};
+
 int radeon_debugfs_add_files(struct radeon_device *rdev,
                             struct drm_info_list *files,
                             unsigned nfiles);
@@ -1278,6 +1283,9 @@ struct radeon_device {
        struct drm_file *cmask_filp;
        /* i2c buses */
        struct radeon_i2c_chan *i2c_bus[RADEON_MAX_I2C_BUS];
+       /* debugfs */
+       struct radeon_debugfs   debugfs[RADEON_DEBUGFS_MAX_COMPONENTS];
+       unsigned                debugfs_count;
 };
 
 int radeon_device_init(struct radeon_device *rdev,
index fb347a80486f51106054183b7bfaf56d54a90937..4d66d6868571d490896ea65fa5d0cd7e94ef48ff 100644 (file)
@@ -829,6 +829,8 @@ int radeon_device_init(struct radeon_device *rdev,
        return 0;
 }
 
+static void radeon_debugfs_remove_files(struct radeon_device *rdev);
+
 void radeon_device_fini(struct radeon_device *rdev)
 {
        DRM_INFO("radeon: finishing device.\n");
@@ -843,6 +845,7 @@ void radeon_device_fini(struct radeon_device *rdev)
        rdev->rio_mem = NULL;
        iounmap(rdev->rmmio);
        rdev->rmmio = NULL;
+       radeon_debugfs_remove_files(rdev);
 }
 
 
@@ -992,36 +995,29 @@ int radeon_gpu_reset(struct radeon_device *rdev)
 /*
  * Debugfs
  */
-struct radeon_debugfs {
-       struct drm_info_list    *files;
-       unsigned                num_files;
-};
-static struct radeon_debugfs _radeon_debugfs[RADEON_DEBUGFS_MAX_COMPONENTS];
-static unsigned _radeon_debugfs_count = 0;
-
 int radeon_debugfs_add_files(struct radeon_device *rdev,
                             struct drm_info_list *files,
                             unsigned nfiles)
 {
        unsigned i;
 
-       for (i = 0; i < _radeon_debugfs_count; i++) {
-               if (_radeon_debugfs[i].files == files) {
+       for (i = 0; i < rdev->debugfs_count; i++) {
+               if (rdev->debugfs[i].files == files) {
                        /* Already registered */
                        return 0;
                }
        }
 
-       i = _radeon_debugfs_count + 1;
+       i = rdev->debugfs_count + 1;
        if (i > RADEON_DEBUGFS_MAX_COMPONENTS) {
                DRM_ERROR("Reached maximum number of debugfs components.\n");
                DRM_ERROR("Report so we increase "
                          "RADEON_DEBUGFS_MAX_COMPONENTS.\n");
                return -EINVAL;
        }
-       _radeon_debugfs[_radeon_debugfs_count].files = files;
-       _radeon_debugfs[_radeon_debugfs_count].num_files = nfiles;
-       _radeon_debugfs_count = i;
+       rdev->debugfs[rdev->debugfs_count].files = files;
+       rdev->debugfs[rdev->debugfs_count].num_files = nfiles;
+       rdev->debugfs_count = i;
 #if defined(CONFIG_DEBUG_FS)
        drm_debugfs_create_files(files, nfiles,
                                 rdev->ddev->control->debugfs_root,
@@ -1033,6 +1029,22 @@ int radeon_debugfs_add_files(struct radeon_device *rdev,
        return 0;
 }
 
+static void radeon_debugfs_remove_files(struct radeon_device *rdev)
+{
+#if defined(CONFIG_DEBUG_FS)
+       unsigned i;
+
+       for (i = 0; i < rdev->debugfs_count; i++) {
+               drm_debugfs_remove_files(rdev->debugfs[i].files,
+                                        rdev->debugfs[i].num_files,
+                                        rdev->ddev->control);
+               drm_debugfs_remove_files(rdev->debugfs[i].files,
+                                        rdev->debugfs[i].num_files,
+                                        rdev->ddev->primary);
+       }
+#endif
+}
+
 #if defined(CONFIG_DEBUG_FS)
 int radeon_debugfs_init(struct drm_minor *minor)
 {
@@ -1041,11 +1053,5 @@ int radeon_debugfs_init(struct drm_minor *minor)
 
 void radeon_debugfs_cleanup(struct drm_minor *minor)
 {
-       unsigned i;
-
-       for (i = 0; i < _radeon_debugfs_count; i++) {
-               drm_debugfs_remove_files(_radeon_debugfs[i].files,
-                                        _radeon_debugfs[i].num_files, minor);
-       }
 }
 #endif