Bug 102511

Summary: RV770 error on change dpm balanced<->battery
Product: DRI Reporter: Rob MacKinnon <rob.mackinnon>
Component: DRM/RadeonAssignee: Default DRI bug account <dri-devel>
Status: RESOLVED MOVED QA Contact:
Severity: minor    
Priority: medium    
Version: unspecified   
Hardware: x86-64 (AMD64)   
OS: Linux (All)   
Whiteboard:
i915 platform: i915 features:
Attachments:
Description Flags
Xorg.0.log
none
dmesg.log none

Description Rob MacKinnon 2017-09-01 19:43:09 UTC
* Overview:
I decided today I would troubleshoot/source an error that has been plaguing my dmesg:

[drm:btc_dpm_set_power_state [radeon]] *ERROR* rv770_restrict_performance_levels_before_switch failed

Over all this bug may or may not be related to #91375. I dug into the DPM setting and levels and was happy to find that switching from "performance" to "battery" (and vice versa) did not reproduce this bug. What did reproduce the bug was switching from "balanced" and "battery" (and vice versa).

Kernel version: 4.11.12
Linux Firmware version: 20170519
X.org server version: 1.19.3
Mesa version: 17.2.0_rc5
libdrm version: 2.4.82
Gnome version: 3.24

* Steps to Reproduce:
echo battery > /sys/class/drm/card0/device/power_dpm_state
echo balanced > /sys/class/drm/card0/device/power_dpm_state

* Actual Result:
- DPMS change level changes as expected.
- Dmesg:
[ 3302.814889] [drm:btc_dpm_set_power_state [radeon]] *ERROR* rv770_restrict_performance_levels_before_switch failed
[ 3316.661933] [drm:btc_dpm_set_power_state [radeon]] *ERROR* rv770_restrict_performance_levels_before_switch failed

* Expected result:
- DPMS change level changes as expected.
- No error messages in dmesg.

* Additional Info:
Also, not sure if this is related or not, when switching from "battery" to "performance" there sometimes appears to be an initial clocking issue (which I believe is related to #93753). Switching back and forth a few times seems to clean it.  Unsure the cause.  Another note, upon further inspection of my DPMS settings, I noticed the drastic differences between "balanced" and "battery" `sclk`s. My understand (which could be faulty) is that `sclk` drives the clocking for single displays, while `mclk` for multiple. My laptop rig has 2 DP displays (3 if I could get it to drive the LVDS display with the 2 DPs, but that is another issue for another bug another day)

# echo battery > /sys/class/drm/card0/device/power_dpm_state
# cat /sys/kernel/debug/dri/0/radeon_pm_info 
uvd    vclk: 0 dclk: 0
power level 2    sclk: 30000 mclk: 30000 vddc: 900 vddci: 0

# echo balanced > /sys/class/drm/card0/device/power_dpm_state
# cat /sys/kernel/debug/dri/0/radeon_pm_info 
uvd    vclk: 0 dclk: 0
power level 0    sclk: 25000 mclk: 90000 vddc: 1100 vddci: 0


# echo performance > /sys/class/drm/card0/device/power_dpm_state
# cat /sys/kernel/debug/dri/0/radeon_pm_info 
uvd    vclk: 0 dclk: 0
power level 2    sclk: 75000 mclk: 90000 vddc: 1100 vddci: 0

*Video Card:
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Seymour [Radeon HD 6400M/7400M Series] (prog-if 00 [VGA controller])
	Subsystem: Hewlett-Packard Company Radeon HD 6470M
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0, Cache Line Size: 64 bytes
	Interrupt: pin A routed to IRQ 37
	Region 0: Memory at c0000000 (64-bit, prefetchable) [size=256M]
	Region 2: Memory at d4400000 (64-bit, non-prefetchable) [size=128K]
	Region 4: I/O ports at 4000 [size=256]
	Expansion ROM at 000c0000 [disabled] [size=128K]
	Capabilities: <access denied>
	Kernel driver in use: radeon
	Kernel modules: radeon
Comment 1 Alex Deucher 2017-09-01 20:06:03 UTC
Please attach your xorg log and dmesg output with radeon.dpm=1 specified on kernel command line in grub.
Comment 2 Alex Deucher 2017-09-01 20:15:59 UTC
(In reply to Rob MacKinnon from comment #0)
> * Actual Result:
> - DPMS change level changes as expected.
> - Dmesg:
> [ 3302.814889] [drm:btc_dpm_set_power_state [radeon]] *ERROR*
> rv770_restrict_performance_levels_before_switch failed
> [ 3316.661933] [drm:btc_dpm_set_power_state [radeon]] *ERROR*
> rv770_restrict_performance_levels_before_switch failed
> 
> * Expected result:
> - DPMS change level changes as expected.
> - No error messages in dmesg.

Are you actually experiencing any problems?  I think the error message may be harmless can could probably be removed.

> 
> * Additional Info:
> Also, not sure if this is related or not, when switching from "battery" to
> "performance" there sometimes appears to be an initial clocking issue (which
> I believe is related to #93753). Switching back and forth a few times seems
> to clean it.  Unsure the cause.  Another note, upon further inspection of my

There is no real balanced state.  It's either battery or performance depending on whether the chip is on ac or dc power.  The only real states you can switch between are performance and battery.  I need to see the output of our dmesg with radeon.dpm=1 to see what states your vbios provides.

> DPMS settings, I noticed the drastic differences between "balanced" and
> "battery" `sclk`s. My understand (which could be faulty) is that `sclk`
> drives the clocking for single displays, while `mclk` for multiple. My

sclk is the 3D engine clock.  mclk is the memory clock.  mclk switching is disabled when multiple displays are active since the switch has to happen during the display's vblank period otherwise you'd see display glitches.  With multiple displays, the vblank periods are not likely to align so mclk switching is disabled.
Comment 3 Rob MacKinnon 2017-09-01 22:10:33 UTC
Created attachment 133933 [details]
Xorg.0.log
Comment 4 Rob MacKinnon 2017-09-01 23:15:25 UTC
Created attachment 133934 [details]
dmesg.log
Comment 5 Rob MacKinnon 2017-09-01 23:53:34 UTC
Comments inline...

(In reply to Alex Deucher from comment #2)
> (In reply to Rob MacKinnon from comment #0)
> > * Actual Result:
> > - DPMS change level changes as expected.
> > - Dmesg:
> > [ 3302.814889] [drm:btc_dpm_set_power_state [radeon]] *ERROR*
> > rv770_restrict_performance_levels_before_switch failed
> > [ 3316.661933] [drm:btc_dpm_set_power_state [radeon]] *ERROR*
> > rv770_restrict_performance_levels_before_switch failed
> > 
> > * Expected result:
> > - DPMS change level changes as expected.
> > - No error messages in dmesg.
> 
> Are you actually experiencing any problems?  I think the error message may
> be harmless can could probably be removed.

The annoyance of the message is totally trivial, but I believe there is an issue with the initial setting of the DPMS profile. Which I'll mention in the next comment.

> > 
> > * Additional Info:
> > Also, not sure if this is related or not, when switching from "battery" to
> > "performance" there sometimes appears to be an initial clocking issue (which
> > I believe is related to #93753). Switching back and forth a few times seems
> > to clean it.  Unsure the cause.  Another note, upon further inspection of my
> 
> There is no real balanced state.  It's either battery or performance
> depending on whether the chip is on ac or dc power.  The only real states
> you can switch between are performance and battery.  I need to see the
> output of our dmesg with radeon.dpm=1 to see what states your vbios provides.

I believe you when you say that the `balanced` state is non-existent.  A check after cold starting shows that `balanced` is the first profile being set:

# cat /sys/class/drm/card0/device/power_dpm_state
balanced

So I'm not sure where this profile is being set from.

> 
> > DPMS settings, I noticed the drastic differences between "balanced" and
> > "battery" `sclk`s. My understand (which could be faulty) is that `sclk`
> > drives the clocking for single displays, while `mclk` for multiple. My
> 
> sclk is the 3D engine clock.  mclk is the memory clock.  mclk switching is
> disabled when multiple displays are active since the switch has to happen
> during the display's vblank period otherwise you'd see display glitches. 
> With multiple displays, the vblank periods are not likely to align so mclk
> switching is disabled.

Thank you very much for clarifying the function of `sclk` vs `mclk`. That's great info, I wish I'd been able to find it elsewhere. My google-fu was the source of my original understanding (which as it turns out was completely wrong).

Regardless, somewhere the `balanced` profile is getting pulled from with greatly under valued 3D clocking value.  Is there a setting somewhere that I can trace down where this invalid profile is being generated or referenced?
Comment 6 Martin Peres 2019-11-19 09:30:22 UTC
-- GitLab Migration Automatic Message --

This bug has been migrated to freedesktop.org's GitLab instance and has been closed from further activity.

You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.freedesktop.org/drm/amd/issues/816.

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.