
-----Original Message----- From: u-boot-bounces@lists.denx.de [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Albert Aribaud Sent: Thursday, October 07, 2010 12:17 AM To: u-boot@lists.denx.de Subject: [U-Boot] [PATCH V3] 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 V3 Fixed unit mistake and moved to standard units
arch/arm/cpu/arm926ejs/orion5x/cpu.c | 32 +++++++++++++++++++++----------- 1 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/orion5x/cpu.c b/arch/arm/cpu/arm926ejs/orion5x/cpu.c index 260f88b..22207cb 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.
- 64 KiB granularity (e.g., a value of 0x00FF specifies 256
= 16 MiB).
- NOTES:
- A sizeval equal to 0x0 specifies 4 GiB.
*/
- A return value of 0x0 specifies 64 KiB.
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;
}
Applied to u-boot-marvell.git master branch
Regards.. Prafulla . .