diff options
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 1 |
3 files changed, 13 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 762b660af5aa..fd9daf4022a1 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -1042,15 +1042,17 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
1042 | /* calculate ss amount and step size */ | 1042 | /* calculate ss amount and step size */ |
1043 | if (ASIC_IS_DCE4(rdev)) { | 1043 | if (ASIC_IS_DCE4(rdev)) { |
1044 | u32 step_size; | 1044 | u32 step_size; |
1045 | u32 amount = (((fb_div * 10) + frac_fb_div) * radeon_crtc->ss.percentage) / 10000; | 1045 | u32 amount = (((fb_div * 10) + frac_fb_div) * |
1046 | (u32)radeon_crtc->ss.percentage) / | ||
1047 | (100 * (u32)radeon_crtc->ss.percentage_divider); | ||
1046 | radeon_crtc->ss.amount = (amount / 10) & ATOM_PPLL_SS_AMOUNT_V2_FBDIV_MASK; | 1048 | radeon_crtc->ss.amount = (amount / 10) & ATOM_PPLL_SS_AMOUNT_V2_FBDIV_MASK; |
1047 | radeon_crtc->ss.amount |= ((amount - (amount / 10)) << ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT) & | 1049 | radeon_crtc->ss.amount |= ((amount - (amount / 10)) << ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT) & |
1048 | ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK; | 1050 | ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK; |
1049 | if (radeon_crtc->ss.type & ATOM_PPLL_SS_TYPE_V2_CENTRE_SPREAD) | 1051 | if (radeon_crtc->ss.type & ATOM_PPLL_SS_TYPE_V2_CENTRE_SPREAD) |
1050 | step_size = (4 * amount * ref_div * (radeon_crtc->ss.rate * 2048)) / | 1052 | step_size = (4 * amount * ref_div * ((u32)radeon_crtc->ss.rate * 2048)) / |
1051 | (125 * 25 * pll->reference_freq / 100); | 1053 | (125 * 25 * pll->reference_freq / 100); |
1052 | else | 1054 | else |
1053 | step_size = (2 * amount * ref_div * (radeon_crtc->ss.rate * 2048)) / | 1055 | step_size = (2 * amount * ref_div * ((u32)radeon_crtc->ss.rate * 2048)) / |
1054 | (125 * 25 * pll->reference_freq / 100); | 1056 | (125 * 25 * pll->reference_freq / 100); |
1055 | radeon_crtc->ss.step = step_size; | 1057 | radeon_crtc->ss.step = step_size; |
1056 | } | 1058 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 80a56ad40c52..61cff32b4012 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -1511,6 +1511,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1511 | le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); | 1511 | le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); |
1512 | ss->type = ss_assign->v1.ucSpreadSpectrumMode; | 1512 | ss->type = ss_assign->v1.ucSpreadSpectrumMode; |
1513 | ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); | 1513 | ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); |
1514 | ss->percentage_divider = 100; | ||
1514 | return true; | 1515 | return true; |
1515 | } | 1516 | } |
1516 | ss_assign = (union asic_ss_assignment *) | 1517 | ss_assign = (union asic_ss_assignment *) |
@@ -1528,6 +1529,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1528 | le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); | 1529 | le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); |
1529 | ss->type = ss_assign->v2.ucSpreadSpectrumMode; | 1530 | ss->type = ss_assign->v2.ucSpreadSpectrumMode; |
1530 | ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); | 1531 | ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); |
1532 | ss->percentage_divider = 100; | ||
1531 | if ((crev == 2) && | 1533 | if ((crev == 2) && |
1532 | ((id == ASIC_INTERNAL_ENGINE_SS) || | 1534 | ((id == ASIC_INTERNAL_ENGINE_SS) || |
1533 | (id == ASIC_INTERNAL_MEMORY_SS))) | 1535 | (id == ASIC_INTERNAL_MEMORY_SS))) |
@@ -1549,6 +1551,11 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
1549 | le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); | 1551 | le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); |
1550 | ss->type = ss_assign->v3.ucSpreadSpectrumMode; | 1552 | ss->type = ss_assign->v3.ucSpreadSpectrumMode; |
1551 | ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); | 1553 | ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); |
1554 | if (ss_assign->v3.ucSpreadSpectrumMode & | ||
1555 | SS_MODE_V3_PERCENTAGE_DIV_BY_1000_MASK) | ||
1556 | ss->percentage_divider = 1000; | ||
1557 | else | ||
1558 | ss->percentage_divider = 100; | ||
1552 | if ((id == ASIC_INTERNAL_ENGINE_SS) || | 1559 | if ((id == ASIC_INTERNAL_ENGINE_SS) || |
1553 | (id == ASIC_INTERNAL_MEMORY_SS)) | 1560 | (id == ASIC_INTERNAL_MEMORY_SS)) |
1554 | ss->rate /= 100; | 1561 | ss->rate /= 100; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 28bba631b80c..7c53fb1cc46d 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -291,6 +291,7 @@ struct radeon_tv_regs { | |||
291 | 291 | ||
292 | struct radeon_atom_ss { | 292 | struct radeon_atom_ss { |
293 | uint16_t percentage; | 293 | uint16_t percentage; |
294 | uint16_t percentage_divider; | ||
294 | uint8_t type; | 295 | uint8_t type; |
295 | uint16_t step; | 296 | uint16_t step; |
296 | uint8_t delay; | 297 | uint8_t delay; |