public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] orion5x: optimize window size computation
@ 2010-10-04 22:22 Albert Aribaud
  2010-10-05  5:57 ` Prafulla Wadaskar
  0 siblings, 1 reply; 20+ messages in thread
From: Albert Aribaud @ 2010-10-04 22:22 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Chris Moore <moore@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.

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;
 }
 
 /*
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2010-10-07  9:57 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-04 22:22 [U-Boot] [PATCH] orion5x: optimize window size computation Albert Aribaud
2010-10-05  5:57 ` Prafulla Wadaskar
2010-10-05 21:40   ` Chris Moore
2010-10-06  5:51     ` Albert ARIBAUD
2010-10-06  9:34       ` Prafulla Wadaskar
2010-10-06 13:29         ` Wolfgang Denk
2010-10-06 13:47           ` Albert ARIBAUD
2010-10-06 14:24             ` Prafulla Wadaskar
2010-10-06  9:38       ` [U-Boot] Mvbge driver broken on kirkwood platforms after ARM relocation Prafulla Wadaskar
2010-10-06 13:30         ` Wolfgang Denk
2010-10-06 13:54           ` Albert ARIBAUD
2010-10-06 13:56             ` Albert ARIBAUD
2010-10-06 14:14               ` Prafulla Wadaskar
2010-10-06 14:43                 ` Albert ARIBAUD
2010-10-06 14:22           ` Prafulla Wadaskar
2010-10-06 15:56             ` Albert ARIBAUD
2010-10-06 17:36               ` Albert ARIBAUD
2010-10-06 17:54                 ` Albert ARIBAUD
2010-10-07  4:37                   ` Prafulla Wadaskar
2010-10-07  9:57                   ` Prafulla Wadaskar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox