aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c7
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
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
292struct radeon_atom_ss { 292struct 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;