[U-Boot] [PATCH V2] orion5x: optimize window size computation

Signed-off-by: Chris Moore moore@free.fr Signed-off-by: Albert Aribaud albert.aribaud@free.fr --- V1 Initial submission V2 Double Signed-off-by as requested
arch/arm/cpu/arm926ejs/orion5x/cpu.c | 30 ++++++++++++++++++++---------- 1 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/orion5x/cpu.c b/arch/arm/cpu/arm926ejs/orion5x/cpu.c index 260f88b..a49d926 100644 --- a/arch/arm/cpu/arm926ejs/orion5x/cpu.c +++ b/arch/arm/cpu/arm926ejs/orion5x/cpu.c @@ -48,24 +48,34 @@ void reset_cpu(unsigned long ignored) }
/* - * Window Size + * Compute Window Size field value from size expressed in bytes * Used with the Base register to set the address window size and location. * Must be programmed from LSB to MSB as sequence of ones followed by * sequence of zeros. The number of ones specifies the size of the window in * 64 KByte granularity (e.g., a value of 0x00FF specifies 256 = 16 MByte). - * NOTE: A value of 0x0 specifies 64-KByte size. + * NOTES: + * 1) A sizeval equal to 0x0 specifies 4 TB. + * 2) A return value of 0x0 specifies 64 KB. */ unsigned int orion5x_winctrl_calcsize(unsigned int sizeval) { - int i; - unsigned int j = 0; - u32 val = sizeval >> 1; - - for (i = 0; val >= 0x10000; i++) { - j |= (1 << i); - val = val >> 1; - } - return 0x0000ffff & j; + /* + * Calculate the number of 64 KiB blocks needed minus one (rounding up). + * For sizeval > 0 this is equivalent to: + * sizeval = (u32) ceil((double) sizeval / 65536.0) - 1 + */ + sizeval = (sizeval - 1) >> 16; + + /* + * Propagate 'one' bits to the right by 'oring' them. + * We need only treat bits 15-0. + */ + sizeval |= sizeval >> 1; /* 'Or' bit 15 onto bit 14 */ + sizeval |= sizeval >> 2; /* 'Or' bits 15-14 onto bits 13-12 */ + sizeval |= sizeval >> 4; /* 'Or' bits 15-12 onto bits 11-8 */ + sizeval |= sizeval >> 8; /* 'Or' bits 15-8 onto bits 7-0*/ + + return sizeval; }
/*

Hi,
Sorry Albert I missed this one last time :(
Le 06/10/2010 16:46, Albert Aribaud a écrit :
- A sizeval equal to 0x0 specifies 4 TB
s/TB/GB/ or maybe even s/TB/GiB/
Question: are MB, GB, ... or MiB, GiB, ... preferred in U-Boot?
I generally try to use the "i" versions where appropriate. In fact I used a KiB below:
* Calculate the number of 64 KiB blocks needed minus one (rounding up).
IMHO whatever the choice, it would be preferable to be consistent throughout.
Cheers, Chris

Le 06/10/2010 20:01, Chris Moore a écrit :
Hi,
Sorry Albert I missed this one last time :(
Le 06/10/2010 16:46, Albert Aribaud a écrit :
- A sizeval equal to 0x0 specifies 4 TB
s/TB/GB/ or maybe even s/TB/GiB/
Question: are MB, GB, ... or MiB, GiB, ... preferred in U-Boot?
/me slaps himself.
One day, I'll get this one right the first time around, you'll see.
I generally try to use the "i" versions where appropriate. In fact I used a KiB below:
- Calculate the number of 64 KiB blocks needed minus one (rounding up).
IMHO whatever the choice, it would be preferable to be consistent throughout.
Indeed, and as always, I prefer the les ambiguous choice: 4 TiB it is.
Cheers, Chris
Amicalement,

Dear Chris Moore,
In message 4CACB95F.1000001@free.fr you wrote:
Question: are MB, GB, ... or MiB, GiB, ... preferred in U-Boot?
We try to use standard units, i. e. MiB, GiB
I generally try to use the "i" versions where appropriate. In fact I used a KiB below:
ACK.
Best regards,
Wolfgang Denk
participants (4)
-
Albert ARIBAUD
-
Albert Aribaud
-
Chris Moore
-
Wolfgang Denk