Commit ff32f6aab7dcdba9f65be5268f260c7fcb66d4d6
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 |