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 <tao.zeng@amlogic.com>
This commit is contained in:
tao zeng
2018-07-12 09:30:30 +08:00
parent 6613b42a3d
commit 7a67df5813
4 changed files with 7 additions and 4 deletions

View 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;
}

View 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;
}

View 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;
}

View 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