Rewrote picos_to_clk() to avoid rounding errors.
PATCH 1/1 Rewrote picos_to_clk() to avoid rounding errors.
From: James Yang <[email protected]>
Clarified that conversion is to DRAM clocks rather than platform clocks. Made function static to spd_sdram.c.
Signed-off-by James Yang <[email protected]>
Signed-off-by Jon Loeliger <[email protected]>
--- cpu/mpc86xx/spd_sdram.c | 28 ++++++++++++++++++++-------- 1 files changed, 20 insertions(+), 8 deletions(-)
cpu/mpc86xx/spd_sdram.c +20 -8
@@ -51,20 +51,32 @@ extern int dma_xfer(void *dest, uint count, void *src);#define CFG_SUPER_BANK_INTERLEAVING 0/* -* Convert picoseconds into clock cycles (rounding up if needed). +* Convert picoseconds into DRAM clock cycles (rounding up if needed). */ -int -picos_to_clk (int picos) +static unsigned int +picos_to_clk (unsigned int picos) { -int clks; - - clks = picos / (2000000000 / (get_bus_freq (0 ) /1000 )); -if (picos % (2000000000 / (get_bus_freq (0 ) /1000 )) !=0 ) { +/* use unsigned long long to avoid rounding errors */ +const unsigned long long ULL_2e12 =2000000000000ULL ; +unsigned long long clks; +unsigned long long clks_temp; + +if (! picos) +return 0 ; + + clks =get_bus_freq (0 ) * (unsigned long long ) picos; + clks_temp = clks; + clks = clks / ULL_2e12; +if (clks_temp % ULL_2e12) { clks++; } -return clks; +if (clks >0xFFFFFFFFULL ) { + clks =0xFFFFFFFFULL ; + } + +return (unsigned int ) clks; }
Signature · 1 line
1.5.0.3