Commit ff32f6aab7dcdba9f65be5268f260c7fcb66d4d6

Authored by Alex Deucher
Committed by Greg Kroah-Hartman
1 parent 4e77f9fb47

drm/radeon: add si dpm quirk list

commit 5615f890bc6babdc2998dec62f3552326d06eb7b upstream.

This adds a quirks list to fix stability problems with
certain SI boards.

bug:
https://bugs.freedesktop.org/show_bug.cgi?id=76490

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 1 changed file with 39 additions and 0 deletions Side-by-side Diff

drivers/gpu/drm/radeon/si_dpm.c
... ... @@ -2908,6 +2908,22 @@
2908 2908 return ret;
2909 2909 }
2910 2910  
  2911 +struct si_dpm_quirk {
  2912 + u32 chip_vendor;
  2913 + u32 chip_device;
  2914 + u32 subsys_vendor;
  2915 + u32 subsys_device;
  2916 + u32 max_sclk;
  2917 + u32 max_mclk;
  2918 +};
  2919 +
  2920 +/* cards with dpm stability problems */
  2921 +static struct si_dpm_quirk si_dpm_quirk_list[] = {
  2922 + /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */
  2923 + { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
  2924 + { 0, 0, 0, 0 },
  2925 +};
  2926 +
2911 2927 static void si_apply_state_adjust_rules(struct radeon_device *rdev,
2912 2928 struct radeon_ps *rps)
2913 2929 {
2914 2930  
2915 2931  
... ... @@ -2918,8 +2934,23 @@
2918 2934 u32 mclk, sclk;
2919 2935 u16 vddc, vddci;
2920 2936 u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
  2937 + u32 max_sclk = 0, max_mclk = 0;
2921 2938 int i;
  2939 + struct si_dpm_quirk *p = si_dpm_quirk_list;
2922 2940  
  2941 + /* Apply dpm quirks */
  2942 + while (p && p->chip_device != 0) {
  2943 + if (rdev->pdev->vendor == p->chip_vendor &&
  2944 + rdev->pdev->device == p->chip_device &&
  2945 + rdev->pdev->subsystem_vendor == p->subsys_vendor &&
  2946 + rdev->pdev->subsystem_device == p->subsys_device) {
  2947 + max_sclk = p->max_sclk;
  2948 + max_mclk = p->max_mclk;
  2949 + break;
  2950 + }
  2951 + ++p;
  2952 + }
  2953 +
2923 2954 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
2924 2955 ni_dpm_vblank_too_short(rdev))
2925 2956 disable_mclk_switching = true;
... ... @@ -2971,6 +3002,14 @@
2971 3002 if (max_mclk_vddc) {
2972 3003 if (ps->performance_levels[i].mclk > max_mclk_vddc)
2973 3004 ps->performance_levels[i].mclk = max_mclk_vddc;
  3005 + }
  3006 + if (max_mclk) {
  3007 + if (ps->performance_levels[i].mclk > max_mclk)
  3008 + ps->performance_levels[i].mclk = max_mclk;
  3009 + }
  3010 + if (max_sclk) {
  3011 + if (ps->performance_levels[i].sclk > max_sclk)
  3012 + ps->performance_levels[i].sclk = max_sclk;
2974 3013 }
2975 3014 }
2976 3015