> -----Original Message----- > From: u-boot-boun...@lists.denx.de > [mailto:u-boot-boun...@lists.denx.de] On Behalf Of Albert Aribaud > Sent: Tuesday, October 05, 2010 3:52 AM > To: u-boot@lists.denx.de > Subject: [U-Boot] [PATCH] orion5x: optimize window size computation > > > Signed-off-by: Chris Moore <mo...@free.fr> > --- > > This is a simple optimization of the orion5x window size > computation. This code was contributed by Chris Moore so > I put his Signed-off-by rather than mine.
This is wrong, you should be singed-off since you are posting and Chris can be contributor Or let him post the patch. > > See <http://www.mail-archive.com/u-boot@lists.denx.de/msg37075.html> > > 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 c36d7bf..5c443fe 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; > + /* > + * 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; > > - for (i = 0; val >= 0x10000; i++) { > - j |= (1 << i); > - val = val >> 1; > - } > - return 0x0000ffff & j; > + /* > + * 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; BTW: How much this saves on size? Regards.. Prafulla .. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot