diff mbox

drm/radeon/dpm: add debugfs support for rs780

Message ID 20130716210903.GA4478@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Anthoine Bourgeois July 16, 2013, 9:09 p.m. UTC
This allows you to look at the current DPM state via debugfs.

Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois@gmail.com>
---
 drivers/gpu/drm/radeon/radeon_asic.c |  1 +
 drivers/gpu/drm/radeon/radeon_asic.h |  2 ++
 drivers/gpu/drm/radeon/rs780_dpm.c   | 28 ++++++++++++++++++++++++++++
 3 files changed, 31 insertions(+)

Comments

Anthoine Bourgeois July 17, 2013, 7:39 a.m. UTC | #1
2013/7/16 Deucher, Alexander <Alexander.Deucher@amd.com>

> > -----Original Message-----
> > From: Anthoine Bourgeois [mailto:anthoine.bourgeois@gmail.com]
> > Sent: Tuesday, July 16, 2013 5:09 PM
> > To: Deucher, Alexander; Koenig, Christian; Jerome Glisse; Anthoine
> > Bourgeois
> > Cc: dri-devel@lists.freedesktop.org
> > Subject: [PATCH] drm/radeon/dpm: add debugfs support for rs780
> >
> > This allows you to look at the current DPM state via debugfs.
> >
> > Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois@gmail.com>
> > ---
> >  drivers/gpu/drm/radeon/radeon_asic.c |  1 +
> >  drivers/gpu/drm/radeon/radeon_asic.h |  2 ++
> >  drivers/gpu/drm/radeon/rs780_dpm.c   | 28
> > ++++++++++++++++++++++++++++
> >  3 files changed, 31 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/radeon/radeon_asic.c
> > b/drivers/gpu/drm/radeon/radeon_asic.c
> > index fea997e..78bec1a 100644
> > --- a/drivers/gpu/drm/radeon/radeon_asic.c
> > +++ b/drivers/gpu/drm/radeon/radeon_asic.c
> > @@ -1270,6 +1270,7 @@ static struct radeon_asic rs780_asic = {
> >               .get_sclk = &rs780_dpm_get_sclk,
> >               .get_mclk = &rs780_dpm_get_mclk,
> >               .print_power_state = &rs780_dpm_print_power_state,
> > +             .debugfs_print_current_performance_level =
> > &rs780_dpm_debugfs_print_current_performance_level,
> >       },
> >       .pflip = {
> >               .pre_page_flip = &rs600_pre_page_flip,
> > diff --git a/drivers/gpu/drm/radeon/radeon_asic.h
> > b/drivers/gpu/drm/radeon/radeon_asic.h
> > index b04b578..ca18957 100644
> > --- a/drivers/gpu/drm/radeon/radeon_asic.h
> > +++ b/drivers/gpu/drm/radeon/radeon_asic.h
> > @@ -433,6 +433,8 @@ u32 rs780_dpm_get_sclk(struct radeon_device *rdev,
> > bool low);
> >  u32 rs780_dpm_get_mclk(struct radeon_device *rdev, bool low);
> >  void rs780_dpm_print_power_state(struct radeon_device *rdev,
> >                                struct radeon_ps *ps);
> > +void rs780_dpm_debugfs_print_current_performance_level(struct
> > radeon_device *rdev,
> > +                                                    struct seq_file *m);
> >
> >  /* uvd */
> >  int r600_uvd_init(struct radeon_device *rdev);
> > diff --git a/drivers/gpu/drm/radeon/rs780_dpm.c
> > b/drivers/gpu/drm/radeon/rs780_dpm.c
> > index bef832a..ef5a28e 100644
> > --- a/drivers/gpu/drm/radeon/rs780_dpm.c
> > +++ b/drivers/gpu/drm/radeon/rs780_dpm.c
> > @@ -961,3 +961,31 @@ u32 rs780_dpm_get_mclk(struct radeon_device
> > *rdev, bool low)
> >
> >       return pi->bootup_uma_clk;
> >  }
> > +
> > +void rs780_dpm_debugfs_print_current_performance_level(struct
> > radeon_device *rdev,
> > +                                                    struct seq_file *m)
> > +{
> > +     struct radeon_ps *rps = rdev->pm.dpm.current_ps;
> > +     struct igp_ps *ps = rs780_get_ps(rps);
> > +     u32 sclk;
> > +     enum rs780_vddc_level vddc;
> > +     u32 current_index = r600_power_level_get_current_index(rdev);
> > +
>
> Rs780 uses different dpm hardware compared to other r6xx asics, so
> r600_power_level_get_current_index() doesn't actually do anything on rs780.


In that case is there any reason to do a r600_power_level_set_enter_index
in the rs780_initialize_dpm_parameters ? This function set the same
register TARGET_AND_CURRENT_PROFILE_INDEX.

I try to change the index value of this call to R600_POWER_LEVEL_MEDIUM to
test my patch. The r600_power_level_get_current_index returns the modified
index afterward but doesn't seem very "dynamic". I try to implement
force_performance_level and in that case a r600_power_level_set_enter_index
doesn't seem to modify the register.



> There's no convenient way to look this up on rs780.  I attempted to add
> support for it:
>
> http://people.freedesktop.org/~agd5f/0001-drm-radeon-dpm-add-debugfs-support-for-RS780-RS880.patch
> but the registers don't seem read back reliably when dpm is enabled so the
> output is bogus.
>
> Too bad :-(

Thanks,
Anthoine
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index fea997e..78bec1a 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -1270,6 +1270,7 @@  static struct radeon_asic rs780_asic = {
 		.get_sclk = &rs780_dpm_get_sclk,
 		.get_mclk = &rs780_dpm_get_mclk,
 		.print_power_state = &rs780_dpm_print_power_state,
+		.debugfs_print_current_performance_level = &rs780_dpm_debugfs_print_current_performance_level,
 	},
 	.pflip = {
 		.pre_page_flip = &rs600_pre_page_flip,
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index b04b578..ca18957 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -433,6 +433,8 @@  u32 rs780_dpm_get_sclk(struct radeon_device *rdev, bool low);
 u32 rs780_dpm_get_mclk(struct radeon_device *rdev, bool low);
 void rs780_dpm_print_power_state(struct radeon_device *rdev,
 				 struct radeon_ps *ps);
+void rs780_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
+						       struct seq_file *m);
 
 /* uvd */
 int r600_uvd_init(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/rs780_dpm.c b/drivers/gpu/drm/radeon/rs780_dpm.c
index bef832a..ef5a28e 100644
--- a/drivers/gpu/drm/radeon/rs780_dpm.c
+++ b/drivers/gpu/drm/radeon/rs780_dpm.c
@@ -961,3 +961,31 @@  u32 rs780_dpm_get_mclk(struct radeon_device *rdev, bool low)
 
 	return pi->bootup_uma_clk;
 }
+
+void rs780_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
+						       struct seq_file *m)
+{
+	struct radeon_ps *rps = rdev->pm.dpm.current_ps;
+	struct igp_ps *ps = rs780_get_ps(rps);
+	u32 sclk;
+	enum rs780_vddc_level vddc;
+	u32 current_index = r600_power_level_get_current_index(rdev);
+
+	if (current_index > 1) {
+		seq_printf(m, "invalid dpm profile %d\n", current_index);
+	} else {
+		if (current_index == 0) {
+			sclk = ps->sclk_low;
+			vddc = rs780_get_voltage_for_vddc_level(rdev,
+								ps->min_voltage);
+		} else { /* current_index == 1 */
+			sclk = ps->sclk_high;
+			vddc = rs780_get_voltage_for_vddc_level(rdev,
+								ps->max_voltage);
+		}
+		seq_printf(m, "uvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
+		seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u\n",
+			   current_index, sclk,
+			   rs780_dpm_get_mclk(rdev, false), vddc);
+	}
+}