From 7a67df5813ba9c820a7e246880652aebabb7a796 Mon Sep 17 00:00:00 2001 From: tao zeng Date: Thu, 12 Jul 2018 09:30:30 +0800 Subject: [PATCH] ddr: fix overflow when ddr freq is high PD#161475: ddr: fix overflow when ddr freq is high Caculate of ddr freq will overflow if ddr freq is over 1.5GHz, This commit fixed it. Change-Id: Idc07b1022b52e3ec5c227c15afff1aaf21575ed7 Signed-off-by: tao zeng --- drivers/amlogic/ddr_tool/ddr_band_op_g12.c | 3 ++- drivers/amlogic/ddr_tool/ddr_band_op_gx.c | 3 ++- drivers/amlogic/ddr_tool/ddr_band_op_gxl.c | 3 ++- include/linux/amlogic/aml_ddr_bandwidth.h | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/amlogic/ddr_tool/ddr_band_op_g12.c b/drivers/amlogic/ddr_tool/ddr_band_op_g12.c index b791ec5797d6..ec0f50f526ee 100644 --- a/drivers/amlogic/ddr_tool/ddr_band_op_g12.c +++ b/drivers/amlogic/ddr_tool/ddr_band_op_g12.c @@ -97,8 +97,9 @@ static unsigned long g12_get_dmc_freq_quick(struct ddr_bandwidth *db) m = val & 0x1ff; n = ((val >> 10) & 0x1f); od1 = (((val >> 19) & 0x1)) == 1 ? 2 : 1; + freq = DEFAULT_XTAL_FREQ / 1000; /* avoid overflow */ if (n) - freq = (((DEFAULT_XTAL_FREQ * m) / n) >> od1) / od_div; + freq = ((((freq * m) / n) >> od1) / od_div) * 1000; return freq; } diff --git a/drivers/amlogic/ddr_tool/ddr_band_op_gx.c b/drivers/amlogic/ddr_tool/ddr_band_op_gx.c index 69dbc4e83cd7..387dd5534fe5 100644 --- a/drivers/amlogic/ddr_tool/ddr_band_op_gx.c +++ b/drivers/amlogic/ddr_tool/ddr_band_op_gx.c @@ -70,7 +70,8 @@ static unsigned long gx_get_dmc_freq_quick(struct ddr_bandwidth *db) (db->cpu_type < MESON_CPU_MAJOR_ID_GXL)) { od1 = (val >> 14) & 0x03; } - freq = (DEFAULT_XTAL_FREQ * m / (n * (1 + od))) >> od1; + freq = DEFAULT_XTAL_FREQ / 1000; /* avoid overflow */ + freq = ((freq * m / (n * (1 + od))) >> od1) * 1000; return freq; } diff --git a/drivers/amlogic/ddr_tool/ddr_band_op_gxl.c b/drivers/amlogic/ddr_tool/ddr_band_op_gxl.c index 52ee4c287f10..6796f05897bb 100644 --- a/drivers/amlogic/ddr_tool/ddr_band_op_gxl.c +++ b/drivers/amlogic/ddr_tool/ddr_band_op_gxl.c @@ -63,7 +63,8 @@ static unsigned long gxl_get_dmc_freq_quick(struct ddr_bandwidth *db) m = (val >> 4) & 0x1ff; n = (val >> 16) & 0x1f; od1 = (val >> 0) & 0x03; - freq = (DEFAULT_XTAL_FREQ * m / (n * (1 + od))) >> od1; + freq = DEFAULT_XTAL_FREQ / 1000; /* avoid overflow */ + freq = ((freq * m / (n * (1 + od))) >> od1) * 1000; return freq; } diff --git a/include/linux/amlogic/aml_ddr_bandwidth.h b/include/linux/amlogic/aml_ddr_bandwidth.h index e9efe9a33d36..7982156daa2a 100644 --- a/include/linux/amlogic/aml_ddr_bandwidth.h +++ b/include/linux/amlogic/aml_ddr_bandwidth.h @@ -20,7 +20,7 @@ #define DEFAULT_CLK_CNT 12000000 -#define DEFAULT_XTAL_FREQ 24000000 +#define DEFAULT_XTAL_FREQ 24000000UL #define DMC_QOS_IRQ (1 << 30) #define MAX_CHANNEL 4 -- 2.34.1