Bug 79071

Summary: Hang with dpm radeon hd 5750, pcie 1.1 motherboard
Product: Drivers Reporter: Jonathan Howard (jonathan)
Component: Video(DRI - non Intel)Assignee: drivers_video-dri
Status: RESOLVED CODE_FIX    
Severity: normal CC: alexandre.f.demers, alexdeucher, Dieter
Priority: P1    
Hardware: x86-64   
OS: Linux   
Kernel Version: 3.16-rc2 (all dpm kernels) Subsystem:
Regression: No Bisected commit-id:
Attachments: dmesg

Description Jonathan Howard 2014-06-27 17:02:47 UTC
Created attachment 141161 [details]
dmesg

New bug report but problem been around since start of dpm code. Only now tried out few more tests. I think (without certainty) underlying cause is the old motherboard. (Have no other system to swap to.)

System runs stable until running games. Found cogs a good test case as it usually hangs quickly on the menu. 

/sys/class/drm/card0/device/power_dpm_force_performance_level
No problems when low.
Set to high (ie not dynamic) still hangs in games.

Tried (modified for cypress_dpm.c)
https://bugs.freedesktop.org/attachment.cgi?id=86424
no fix.

Setting
eg_pi->vddci_control = false;
Working so far.


Any refined patch to test much appreciated.
Comment 1 Alex Deucher 2014-06-27 17:07:28 UTC
Does it only hang when forced to high or does that just make it happen sooner?  Do you get hangs when it's set to auto?  What makes you think it's the motherboard?
Comment 2 Jonathan Howard 2014-06-27 18:19:12 UTC
Both high and auto appear to be same.
Lack of other reports for the card, with me running on pcie v1 motherboard (card supports v2) give a hint (but not certain) probable cause.
Comment 3 Jonathan Howard 2014-06-28 18:33:58 UTC
i fixed it.

diff --git a/drivers/gpu/drm/radeon/cypress_dpm.c b/drivers/gpu/drm/radeon/cypress_dpm.c
index cf783fc..cf77719 100644
--- a/drivers/gpu/drm/radeon/cypress_dpm.c
+++ b/drivers/gpu/drm/radeon/cypress_dpm.c
@@ -1551,7 +1551,7 @@ int cypress_populate_smc_voltage_tables(struct radeon_device *rdev,
 
                table->voltageMaskTable.highMask[RV770_SMC_VOLTAGEMASK_VDDCI] = 0;
                table->voltageMaskTable.lowMask[RV770_SMC_VOLTAGEMASK_VDDCI] =
-                       cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
+                       cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
        }
 
        return 0;
Comment 4 Dieter Nützel 2014-06-28 19:02:46 UTC
(In reply to Jonathan Howard from comment #3)
> i fixed it.
> 
> diff --git a/drivers/gpu/drm/radeon/cypress_dpm.c
> b/drivers/gpu/drm/radeon/cypress_dpm.c
> index cf783fc..cf77719 100644
> --- a/drivers/gpu/drm/radeon/cypress_dpm.c
> +++ b/drivers/gpu/drm/radeon/cypress_dpm.c
> @@ -1551,7 +1551,7 @@ int cypress_populate_smc_voltage_tables(struct
> radeon_device *rdev,
>  
>                
> table->voltageMaskTable.highMask[RV770_SMC_VOLTAGEMASK_VDDCI] = 0;
>                 table->voltageMaskTable.lowMask[RV770_SMC_VOLTAGEMASK_VDDCI]
> =
> -                       cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
> +                       cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
>         }
>  
>         return 0;

Good catch Jonathan!

It seems to me, that this is NEEDED in ni_dpm.c, too (copy paste thing?)
si_dpm.c IS OK.

--- ni_dpm.c.orig       2014-06-22 07:02:54.000000000 +0200
+++ ni_dpm.c    2014-06-28 20:58:02.972099242 +0200
@@ -1315,7 +1315,7 @@
 
                table->voltageMaskTable.highMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] = 0;
                table->voltageMaskTable.lowMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] =
-                       cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
+                       cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
        }
 }
Comment 5 Jonathan Howard 2014-07-11 16:28:49 UTC
Patched and working
3.16-rc4 3.15.5 3.14.12