diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2015-01-12 17:15:12 -0500 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2015-01-12 17:16:50 -0500 |
| commit | 5615f890bc6babdc2998dec62f3552326d06eb7b (patch) | |
| tree | 44b2ce8dfb2b1f057e4b8798f95bcb886b9b72d3 | |
| parent | ad1a62227f2e3d5eb4eb0b61a2d9005369bbef45 (diff) | |
drm/radeon: add si dpm quirk list
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>
Cc: stable@vger.kernel.org
| -rw-r--r-- | drivers/gpu/drm/radeon/si_dpm.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 32e354b8b0ab..eff8a6444956 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
| @@ -2908,6 +2908,22 @@ static int si_init_smc_spll_table(struct radeon_device *rdev) | |||
| 2908 | return ret; | 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 | static void si_apply_state_adjust_rules(struct radeon_device *rdev, | 2927 | static void si_apply_state_adjust_rules(struct radeon_device *rdev, |
| 2912 | struct radeon_ps *rps) | 2928 | struct radeon_ps *rps) |
| 2913 | { | 2929 | { |
| @@ -2918,7 +2934,22 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2918 | u32 mclk, sclk; | 2934 | u32 mclk, sclk; |
| 2919 | u16 vddc, vddci; | 2935 | u16 vddc, vddci; |
| 2920 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | 2936 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; |
| 2937 | u32 max_sclk = 0, max_mclk = 0; | ||
| 2921 | int i; | 2938 | int i; |
| 2939 | struct si_dpm_quirk *p = si_dpm_quirk_list; | ||
| 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 | } | ||
| 2922 | 2953 | ||
| 2923 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2954 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
| 2924 | ni_dpm_vblank_too_short(rdev)) | 2955 | ni_dpm_vblank_too_short(rdev)) |
| @@ -2972,6 +3003,14 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2972 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | 3003 | if (ps->performance_levels[i].mclk > max_mclk_vddc) |
| 2973 | ps->performance_levels[i].mclk = max_mclk_vddc; | 3004 | ps->performance_levels[i].mclk = max_mclk_vddc; |
| 2974 | } | 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; | ||
| 3013 | } | ||
| 2975 | } | 3014 | } |
| 2976 | 3015 | ||
| 2977 | /* XXX validate the min clocks required for display */ | 3016 | /* XXX validate the min clocks required for display */ |
