All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/3] drm/amd/display: do not use drm middle layer for debugfs
@ 2021-02-15 12:34 Nirmoy Das
  2021-02-15 12:34 ` [PATCH v2 2/3] drm/amd/pm: " Nirmoy Das
  2021-02-15 12:34 ` [PATCH v2 3/3] drm/amdgpu: " Nirmoy Das
  0 siblings, 2 replies; 4+ messages in thread
From: Nirmoy Das @ 2021-02-15 12:34 UTC (permalink / raw)
  To: Christian.Koenig; +Cc: Nirmoy Das, amd-gfx

Use debugfs API directly instead of drm middle layer.

v2: * checkpatch.pl: use '0444' instead of S_IRUGO.
    * remove S_IFREG from mode.
    * remove mode variable.

Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |  6 +--
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 45 +++++++------------
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.h |  2 +-
 3 files changed, 20 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index 55db646d0ba4..60b2f2d4ca80 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -1642,10 +1642,8 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
 		DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
 
 #if defined(CONFIG_DRM_AMD_DC)
-	if (amdgpu_device_has_dc_support(adev)) {
-		if (dtn_debugfs_init(adev))
-			DRM_ERROR("amdgpu: failed initialize dtn debugfs support.\n");
-	}
+	if (amdgpu_device_has_dc_support(adev))
+		dtn_debugfs_init(adev);
 #endif
 
 	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index 360952129b6d..704aa8cb668e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@ -25,8 +25,6 @@
 
 #include <linux/uaccess.h>
 
-#include <drm/drm_debugfs.h>
-
 #include "dc.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -2450,11 +2448,9 @@ static ssize_t dtn_log_write(
  * As written to display, taking ABM and backlight lut into account.
  * Ranges from 0x0 to 0x10000 (= 100% PWM)
  */
-static int current_backlight_read(struct seq_file *m, void *data)
+static int current_backlight_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
 	struct amdgpu_display_manager *dm = &adev->dm;
 
 	unsigned int backlight = dc_link_get_backlight_level(dm->backlight_link);
@@ -2468,11 +2464,9 @@ static int current_backlight_read(struct seq_file *m, void *data)
  * As written to display, taking ABM and backlight lut into account.
  * Ranges from 0x0 to 0x10000 (= 100% PWM)
  */
-static int target_backlight_read(struct seq_file *m, void *data)
+static int target_backlight_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
 	struct amdgpu_display_manager *dm = &adev->dm;
 
 	unsigned int backlight = dc_link_get_target_backlight_pwm(dm->backlight_link);
@@ -2481,10 +2475,10 @@ static int target_backlight_read(struct seq_file *m, void *data)
 	return 0;
 }
 
-static int mst_topo(struct seq_file *m, void *unused)
+static int mst_topo_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct drm_device *dev = adev_to_drm(adev);
 	struct drm_connector *connector;
 	struct drm_connector_list_iter conn_iter;
 	struct amdgpu_dm_connector *aconnector;
@@ -2504,12 +2498,6 @@ static int mst_topo(struct seq_file *m, void *unused)
 	return 0;
 }
 
-static const struct drm_info_list amdgpu_dm_debugfs_list[] = {
-	{"amdgpu_current_backlight_pwm", &current_backlight_read},
-	{"amdgpu_target_backlight_pwm", &target_backlight_read},
-	{"amdgpu_mst_topology", &mst_topo},
-};
-
 /*
  * Sets the force_timing_sync debug optino from the given string.
  * All connected displays will be force synchronized immediately.
@@ -2568,10 +2556,13 @@ static int visual_confirm_get(void *data, u64 *val)
 	return 0;
 }
 
+DEFINE_SHOW_ATTRIBUTE(current_backlight);
+DEFINE_SHOW_ATTRIBUTE(target_backlight);
+DEFINE_SHOW_ATTRIBUTE(mst_topo);
 DEFINE_DEBUGFS_ATTRIBUTE(visual_confirm_fops, visual_confirm_get,
 			 visual_confirm_set, "%llu\n");
 
-int dtn_debugfs_init(struct amdgpu_device *adev)
+void dtn_debugfs_init(struct amdgpu_device *adev)
 {
 	static const struct file_operations dtn_log_fops = {
 		.owner = THIS_MODULE,
@@ -2582,13 +2573,13 @@ int dtn_debugfs_init(struct amdgpu_device *adev)
 
 	struct drm_minor *minor = adev_to_drm(adev)->primary;
 	struct dentry *root = minor->debugfs_root;
-	int ret;
-
-	ret = amdgpu_debugfs_add_files(adev, amdgpu_dm_debugfs_list,
-				ARRAY_SIZE(amdgpu_dm_debugfs_list));
-	if (ret)
-		return ret;
 
+	debugfs_create_file("amdgpu_current_backlight_pwm", 0444,
+			    root, adev, &current_backlight_fops);
+	debugfs_create_file("amdgpu_target_backlight_pwm", 0444,
+			    root, adev, &target_backlight_fops);
+	debugfs_create_file("amdgpu_mst_topology", 0444, root,
+			    adev, &mst_topo_fops);
 	debugfs_create_file("amdgpu_dm_dtn_log", 0644, root, adev,
 			    &dtn_log_fops);
 
@@ -2603,6 +2594,4 @@ int dtn_debugfs_init(struct amdgpu_device *adev)
 
 	debugfs_create_file_unsafe("amdgpu_dm_force_timing_sync", 0644, root,
 				   adev, &force_timing_sync_ops);
-
-	return 0;
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.h
index 5e5b2b2afa31..32f85c2b608f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.h
@@ -30,6 +30,6 @@
 #include "amdgpu_dm.h"
 
 void connector_debugfs_init(struct amdgpu_dm_connector *connector);
-int dtn_debugfs_init(struct amdgpu_device *adev);
+void dtn_debugfs_init(struct amdgpu_device *adev);
 
 #endif
-- 
2.30.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/3] drm/amd/pm: do not use drm middle layer for debugfs
  2021-02-15 12:34 [PATCH v2 1/3] drm/amd/display: do not use drm middle layer for debugfs Nirmoy Das
@ 2021-02-15 12:34 ` Nirmoy Das
  2021-02-15 12:34 ` [PATCH v2 3/3] drm/amdgpu: " Nirmoy Das
  1 sibling, 0 replies; 4+ messages in thread
From: Nirmoy Das @ 2021-02-15 12:34 UTC (permalink / raw)
  To: Christian.Koenig; +Cc: Nirmoy Das, amd-gfx

Use debugfs API directly instead of drm middle layer.

v2: * checkpatch.pl: use '0444' instead of S_IRUGO.
    * remove S_IFREG from mode.
    * remove mode variable.

Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c |  6 +----
 drivers/gpu/drm/amd/pm/amdgpu_pm.c          | 25 ++++++++++-----------
 drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h      |  2 +-
 3 files changed, 14 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index 60b2f2d4ca80..719ae65ad633 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -1616,11 +1616,7 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
 		return r;
 	}
 
-	r = amdgpu_debugfs_pm_init(adev);
-	if (r) {
-		DRM_ERROR("Failed to register debugfs file for dpm!\n");
-		return r;
-	}
+	amdgpu_debugfs_pm_init(adev);
 
 	if (amdgpu_debugfs_sa_init(adev)) {
 		dev_err(adev->dev, "failed to register debugfs file for SA\n");
diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index 5fa65f191a37..b770dd634ab6 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -23,8 +23,6 @@
  *          Alex Deucher <alexdeucher@gmail.com>
  */
 
-#include <drm/drm_debugfs.h>
-
 #include "amdgpu.h"
 #include "amdgpu_drv.h"
 #include "amdgpu_pm.h"
@@ -3784,11 +3782,10 @@ static void amdgpu_parse_cg_state(struct seq_file *m, u32 flags)
 			   (flags & clocks[i].flag) ? "On" : "Off");
 }
 
-static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
+static int amdgpu_debugfs_pm_info_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct drm_device *dev = adev_to_drm(adev);
 	u32 flags = 0;
 	int r;
 
@@ -3836,16 +3833,18 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
 	return r;
 }
 
-static const struct drm_info_list amdgpu_pm_info_list[] = {
-	{"amdgpu_pm_info", amdgpu_debugfs_pm_info, 0, NULL},
-};
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_pm_info);
+
 #endif
 
-int amdgpu_debugfs_pm_init(struct amdgpu_device *adev)
+void amdgpu_debugfs_pm_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	return amdgpu_debugfs_add_files(adev, amdgpu_pm_info_list, ARRAY_SIZE(amdgpu_pm_info_list));
-#else
-	return 0;
+	struct drm_minor *minor = adev_to_drm(adev)->primary;
+	struct dentry *root = minor->debugfs_root;
+
+	debugfs_create_file("amdgpu_pm_info", 0444, root, adev,
+			    &amdgpu_debugfs_pm_info_fops);
+
 #endif
 }
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h
index 45a22e101d15..a920515e2274 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h
@@ -84,6 +84,6 @@ int amdgpu_pm_virt_sysfs_init(struct amdgpu_device *adev);
 void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev);
 void amdgpu_pm_virt_sysfs_fini(struct amdgpu_device *adev);
 
-int amdgpu_debugfs_pm_init(struct amdgpu_device *adev);
+void amdgpu_debugfs_pm_init(struct amdgpu_device *adev);
 
 #endif
-- 
2.30.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 3/3] drm/amdgpu: do not use drm middle layer for debugfs
  2021-02-15 12:34 [PATCH v2 1/3] drm/amd/display: do not use drm middle layer for debugfs Nirmoy Das
  2021-02-15 12:34 ` [PATCH v2 2/3] drm/amd/pm: " Nirmoy Das
@ 2021-02-15 12:34 ` Nirmoy Das
  2021-02-15 13:40   ` Christian König
  1 sibling, 1 reply; 4+ messages in thread
From: Nirmoy Das @ 2021-02-15 12:34 UTC (permalink / raw)
  To: Christian.Koenig; +Cc: Nirmoy Das, amd-gfx

Use debugfs API directly instead of drm middle layer.

This also includes following debugfs file output changes:
1 amdgpu_evict_vram/amdgpu_evict_gtt output will not contain any braces.
  e.g. (0) --> 0
2 amdgpu_gpu_recover output will print return value of
  amdgpu_device_gpu_recover() instead of not so important "gpu recover"
  message.

v2: * checkpatch.pl: use '0444' instead of S_IRUGO.
    * remove S_IFREG from mode.
    * remove mode variable.

Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h         |   3 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 155 +++++++-------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h |  14 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c   |  46 +++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     |  22 +--
 drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c      |  23 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c     |  24 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.h  |   2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c     | 131 +++++++++++++----
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h     |   2 +-
 10 files changed, 205 insertions(+), 217 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index e3d4d2dcb3a0..9bf7f494699d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -795,8 +795,7 @@ struct amdgpu_device {
 	bool				accel_working;
 	struct notifier_block		acpi_nb;
 	struct amdgpu_i2c_chan		*i2c_bus[AMDGPU_MAX_I2C_BUS];
-	struct amdgpu_debugfs		debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
-	unsigned			debugfs_count;
+	struct debugfs_blob_wrapper     debugfs_vbios_blob;
 	struct amdgpu_atif		*atif;
 	struct amdgpu_atcs		atcs;
 	struct mutex			srbm_mutex;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index 719ae65ad633..8d14e5129886 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -28,7 +28,6 @@
 #include <linux/uaccess.h>
 #include <linux/pm_runtime.h>
 #include <linux/poll.h>
-#include <drm/drm_debugfs.h>
 
 #include "amdgpu.h"
 #include "amdgpu_pm.h"
@@ -38,45 +37,6 @@
 #include "amdgpu_securedisplay.h"
 #include "amdgpu_fw_attestation.h"
 
-/**
- * amdgpu_debugfs_add_files - Add simple debugfs entries
- *
- * @adev:  Device to attach debugfs entries to
- * @files:  Array of function callbacks that respond to reads
- * @nfiles: Number of callbacks to register
- *
- */
-int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
-			     const struct drm_info_list *files,
-			     unsigned nfiles)
-{
-	unsigned i;
-
-	for (i = 0; i < adev->debugfs_count; i++) {
-		if (adev->debugfs[i].files == files) {
-			/* Already registered */
-			return 0;
-		}
-	}
-
-	i = adev->debugfs_count + 1;
-	if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
-		DRM_ERROR("Reached maximum number of debugfs components.\n");
-		DRM_ERROR("Report so we increase "
-			  "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
-		return -EINVAL;
-	}
-	adev->debugfs[adev->debugfs_count].files = files;
-	adev->debugfs[adev->debugfs_count].num_files = nfiles;
-	adev->debugfs_count = i;
-#if defined(CONFIG_DEBUG_FS)
-	drm_debugfs_create_files(files, nfiles,
-				 adev_to_drm(adev)->primary->debugfs_root,
-				 adev_to_drm(adev)->primary);
-#endif
-	return 0;
-}
-
 int amdgpu_debugfs_wait_dump(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
@@ -1233,16 +1193,15 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 	return 0;
 }
 
-static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
+static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct drm_device *dev = adev_to_drm(adev);
 	int r = 0, i;
 
 	r = pm_runtime_get_sync(dev->dev);
 	if (r < 0) {
-		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+		pm_runtime_put_autosuspend(dev->dev);
 		return r;
 	}
 
@@ -1284,30 +1243,19 @@ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
 	return 0;
 }
 
-static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
-{
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
-
-	seq_write(m, adev->bios, adev->bios_size);
-	return 0;
-}
-
-static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data)
+static int amdgpu_debugfs_evict_vram(void *data, u64 *val)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)data;
+	struct drm_device *dev = adev_to_drm(adev);
 	int r;
 
 	r = pm_runtime_get_sync(dev->dev);
 	if (r < 0) {
-		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+		pm_runtime_put_autosuspend(dev->dev);
 		return r;
 	}
 
-	seq_printf(m, "(%d)\n", amdgpu_bo_evict_vram(adev));
+	*val = amdgpu_bo_evict_vram(adev);
 
 	pm_runtime_mark_last_busy(dev->dev);
 	pm_runtime_put_autosuspend(dev->dev);
@@ -1315,11 +1263,11 @@ static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data)
 	return 0;
 }
 
-static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
+
+static int amdgpu_debugfs_evict_gtt(void *data, u64 *val)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)data;
+	struct drm_device *dev = adev_to_drm(adev);
 	int r;
 
 	r = pm_runtime_get_sync(dev->dev);
@@ -1328,7 +1276,7 @@ static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
 		return r;
 	}
 
-	seq_printf(m, "(%d)\n", ttm_bo_evict_mm(&adev->mman.bdev, TTM_PL_TT));
+	*val = ttm_bo_evict_mm(&adev->mman.bdev, TTM_PL_TT);
 
 	pm_runtime_mark_last_busy(dev->dev);
 	pm_runtime_put_autosuspend(dev->dev);
@@ -1336,10 +1284,11 @@ static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
 	return 0;
 }
 
-static int amdgpu_debugfs_vm_info(struct seq_file *m, void *data)
+
+static int amdgpu_debugfs_vm_info_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct drm_device *dev = adev_to_drm(adev);
 	struct drm_file *file;
 	int r;
 
@@ -1365,13 +1314,12 @@ static int amdgpu_debugfs_vm_info(struct seq_file *m, void *data)
 	return r;
 }
 
-static const struct drm_info_list amdgpu_debugfs_list[] = {
-	{"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump},
-	{"amdgpu_test_ib", &amdgpu_debugfs_test_ib},
-	{"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram},
-	{"amdgpu_evict_gtt", &amdgpu_debugfs_evict_gtt},
-	{"amdgpu_vm_info", &amdgpu_debugfs_vm_info},
-};
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_test_ib);
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_vm_info);
+DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_vram_fops, amdgpu_debugfs_evict_vram,
+			 NULL, "%lld\n");
+DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_gtt_fops, amdgpu_debugfs_evict_gtt,
+			 NULL, "%lld\n");
 
 static void amdgpu_ib_preempt_fences_swap(struct amdgpu_ring *ring,
 					  struct dma_fence **fences)
@@ -1590,19 +1538,20 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_sclk_set, NULL,
 
 int amdgpu_debugfs_init(struct amdgpu_device *adev)
 {
+	struct dentry *root = adev_to_drm(adev)->primary->debugfs_root;
 	struct dentry *ent;
 	int r, i;
 
-	ent = debugfs_create_file("amdgpu_preempt_ib", 0600,
-				  adev_to_drm(adev)->primary->debugfs_root, adev,
+
+
+	ent = debugfs_create_file("amdgpu_preempt_ib", 0600, root, adev,
 				  &fops_ib_preempt);
 	if (!ent) {
 		DRM_ERROR("unable to create amdgpu_preempt_ib debugsfs file\n");
 		return -EIO;
 	}
 
-	ent = debugfs_create_file("amdgpu_force_sclk", 0200,
-				  adev_to_drm(adev)->primary->debugfs_root, adev,
+	ent = debugfs_create_file("amdgpu_force_sclk", 0200, root, adev,
 				  &fops_sclk_set);
 	if (!ent) {
 		DRM_ERROR("unable to create amdgpu_set_sclk debugsfs file\n");
@@ -1610,32 +1559,17 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
 	}
 
 	/* Register debugfs entries for amdgpu_ttm */
-	r = amdgpu_ttm_debugfs_init(adev);
-	if (r) {
-		DRM_ERROR("Failed to init debugfs\n");
-		return r;
-	}
-
+	amdgpu_ttm_debugfs_init(adev);
 	amdgpu_debugfs_pm_init(adev);
-
-	if (amdgpu_debugfs_sa_init(adev)) {
-		dev_err(adev->dev, "failed to register debugfs file for SA\n");
-	}
-
-	if (amdgpu_debugfs_fence_init(adev))
-		dev_err(adev->dev, "fence debugfs file creation failed\n");
-
-	r = amdgpu_debugfs_gem_init(adev);
-	if (r)
-		DRM_ERROR("registering gem debugfs failed (%d).\n", r);
+	amdgpu_debugfs_sa_init(adev);
+	amdgpu_debugfs_fence_init(adev);
+	amdgpu_debugfs_gem_init(adev);
 
 	r = amdgpu_debugfs_regs_init(adev);
 	if (r)
 		DRM_ERROR("registering register debugfs failed (%d).\n", r);
 
-	r = amdgpu_debugfs_firmware_init(adev);
-	if (r)
-		DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
+	amdgpu_debugfs_firmware_init(adev);
 
 #if defined(CONFIG_DRM_AMD_DC)
 	if (amdgpu_device_has_dc_support(adev))
@@ -1654,17 +1588,26 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
 	}
 
 	amdgpu_ras_debugfs_create_all(adev);
-
 	amdgpu_debugfs_autodump_init(adev);
-
 	amdgpu_rap_debugfs_init(adev);
-
 	amdgpu_securedisplay_debugfs_init(adev);
-
 	amdgpu_fw_attestation_debugfs_init(adev);
 
-	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list,
-					ARRAY_SIZE(amdgpu_debugfs_list));
+	debugfs_create_file("amdgpu_evict_vram", 0444, root, adev,
+			    &amdgpu_evict_vram_fops);
+	debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev,
+			    &amdgpu_evict_gtt_fops);
+	debugfs_create_file("amdgpu_test_ib", 0444, root, adev,
+			    &amdgpu_debugfs_test_ib_fops);
+	debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
+			    &amdgpu_debugfs_vm_info_fops);
+
+	adev->debugfs_vbios_blob.data = adev->bios;
+	adev->debugfs_vbios_blob.size = adev->bios_size;
+	debugfs_create_blob("amdgpu_vbios", 0444, root,
+			    &adev->debugfs_vbios_blob);
+
+	return 0;
 }
 
 #else
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
index 2803884d338d..141a8474e24f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
@@ -26,11 +26,6 @@
 /*
  * Debugfs
  */
-struct amdgpu_debugfs {
-	const struct drm_info_list	*files;
-	unsigned		num_files;
-};
-
 struct amdgpu_autodump {
 	struct completion		dumping;
 	struct wait_queue_head		gpu_hang;
@@ -39,10 +34,7 @@ struct amdgpu_autodump {
 int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
 int amdgpu_debugfs_init(struct amdgpu_device *adev);
 void amdgpu_debugfs_fini(struct amdgpu_device *adev);
-int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
-			     const struct drm_info_list *files,
-			     unsigned nfiles);
-int amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
-int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
-int amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
+void amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
+void amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
+void amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
 int amdgpu_debugfs_wait_dump(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index d56f4023ebb3..143a14f4866f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -36,8 +36,6 @@
 #include <linux/firmware.h>
 #include <linux/pm_runtime.h>
 
-#include <drm/drm_debugfs.h>
-
 #include "amdgpu.h"
 #include "amdgpu_trace.h"
 
@@ -697,11 +695,9 @@ static const struct dma_fence_ops amdgpu_fence_ops = {
  * Fence debugfs
  */
 #if defined(CONFIG_DEBUG_FS)
-static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data)
+static int amdgpu_debugfs_fence_info_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
 	int i;
 
 	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
@@ -746,11 +742,10 @@ static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data)
  *
  * Manually trigger a gpu reset at the next fence wait.
  */
-static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
+static int gpu_recover_get(void *data, u64 *val)
 {
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)data;
+	struct drm_device *dev = adev_to_drm(adev);
 	int r;
 
 	r = pm_runtime_get_sync(dev->dev);
@@ -759,8 +754,7 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
 		return 0;
 	}
 
-	seq_printf(m, "gpu recover\n");
-	amdgpu_device_gpu_recover(adev, NULL);
+	*val = amdgpu_device_gpu_recover(adev, NULL);
 
 	pm_runtime_mark_last_busy(dev->dev);
 	pm_runtime_put_autosuspend(dev->dev);
@@ -768,26 +762,24 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
 	return 0;
 }
 
-static const struct drm_info_list amdgpu_debugfs_fence_list[] = {
-	{"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL},
-	{"amdgpu_gpu_recover", &amdgpu_debugfs_gpu_recover, 0, NULL}
-};
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_fence_info);
+DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_gpu_recover_fops, gpu_recover_get, NULL,
+			 "%lld\n");
 
-static const struct drm_info_list amdgpu_debugfs_fence_list_sriov[] = {
-	{"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL},
-};
 #endif
 
-int amdgpu_debugfs_fence_init(struct amdgpu_device *adev)
+void amdgpu_debugfs_fence_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	if (amdgpu_sriov_vf(adev))
-		return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov,
-						ARRAY_SIZE(amdgpu_debugfs_fence_list_sriov));
-	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list,
-					ARRAY_SIZE(amdgpu_debugfs_fence_list));
-#else
-	return 0;
+	struct drm_minor *minor = adev_to_drm(adev)->primary;
+	struct dentry *root = minor->debugfs_root;
+
+	debugfs_create_file("amdgpu_fence_info", 0444, root, adev,
+			    &amdgpu_debugfs_fence_info_fops);
+
+	if (!amdgpu_sriov_vf(adev))
+		debugfs_create_file("amdgpu_gpu_recover", 0444, root, adev,
+				    &amdgpu_debugfs_gpu_recover_fops);
 #endif
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 5b50860eece4..8e9b8a6e6ef0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -32,7 +32,6 @@
 #include <linux/dma-buf.h>
 
 #include <drm/amdgpu_drm.h>
-#include <drm/drm_debugfs.h>
 
 #include "amdgpu.h"
 #include "amdgpu_display.h"
@@ -836,10 +835,10 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
 }
 
 #if defined(CONFIG_DEBUG_FS)
-static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
+static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	struct drm_device *dev = node->minor->dev;
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct drm_device *dev = adev_to_drm(adev);
 	struct drm_file *file;
 	int r;
 
@@ -877,16 +876,17 @@ static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
 	return 0;
 }
 
-static const struct drm_info_list amdgpu_debugfs_gem_list[] = {
-	{"amdgpu_gem_info", &amdgpu_debugfs_gem_info, 0, NULL},
-};
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_gem_info);
+
 #endif
 
-int amdgpu_debugfs_gem_init(struct amdgpu_device *adev)
+void amdgpu_debugfs_gem_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_gem_list,
-					ARRAY_SIZE(amdgpu_debugfs_gem_list));
+	struct drm_minor *minor = adev_to_drm(adev)->primary;
+	struct dentry *root = minor->debugfs_root;
+
+	debugfs_create_file("amdgpu_gem_info", 0444, root, adev,
+			    &amdgpu_debugfs_gem_info_fops);
 #endif
-	return 0;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 7645223ea0ef..148a3b481b12 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -30,7 +30,6 @@
 #include <linux/slab.h>
 
 #include <drm/amdgpu_drm.h>
-#include <drm/drm_debugfs.h>
 
 #include "amdgpu.h"
 #include "atom.h"
@@ -453,11 +452,9 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
  */
 #if defined(CONFIG_DEBUG_FS)
 
-static int amdgpu_debugfs_sa_info(struct seq_file *m, void *data)
+static int amdgpu_debugfs_sa_info_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
 
 	seq_printf(m, "--------------------- DELAYED --------------------- \n");
 	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_DELAYED],
@@ -471,18 +468,18 @@ static int amdgpu_debugfs_sa_info(struct seq_file *m, void *data)
 	return 0;
 }
 
-static const struct drm_info_list amdgpu_debugfs_sa_list[] = {
-	{"amdgpu_sa_info", &amdgpu_debugfs_sa_info, 0, NULL},
-};
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_sa_info);
 
 #endif
 
-int amdgpu_debugfs_sa_init(struct amdgpu_device *adev)
+void amdgpu_debugfs_sa_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_sa_list,
-					ARRAY_SIZE(amdgpu_debugfs_sa_list));
-#else
-	return 0;
+	struct drm_minor *minor = adev_to_drm(adev)->primary;
+	struct dentry *root = minor->debugfs_root;
+
+	debugfs_create_file("amdgpu_sa_info", 0444, root, adev,
+			    &amdgpu_debugfs_sa_info_fops);
+
 #endif
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index e365c4fdcfe3..47ca20394d6b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -27,7 +27,6 @@
  */
 
 #include "amdgpu.h"
-#include <drm/drm_debugfs.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu_sched.h"
 #include "amdgpu_uvd.h"
@@ -1287,11 +1286,9 @@ const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms);
  */
 #if defined(CONFIG_DEBUG_FS)
 
-static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)
+static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *) m->private;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
 	struct drm_amdgpu_info_firmware fw_info;
 	struct drm_amdgpu_query_fw query_fw;
 	struct atom_context *ctx = adev->mode_info.atom_context;
@@ -1497,17 +1494,18 @@ static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)
 	return 0;
 }
 
-static const struct drm_info_list amdgpu_firmware_info_list[] = {
-	{"amdgpu_firmware_info", amdgpu_debugfs_firmware_info, 0, NULL},
-};
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_firmware_info);
+
 #endif
 
-int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev)
+void amdgpu_debugfs_firmware_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	return amdgpu_debugfs_add_files(adev, amdgpu_firmware_info_list,
-					ARRAY_SIZE(amdgpu_firmware_info_list));
-#else
-	return 0;
+	struct drm_minor *minor = adev_to_drm(adev)->primary;
+	struct dentry *root = minor->debugfs_root;
+
+	debugfs_create_file("amdgpu_firmware_info", 0444, root,
+			    adev, &amdgpu_debugfs_firmware_info_fops);
+
 #endif
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index adbefd6a655d..192627d35bae 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -331,7 +331,7 @@ void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager,
 					 struct seq_file *m);
 u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m);
 #endif
-int amdgpu_debugfs_sa_init(struct amdgpu_device *adev);
+void amdgpu_debugfs_sa_init(struct amdgpu_device *adev);
 
 bool amdgpu_bo_support_uswc(u64 bo_flags);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index ce92768cd146..7b2db779f313 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -49,7 +49,6 @@
 #include <drm/ttm/ttm_module.h>
 #include <drm/ttm/ttm_page_alloc.h>
 
-#include <drm/drm_debugfs.h>
 #include <drm/amdgpu_drm.h>
 
 #include "amdgpu.h"
@@ -2253,30 +2252,66 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,
 
 #if defined(CONFIG_DEBUG_FS)
 
-static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
+static int amdgpu_mm_vram_table_show(struct seq_file *m, void *unused)
 {
-	struct drm_info_node *node = (struct drm_info_node *)m->private;
-	unsigned ttm_pl = (uintptr_t)node->info_ent->data;
-	struct drm_device *dev = node->minor->dev;
-	struct amdgpu_device *adev = drm_to_adev(dev);
-	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, ttm_pl);
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
+							    TTM_PL_VRAM);
 	struct drm_printer p = drm_seq_file_printer(m);
 
 	man->func->debug(man, &p);
 	return 0;
 }
 
-static const struct drm_info_list amdgpu_ttm_debugfs_list[] = {
-	{"amdgpu_vram_mm", amdgpu_mm_dump_table, 0, (void *)TTM_PL_VRAM},
-	{"amdgpu_gtt_mm", amdgpu_mm_dump_table, 0, (void *)TTM_PL_TT},
-	{"amdgpu_gds_mm", amdgpu_mm_dump_table, 0, (void *)AMDGPU_PL_GDS},
-	{"amdgpu_gws_mm", amdgpu_mm_dump_table, 0, (void *)AMDGPU_PL_GWS},
-	{"amdgpu_oa_mm", amdgpu_mm_dump_table, 0, (void *)AMDGPU_PL_OA},
-	{"ttm_page_pool", ttm_page_alloc_debugfs, 0, NULL},
-#ifdef CONFIG_SWIOTLB
-	{"ttm_dma_page_pool", ttm_dma_page_alloc_debugfs, 0, NULL}
-#endif
-};
+static int amdgpu_mm_tt_table_show(struct seq_file *m, void *unused)
+{
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
+							    TTM_PL_TT);
+	struct drm_printer p = drm_seq_file_printer(m);
+
+	man->func->debug(man, &p);
+	return 0;
+}
+
+static int amdgpu_mm_gds_table_show(struct seq_file *m, void *unused)
+{
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
+							    AMDGPU_PL_GDS);
+	struct drm_printer p = drm_seq_file_printer(m);
+
+	man->func->debug(man, &p);
+	return 0;
+}
+
+static int amdgpu_mm_gws_table_show(struct seq_file *m, void *unused)
+{
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
+							    AMDGPU_PL_GWS);
+	struct drm_printer p = drm_seq_file_printer(m);
+
+	man->func->debug(man, &p);
+	return 0;
+}
+
+static int amdgpu_mm_oa_table_show(struct seq_file *m, void *unused)
+{
+	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
+	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
+							    AMDGPU_PL_OA);
+	struct drm_printer p = drm_seq_file_printer(m);
+
+	man->func->debug(man, &p);
+	return 0;
+}
+
+DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_vram_table);
+DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_tt_table);
+DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gds_table);
+DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gws_table);
+DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_oa_table);
 
 /*
  * amdgpu_ttm_vram_read - Linear read access to VRAM
@@ -2478,30 +2513,62 @@ static const struct file_operations amdgpu_ttm_iomem_fops = {
 	.llseek = default_llseek
 };
 
+static int amdgpu_ttm_page_debugfs_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, ttm_page_alloc_debugfs, inode->i_private);
+}
+
+static const struct file_operations amdgpu_ttm_page_debugfs_fops = {
+	.owner = THIS_MODULE,
+	.open = amdgpu_ttm_page_debugfs_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
+#ifdef CONFIG_SWIOTLB
+static int amdgpu_ttm_dma_page_debugfs_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, ttm_dma_page_alloc_debugfs, inode->i_private);
+}
+
+static const struct file_operations amdgpu_ttm_dma_page_debugfs_fops = {
+	.owner = THIS_MODULE,
+	.open = amdgpu_ttm_dma_page_debugfs_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
 #endif
 
-int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
+#endif
+
+void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
-	unsigned count;
-
 	struct drm_minor *minor = adev_to_drm(adev)->primary;
-	umode_t mode = S_IFREG | S_IRUGO;
 	struct dentry *root = minor->debugfs_root;
 
-	debugfs_create_file_size("amdgpu_vram", mode, root, adev,
+	debugfs_create_file_size("amdgpu_vram", 0444, root, adev,
 				 &amdgpu_ttm_vram_fops, adev->gmc.mc_vram_size);
-	debugfs_create_file("amdgpu_iomem", mode, root, adev,
+	debugfs_create_file("amdgpu_iomem", 0444, root, adev,
 			    &amdgpu_ttm_iomem_fops);
-	count = ARRAY_SIZE(amdgpu_ttm_debugfs_list);
-
+	debugfs_create_file("amdgpu_vram_mm", 0444, root, adev,
+			    &amdgpu_mm_vram_table_fops);
+	debugfs_create_file("amdgpu_gtt_mm", 0444, root, adev,
+			    &amdgpu_mm_tt_table_fops);
+	debugfs_create_file("amdgpu_gds_mm", 0444, root, adev,
+			    &amdgpu_mm_gds_table_fops);
+	debugfs_create_file("amdgpu_gws_mm", 0444, root, adev,
+			    &amdgpu_mm_gws_table_fops);
+	debugfs_create_file("amdgpu_oa_mm", 0444, root, adev,
+			    &amdgpu_mm_oa_table_fops);
+	debugfs_create_file("ttm_page_pool", 0444, root, adev,
+			    &amdgpu_ttm_page_debugfs_fops);
 #ifdef CONFIG_SWIOTLB
-	if (!(adev->need_swiotlb && swiotlb_nr_tbl()))
-		--count;
+	if ((adev->need_swiotlb && swiotlb_nr_tbl()))
+		debugfs_create_file("ttm_dma_page_pool", 0444, root, adev,
+				    &amdgpu_ttm_dma_page_debugfs_fops);
 #endif
-
-	return amdgpu_debugfs_add_files(adev, amdgpu_ttm_debugfs_list, count);
-#else
-	return 0;
 #endif
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index 4df4cf2fd4dd..69ba8dd4f3ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -186,6 +186,6 @@ uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, struct ttm_resource *mem);
 uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
 				 struct ttm_resource *mem);
 
-int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
+void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
 
 #endif
-- 
2.30.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 3/3] drm/amdgpu: do not use drm middle layer for debugfs
  2021-02-15 12:34 ` [PATCH v2 3/3] drm/amdgpu: " Nirmoy Das
@ 2021-02-15 13:40   ` Christian König
  0 siblings, 0 replies; 4+ messages in thread
From: Christian König @ 2021-02-15 13:40 UTC (permalink / raw)
  To: Nirmoy Das, Christian.Koenig; +Cc: amd-gfx

Am 15.02.21 um 13:34 schrieb Nirmoy Das:
> Use debugfs API directly instead of drm middle layer.
>
> This also includes following debugfs file output changes:
> 1 amdgpu_evict_vram/amdgpu_evict_gtt output will not contain any braces.
>    e.g. (0) --> 0
> 2 amdgpu_gpu_recover output will print return value of
>    amdgpu_device_gpu_recover() instead of not so important "gpu recover"
>    message.
>
> v2: * checkpatch.pl: use '0444' instead of S_IRUGO.
>      * remove S_IFREG from mode.
>      * remove mode variable.
>
> Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>

We could probably simplify the TTM debugfs stuff even more, but that is 
a separate task.

The series is Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu.h         |   3 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 155 +++++++-------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h |  14 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c   |  46 +++---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     |  22 +--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c      |  23 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c     |  24 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h  |   2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c     | 131 +++++++++++++----
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h     |   2 +-
>   10 files changed, 205 insertions(+), 217 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index e3d4d2dcb3a0..9bf7f494699d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -795,8 +795,7 @@ struct amdgpu_device {
>   	bool				accel_working;
>   	struct notifier_block		acpi_nb;
>   	struct amdgpu_i2c_chan		*i2c_bus[AMDGPU_MAX_I2C_BUS];
> -	struct amdgpu_debugfs		debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
> -	unsigned			debugfs_count;
> +	struct debugfs_blob_wrapper     debugfs_vbios_blob;
>   	struct amdgpu_atif		*atif;
>   	struct amdgpu_atcs		atcs;
>   	struct mutex			srbm_mutex;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> index 719ae65ad633..8d14e5129886 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -28,7 +28,6 @@
>   #include <linux/uaccess.h>
>   #include <linux/pm_runtime.h>
>   #include <linux/poll.h>
> -#include <drm/drm_debugfs.h>
>   
>   #include "amdgpu.h"
>   #include "amdgpu_pm.h"
> @@ -38,45 +37,6 @@
>   #include "amdgpu_securedisplay.h"
>   #include "amdgpu_fw_attestation.h"
>   
> -/**
> - * amdgpu_debugfs_add_files - Add simple debugfs entries
> - *
> - * @adev:  Device to attach debugfs entries to
> - * @files:  Array of function callbacks that respond to reads
> - * @nfiles: Number of callbacks to register
> - *
> - */
> -int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
> -			     const struct drm_info_list *files,
> -			     unsigned nfiles)
> -{
> -	unsigned i;
> -
> -	for (i = 0; i < adev->debugfs_count; i++) {
> -		if (adev->debugfs[i].files == files) {
> -			/* Already registered */
> -			return 0;
> -		}
> -	}
> -
> -	i = adev->debugfs_count + 1;
> -	if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
> -		DRM_ERROR("Reached maximum number of debugfs components.\n");
> -		DRM_ERROR("Report so we increase "
> -			  "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
> -		return -EINVAL;
> -	}
> -	adev->debugfs[adev->debugfs_count].files = files;
> -	adev->debugfs[adev->debugfs_count].num_files = nfiles;
> -	adev->debugfs_count = i;
> -#if defined(CONFIG_DEBUG_FS)
> -	drm_debugfs_create_files(files, nfiles,
> -				 adev_to_drm(adev)->primary->debugfs_root,
> -				 adev_to_drm(adev)->primary);
> -#endif
> -	return 0;
> -}
> -
>   int amdgpu_debugfs_wait_dump(struct amdgpu_device *adev)
>   {
>   #if defined(CONFIG_DEBUG_FS)
> @@ -1233,16 +1193,15 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
>   	return 0;
>   }
>   
> -static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
> +static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *) m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct drm_device *dev = adev_to_drm(adev);
>   	int r = 0, i;
>   
>   	r = pm_runtime_get_sync(dev->dev);
>   	if (r < 0) {
> -		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
> +		pm_runtime_put_autosuspend(dev->dev);
>   		return r;
>   	}
>   
> @@ -1284,30 +1243,19 @@ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
> -{
> -	struct drm_info_node *node = (struct drm_info_node *) m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> -
> -	seq_write(m, adev->bios, adev->bios_size);
> -	return 0;
> -}
> -
> -static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data)
> +static int amdgpu_debugfs_evict_vram(void *data, u64 *val)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *)m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)data;
> +	struct drm_device *dev = adev_to_drm(adev);
>   	int r;
>   
>   	r = pm_runtime_get_sync(dev->dev);
>   	if (r < 0) {
> -		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
> +		pm_runtime_put_autosuspend(dev->dev);
>   		return r;
>   	}
>   
> -	seq_printf(m, "(%d)\n", amdgpu_bo_evict_vram(adev));
> +	*val = amdgpu_bo_evict_vram(adev);
>   
>   	pm_runtime_mark_last_busy(dev->dev);
>   	pm_runtime_put_autosuspend(dev->dev);
> @@ -1315,11 +1263,11 @@ static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
> +
> +static int amdgpu_debugfs_evict_gtt(void *data, u64 *val)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *)m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)data;
> +	struct drm_device *dev = adev_to_drm(adev);
>   	int r;
>   
>   	r = pm_runtime_get_sync(dev->dev);
> @@ -1328,7 +1276,7 @@ static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
>   		return r;
>   	}
>   
> -	seq_printf(m, "(%d)\n", ttm_bo_evict_mm(&adev->mman.bdev, TTM_PL_TT));
> +	*val = ttm_bo_evict_mm(&adev->mman.bdev, TTM_PL_TT);
>   
>   	pm_runtime_mark_last_busy(dev->dev);
>   	pm_runtime_put_autosuspend(dev->dev);
> @@ -1336,10 +1284,11 @@ static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static int amdgpu_debugfs_vm_info(struct seq_file *m, void *data)
> +
> +static int amdgpu_debugfs_vm_info_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *)m->private;
> -	struct drm_device *dev = node->minor->dev;
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct drm_device *dev = adev_to_drm(adev);
>   	struct drm_file *file;
>   	int r;
>   
> @@ -1365,13 +1314,12 @@ static int amdgpu_debugfs_vm_info(struct seq_file *m, void *data)
>   	return r;
>   }
>   
> -static const struct drm_info_list amdgpu_debugfs_list[] = {
> -	{"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump},
> -	{"amdgpu_test_ib", &amdgpu_debugfs_test_ib},
> -	{"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram},
> -	{"amdgpu_evict_gtt", &amdgpu_debugfs_evict_gtt},
> -	{"amdgpu_vm_info", &amdgpu_debugfs_vm_info},
> -};
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_test_ib);
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_vm_info);
> +DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_vram_fops, amdgpu_debugfs_evict_vram,
> +			 NULL, "%lld\n");
> +DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_gtt_fops, amdgpu_debugfs_evict_gtt,
> +			 NULL, "%lld\n");
>   
>   static void amdgpu_ib_preempt_fences_swap(struct amdgpu_ring *ring,
>   					  struct dma_fence **fences)
> @@ -1590,19 +1538,20 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_sclk_set, NULL,
>   
>   int amdgpu_debugfs_init(struct amdgpu_device *adev)
>   {
> +	struct dentry *root = adev_to_drm(adev)->primary->debugfs_root;
>   	struct dentry *ent;
>   	int r, i;
>   
> -	ent = debugfs_create_file("amdgpu_preempt_ib", 0600,
> -				  adev_to_drm(adev)->primary->debugfs_root, adev,
> +
> +
> +	ent = debugfs_create_file("amdgpu_preempt_ib", 0600, root, adev,
>   				  &fops_ib_preempt);
>   	if (!ent) {
>   		DRM_ERROR("unable to create amdgpu_preempt_ib debugsfs file\n");
>   		return -EIO;
>   	}
>   
> -	ent = debugfs_create_file("amdgpu_force_sclk", 0200,
> -				  adev_to_drm(adev)->primary->debugfs_root, adev,
> +	ent = debugfs_create_file("amdgpu_force_sclk", 0200, root, adev,
>   				  &fops_sclk_set);
>   	if (!ent) {
>   		DRM_ERROR("unable to create amdgpu_set_sclk debugsfs file\n");
> @@ -1610,32 +1559,17 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
>   	}
>   
>   	/* Register debugfs entries for amdgpu_ttm */
> -	r = amdgpu_ttm_debugfs_init(adev);
> -	if (r) {
> -		DRM_ERROR("Failed to init debugfs\n");
> -		return r;
> -	}
> -
> +	amdgpu_ttm_debugfs_init(adev);
>   	amdgpu_debugfs_pm_init(adev);
> -
> -	if (amdgpu_debugfs_sa_init(adev)) {
> -		dev_err(adev->dev, "failed to register debugfs file for SA\n");
> -	}
> -
> -	if (amdgpu_debugfs_fence_init(adev))
> -		dev_err(adev->dev, "fence debugfs file creation failed\n");
> -
> -	r = amdgpu_debugfs_gem_init(adev);
> -	if (r)
> -		DRM_ERROR("registering gem debugfs failed (%d).\n", r);
> +	amdgpu_debugfs_sa_init(adev);
> +	amdgpu_debugfs_fence_init(adev);
> +	amdgpu_debugfs_gem_init(adev);
>   
>   	r = amdgpu_debugfs_regs_init(adev);
>   	if (r)
>   		DRM_ERROR("registering register debugfs failed (%d).\n", r);
>   
> -	r = amdgpu_debugfs_firmware_init(adev);
> -	if (r)
> -		DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
> +	amdgpu_debugfs_firmware_init(adev);
>   
>   #if defined(CONFIG_DRM_AMD_DC)
>   	if (amdgpu_device_has_dc_support(adev))
> @@ -1654,17 +1588,26 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
>   	}
>   
>   	amdgpu_ras_debugfs_create_all(adev);
> -
>   	amdgpu_debugfs_autodump_init(adev);
> -
>   	amdgpu_rap_debugfs_init(adev);
> -
>   	amdgpu_securedisplay_debugfs_init(adev);
> -
>   	amdgpu_fw_attestation_debugfs_init(adev);
>   
> -	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list,
> -					ARRAY_SIZE(amdgpu_debugfs_list));
> +	debugfs_create_file("amdgpu_evict_vram", 0444, root, adev,
> +			    &amdgpu_evict_vram_fops);
> +	debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev,
> +			    &amdgpu_evict_gtt_fops);
> +	debugfs_create_file("amdgpu_test_ib", 0444, root, adev,
> +			    &amdgpu_debugfs_test_ib_fops);
> +	debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
> +			    &amdgpu_debugfs_vm_info_fops);
> +
> +	adev->debugfs_vbios_blob.data = adev->bios;
> +	adev->debugfs_vbios_blob.size = adev->bios_size;
> +	debugfs_create_blob("amdgpu_vbios", 0444, root,
> +			    &adev->debugfs_vbios_blob);
> +
> +	return 0;
>   }
>   
>   #else
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
> index 2803884d338d..141a8474e24f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
> @@ -26,11 +26,6 @@
>   /*
>    * Debugfs
>    */
> -struct amdgpu_debugfs {
> -	const struct drm_info_list	*files;
> -	unsigned		num_files;
> -};
> -
>   struct amdgpu_autodump {
>   	struct completion		dumping;
>   	struct wait_queue_head		gpu_hang;
> @@ -39,10 +34,7 @@ struct amdgpu_autodump {
>   int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
>   int amdgpu_debugfs_init(struct amdgpu_device *adev);
>   void amdgpu_debugfs_fini(struct amdgpu_device *adev);
> -int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
> -			     const struct drm_info_list *files,
> -			     unsigned nfiles);
> -int amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
> -int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
> -int amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
> +void amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
> +void amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
> +void amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
>   int amdgpu_debugfs_wait_dump(struct amdgpu_device *adev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> index d56f4023ebb3..143a14f4866f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> @@ -36,8 +36,6 @@
>   #include <linux/firmware.h>
>   #include <linux/pm_runtime.h>
>   
> -#include <drm/drm_debugfs.h>
> -
>   #include "amdgpu.h"
>   #include "amdgpu_trace.h"
>   
> @@ -697,11 +695,9 @@ static const struct dma_fence_ops amdgpu_fence_ops = {
>    * Fence debugfs
>    */
>   #if defined(CONFIG_DEBUG_FS)
> -static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data)
> +static int amdgpu_debugfs_fence_info_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *)m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
>   	int i;
>   
>   	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
> @@ -746,11 +742,10 @@ static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data)
>    *
>    * Manually trigger a gpu reset at the next fence wait.
>    */
> -static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
> +static int gpu_recover_get(void *data, u64 *val)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *) m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)data;
> +	struct drm_device *dev = adev_to_drm(adev);
>   	int r;
>   
>   	r = pm_runtime_get_sync(dev->dev);
> @@ -759,8 +754,7 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
>   		return 0;
>   	}
>   
> -	seq_printf(m, "gpu recover\n");
> -	amdgpu_device_gpu_recover(adev, NULL);
> +	*val = amdgpu_device_gpu_recover(adev, NULL);
>   
>   	pm_runtime_mark_last_busy(dev->dev);
>   	pm_runtime_put_autosuspend(dev->dev);
> @@ -768,26 +762,24 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static const struct drm_info_list amdgpu_debugfs_fence_list[] = {
> -	{"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL},
> -	{"amdgpu_gpu_recover", &amdgpu_debugfs_gpu_recover, 0, NULL}
> -};
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_fence_info);
> +DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_gpu_recover_fops, gpu_recover_get, NULL,
> +			 "%lld\n");
>   
> -static const struct drm_info_list amdgpu_debugfs_fence_list_sriov[] = {
> -	{"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL},
> -};
>   #endif
>   
> -int amdgpu_debugfs_fence_init(struct amdgpu_device *adev)
> +void amdgpu_debugfs_fence_init(struct amdgpu_device *adev)
>   {
>   #if defined(CONFIG_DEBUG_FS)
> -	if (amdgpu_sriov_vf(adev))
> -		return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov,
> -						ARRAY_SIZE(amdgpu_debugfs_fence_list_sriov));
> -	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list,
> -					ARRAY_SIZE(amdgpu_debugfs_fence_list));
> -#else
> -	return 0;
> +	struct drm_minor *minor = adev_to_drm(adev)->primary;
> +	struct dentry *root = minor->debugfs_root;
> +
> +	debugfs_create_file("amdgpu_fence_info", 0444, root, adev,
> +			    &amdgpu_debugfs_fence_info_fops);
> +
> +	if (!amdgpu_sriov_vf(adev))
> +		debugfs_create_file("amdgpu_gpu_recover", 0444, root, adev,
> +				    &amdgpu_debugfs_gpu_recover_fops);
>   #endif
>   }
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index 5b50860eece4..8e9b8a6e6ef0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -32,7 +32,6 @@
>   #include <linux/dma-buf.h>
>   
>   #include <drm/amdgpu_drm.h>
> -#include <drm/drm_debugfs.h>
>   
>   #include "amdgpu.h"
>   #include "amdgpu_display.h"
> @@ -836,10 +835,10 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
>   }
>   
>   #if defined(CONFIG_DEBUG_FS)
> -static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
> +static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *)m->private;
> -	struct drm_device *dev = node->minor->dev;
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct drm_device *dev = adev_to_drm(adev);
>   	struct drm_file *file;
>   	int r;
>   
> @@ -877,16 +876,17 @@ static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static const struct drm_info_list amdgpu_debugfs_gem_list[] = {
> -	{"amdgpu_gem_info", &amdgpu_debugfs_gem_info, 0, NULL},
> -};
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_gem_info);
> +
>   #endif
>   
> -int amdgpu_debugfs_gem_init(struct amdgpu_device *adev)
> +void amdgpu_debugfs_gem_init(struct amdgpu_device *adev)
>   {
>   #if defined(CONFIG_DEBUG_FS)
> -	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_gem_list,
> -					ARRAY_SIZE(amdgpu_debugfs_gem_list));
> +	struct drm_minor *minor = adev_to_drm(adev)->primary;
> +	struct dentry *root = minor->debugfs_root;
> +
> +	debugfs_create_file("amdgpu_gem_info", 0444, root, adev,
> +			    &amdgpu_debugfs_gem_info_fops);
>   #endif
> -	return 0;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> index 7645223ea0ef..148a3b481b12 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> @@ -30,7 +30,6 @@
>   #include <linux/slab.h>
>   
>   #include <drm/amdgpu_drm.h>
> -#include <drm/drm_debugfs.h>
>   
>   #include "amdgpu.h"
>   #include "atom.h"
> @@ -453,11 +452,9 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
>    */
>   #if defined(CONFIG_DEBUG_FS)
>   
> -static int amdgpu_debugfs_sa_info(struct seq_file *m, void *data)
> +static int amdgpu_debugfs_sa_info_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *) m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
>   
>   	seq_printf(m, "--------------------- DELAYED --------------------- \n");
>   	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_DELAYED],
> @@ -471,18 +468,18 @@ static int amdgpu_debugfs_sa_info(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static const struct drm_info_list amdgpu_debugfs_sa_list[] = {
> -	{"amdgpu_sa_info", &amdgpu_debugfs_sa_info, 0, NULL},
> -};
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_sa_info);
>   
>   #endif
>   
> -int amdgpu_debugfs_sa_init(struct amdgpu_device *adev)
> +void amdgpu_debugfs_sa_init(struct amdgpu_device *adev)
>   {
>   #if defined(CONFIG_DEBUG_FS)
> -	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_sa_list,
> -					ARRAY_SIZE(amdgpu_debugfs_sa_list));
> -#else
> -	return 0;
> +	struct drm_minor *minor = adev_to_drm(adev)->primary;
> +	struct dentry *root = minor->debugfs_root;
> +
> +	debugfs_create_file("amdgpu_sa_info", 0444, root, adev,
> +			    &amdgpu_debugfs_sa_info_fops);
> +
>   #endif
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index e365c4fdcfe3..47ca20394d6b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -27,7 +27,6 @@
>    */
>   
>   #include "amdgpu.h"
> -#include <drm/drm_debugfs.h>
>   #include <drm/amdgpu_drm.h>
>   #include "amdgpu_sched.h"
>   #include "amdgpu_uvd.h"
> @@ -1287,11 +1286,9 @@ const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms);
>    */
>   #if defined(CONFIG_DEBUG_FS)
>   
> -static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)
> +static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *) m->private;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
>   	struct drm_amdgpu_info_firmware fw_info;
>   	struct drm_amdgpu_query_fw query_fw;
>   	struct atom_context *ctx = adev->mode_info.atom_context;
> @@ -1497,17 +1494,18 @@ static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)
>   	return 0;
>   }
>   
> -static const struct drm_info_list amdgpu_firmware_info_list[] = {
> -	{"amdgpu_firmware_info", amdgpu_debugfs_firmware_info, 0, NULL},
> -};
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_firmware_info);
> +
>   #endif
>   
> -int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev)
> +void amdgpu_debugfs_firmware_init(struct amdgpu_device *adev)
>   {
>   #if defined(CONFIG_DEBUG_FS)
> -	return amdgpu_debugfs_add_files(adev, amdgpu_firmware_info_list,
> -					ARRAY_SIZE(amdgpu_firmware_info_list));
> -#else
> -	return 0;
> +	struct drm_minor *minor = adev_to_drm(adev)->primary;
> +	struct dentry *root = minor->debugfs_root;
> +
> +	debugfs_create_file("amdgpu_firmware_info", 0444, root,
> +			    adev, &amdgpu_debugfs_firmware_info_fops);
> +
>   #endif
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index adbefd6a655d..192627d35bae 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -331,7 +331,7 @@ void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager,
>   					 struct seq_file *m);
>   u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m);
>   #endif
> -int amdgpu_debugfs_sa_init(struct amdgpu_device *adev);
> +void amdgpu_debugfs_sa_init(struct amdgpu_device *adev);
>   
>   bool amdgpu_bo_support_uswc(u64 bo_flags);
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index ce92768cd146..7b2db779f313 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -49,7 +49,6 @@
>   #include <drm/ttm/ttm_module.h>
>   #include <drm/ttm/ttm_page_alloc.h>
>   
> -#include <drm/drm_debugfs.h>
>   #include <drm/amdgpu_drm.h>
>   
>   #include "amdgpu.h"
> @@ -2253,30 +2252,66 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,
>   
>   #if defined(CONFIG_DEBUG_FS)
>   
> -static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
> +static int amdgpu_mm_vram_table_show(struct seq_file *m, void *unused)
>   {
> -	struct drm_info_node *node = (struct drm_info_node *)m->private;
> -	unsigned ttm_pl = (uintptr_t)node->info_ent->data;
> -	struct drm_device *dev = node->minor->dev;
> -	struct amdgpu_device *adev = drm_to_adev(dev);
> -	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, ttm_pl);
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
> +							    TTM_PL_VRAM);
>   	struct drm_printer p = drm_seq_file_printer(m);
>   
>   	man->func->debug(man, &p);
>   	return 0;
>   }
>   
> -static const struct drm_info_list amdgpu_ttm_debugfs_list[] = {
> -	{"amdgpu_vram_mm", amdgpu_mm_dump_table, 0, (void *)TTM_PL_VRAM},
> -	{"amdgpu_gtt_mm", amdgpu_mm_dump_table, 0, (void *)TTM_PL_TT},
> -	{"amdgpu_gds_mm", amdgpu_mm_dump_table, 0, (void *)AMDGPU_PL_GDS},
> -	{"amdgpu_gws_mm", amdgpu_mm_dump_table, 0, (void *)AMDGPU_PL_GWS},
> -	{"amdgpu_oa_mm", amdgpu_mm_dump_table, 0, (void *)AMDGPU_PL_OA},
> -	{"ttm_page_pool", ttm_page_alloc_debugfs, 0, NULL},
> -#ifdef CONFIG_SWIOTLB
> -	{"ttm_dma_page_pool", ttm_dma_page_alloc_debugfs, 0, NULL}
> -#endif
> -};
> +static int amdgpu_mm_tt_table_show(struct seq_file *m, void *unused)
> +{
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
> +							    TTM_PL_TT);
> +	struct drm_printer p = drm_seq_file_printer(m);
> +
> +	man->func->debug(man, &p);
> +	return 0;
> +}
> +
> +static int amdgpu_mm_gds_table_show(struct seq_file *m, void *unused)
> +{
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
> +							    AMDGPU_PL_GDS);
> +	struct drm_printer p = drm_seq_file_printer(m);
> +
> +	man->func->debug(man, &p);
> +	return 0;
> +}
> +
> +static int amdgpu_mm_gws_table_show(struct seq_file *m, void *unused)
> +{
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
> +							    AMDGPU_PL_GWS);
> +	struct drm_printer p = drm_seq_file_printer(m);
> +
> +	man->func->debug(man, &p);
> +	return 0;
> +}
> +
> +static int amdgpu_mm_oa_table_show(struct seq_file *m, void *unused)
> +{
> +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
> +	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
> +							    AMDGPU_PL_OA);
> +	struct drm_printer p = drm_seq_file_printer(m);
> +
> +	man->func->debug(man, &p);
> +	return 0;
> +}
> +
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_vram_table);
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_tt_table);
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gds_table);
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gws_table);
> +DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_oa_table);
>   
>   /*
>    * amdgpu_ttm_vram_read - Linear read access to VRAM
> @@ -2478,30 +2513,62 @@ static const struct file_operations amdgpu_ttm_iomem_fops = {
>   	.llseek = default_llseek
>   };
>   
> +static int amdgpu_ttm_page_debugfs_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, ttm_page_alloc_debugfs, inode->i_private);
> +}
> +
> +static const struct file_operations amdgpu_ttm_page_debugfs_fops = {
> +	.owner = THIS_MODULE,
> +	.open = amdgpu_ttm_page_debugfs_open,
> +	.read = seq_read,
> +	.llseek = seq_lseek,
> +	.release = single_release,
> +};
> +
> +#ifdef CONFIG_SWIOTLB
> +static int amdgpu_ttm_dma_page_debugfs_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, ttm_dma_page_alloc_debugfs, inode->i_private);
> +}
> +
> +static const struct file_operations amdgpu_ttm_dma_page_debugfs_fops = {
> +	.owner = THIS_MODULE,
> +	.open = amdgpu_ttm_dma_page_debugfs_open,
> +	.read = seq_read,
> +	.llseek = seq_lseek,
> +	.release = single_release,
> +};
>   #endif
>   
> -int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
> +#endif
> +
> +void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
>   {
>   #if defined(CONFIG_DEBUG_FS)
> -	unsigned count;
> -
>   	struct drm_minor *minor = adev_to_drm(adev)->primary;
> -	umode_t mode = S_IFREG | S_IRUGO;
>   	struct dentry *root = minor->debugfs_root;
>   
> -	debugfs_create_file_size("amdgpu_vram", mode, root, adev,
> +	debugfs_create_file_size("amdgpu_vram", 0444, root, adev,
>   				 &amdgpu_ttm_vram_fops, adev->gmc.mc_vram_size);
> -	debugfs_create_file("amdgpu_iomem", mode, root, adev,
> +	debugfs_create_file("amdgpu_iomem", 0444, root, adev,
>   			    &amdgpu_ttm_iomem_fops);
> -	count = ARRAY_SIZE(amdgpu_ttm_debugfs_list);
> -
> +	debugfs_create_file("amdgpu_vram_mm", 0444, root, adev,
> +			    &amdgpu_mm_vram_table_fops);
> +	debugfs_create_file("amdgpu_gtt_mm", 0444, root, adev,
> +			    &amdgpu_mm_tt_table_fops);
> +	debugfs_create_file("amdgpu_gds_mm", 0444, root, adev,
> +			    &amdgpu_mm_gds_table_fops);
> +	debugfs_create_file("amdgpu_gws_mm", 0444, root, adev,
> +			    &amdgpu_mm_gws_table_fops);
> +	debugfs_create_file("amdgpu_oa_mm", 0444, root, adev,
> +			    &amdgpu_mm_oa_table_fops);
> +	debugfs_create_file("ttm_page_pool", 0444, root, adev,
> +			    &amdgpu_ttm_page_debugfs_fops);
>   #ifdef CONFIG_SWIOTLB
> -	if (!(adev->need_swiotlb && swiotlb_nr_tbl()))
> -		--count;
> +	if ((adev->need_swiotlb && swiotlb_nr_tbl()))
> +		debugfs_create_file("ttm_dma_page_pool", 0444, root, adev,
> +				    &amdgpu_ttm_dma_page_debugfs_fops);
>   #endif
> -
> -	return amdgpu_debugfs_add_files(adev, amdgpu_ttm_debugfs_list, count);
> -#else
> -	return 0;
>   #endif
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index 4df4cf2fd4dd..69ba8dd4f3ee 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -186,6 +186,6 @@ uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, struct ttm_resource *mem);
>   uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
>   				 struct ttm_resource *mem);
>   
> -int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
> +void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
>   
>   #endif

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-02-15 13:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-15 12:34 [PATCH v2 1/3] drm/amd/display: do not use drm middle layer for debugfs Nirmoy Das
2021-02-15 12:34 ` [PATCH v2 2/3] drm/amd/pm: " Nirmoy Das
2021-02-15 12:34 ` [PATCH v2 3/3] drm/amdgpu: " Nirmoy Das
2021-02-15 13:40   ` Christian König

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.