ddr: fix overflow when ddr freq is high
authortao zeng <tao.zeng@amlogic.com>
Thu, 12 Jul 2018 01:30:30 +0000 (09:30 +0800)
committertao zeng <tao.zeng@amlogic.com>
Thu, 12 Jul 2018 01:42:56 +0000 (09:42 +0800)
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 <tao.zeng@amlogic.com>
drivers/amlogic/ddr_tool/ddr_band_op_g12.c
drivers/amlogic/ddr_tool/ddr_band_op_gx.c
drivers/amlogic/ddr_tool/ddr_band_op_gxl.c
include/linux/amlogic/aml_ddr_bandwidth.h

index b791ec5797d6e9b0d7e0b1ce2508c0dac307e8d4..ec0f50f526eebb59ad5c01ea0cb5f2364f53d25d 100644 (file)
@@ -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;
 }
index 69dbc4e83cd78c7d26c8011eee74e6333a48bb9c..387dd5534fe55b1f6cd31942d3f69eafe639a13b 100644 (file)
@@ -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;
 }
 
index 52ee4c287f103f1dbf0643ffa91c984a0f2c2e11..6796f05897bb32dc6ea2077dd7254ff8b4d1df55 100644 (file)
@@ -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;
 }
 
index e9efe9a33d362d42609945e03f105a4d84bbdc1d..7982156daa2af323383099fb1729e96e25bbbef5 100644 (file)
@@ -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