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.
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?
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.
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;
(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); } }
Patched and working 3.16-rc4 3.15.5 3.14.12