ARM: 8306/1: loop_udelay: remove bogomips value limitation
authorNicolas Pitre <nicolas.pitre@linaro.org>
Wed, 25 Feb 2015 21:50:39 +0000 (22:50 +0100)
committerRussell King <rmk+kernel@armlinux.org.uk>
Wed, 22 Jun 2016 18:55:12 +0000 (19:55 +0100)
Now that we don't support ARMv3 anymore, the loop based delay code can
convert microsecs into number of loops using a 64-bit multiplication
and more precision.

This allows us to lift the hard limit of 3355 on the bogomips value as
loops_per_jiffy may now safely span the full 32-bit range.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/delay.h
arch/arm/lib/Makefile
arch/arm/lib/delay-loop.S

index dff714d886d58dbdce93a468e6a098cf45db98f6..b7a4281543556cfb82f716e0fc0337dae363187c 100644 (file)
@@ -10,8 +10,8 @@
 #include <asm/param.h> /* HZ */
 
 #define MAX_UDELAY_MS  2
-#define UDELAY_MULT    ((UL(2199023) * HZ) >> 11)
-#define UDELAY_SHIFT   30
+#define UDELAY_MULT    UL(2047 * HZ + 483648 * HZ / 1000000)
+#define UDELAY_SHIFT   31
 
 #ifndef __ASSEMBLY__
 
@@ -34,7 +34,7 @@ extern struct arm_delay_ops {
  * it, it means that you're calling udelay() with an out of range value.
  *
  * With currently imposed limits, this means that we support a max delay
- * of 2000us. Further limits: HZ<=1000 and bogomips<=3355
+ * of 2000us. Further limits: HZ<=1000
  */
 extern void __bad_udelay(void);
 
index d8a780799506b59bc2edd3f6a513021bcb45ebc0..27f4d96258a2e66193d6a3701bb4cf9a44399aad 100644 (file)
@@ -29,7 +29,10 @@ else
   lib-y        += io-readsw-armv4.o io-writesw-armv4.o
 endif
 
-lib-$(CONFIG_ARCH_RPC)         += ecard.o io-acorn.o floppydma.o
+ifeq ($(CONFIG_ARCH_RPC),y)
+  lib-y                                += ecard.o io-acorn.o floppydma.o
+  AFLAGS_delay-loop.o          += -march=armv4
+endif
 
 $(obj)/csumpartialcopy.o:      $(obj)/csumpartialcopygeneric.S
 $(obj)/csumpartialcopyuser.o:  $(obj)/csumpartialcopygeneric.S
index 518bf6e93f78a2cb1c74f7b857c6fa96b1018f53..792c59d885bc9d8274eaef7ea8c3a68539d9dc0a 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/delay.h>
+
                .text
 
 .LC0:          .word   loops_per_jiffy
@@ -17,7 +18,6 @@
 
 /*
  * r0  <= 2000
- * lpj <= 0x01ffffff (max. 3355 bogomips)
  * HZ  <= 1000
  */
 
@@ -25,16 +25,11 @@ ENTRY(__loop_udelay)
                ldr     r2, .LC1
                mul     r0, r2, r0
 ENTRY(__loop_const_udelay)                     @ 0 <= r0 <= 0x7fffff06
-               mov     r1, #-1
                ldr     r2, .LC0
-               ldr     r2, [r2]                @ max = 0x01ffffff
-               add     r0, r0, r1, lsr #32-14
-               mov     r0, r0, lsr #14         @ max = 0x0001ffff
-               add     r2, r2, r1, lsr #32-10
-               mov     r2, r2, lsr #10         @ max = 0x00007fff
-               mul     r0, r2, r0              @ max = 2^32-1
-               add     r0, r0, r1, lsr #32-6
-               movs    r0, r0, lsr #6
+               ldr     r2, [r2]
+               umull   r1, r0, r2, r0
+               adds    r1, r1, #0xffffffff
+               adcs    r0, r0, r0
                reteq   lr
 
 /*
This page took 0.026806 seconds and 5 git commands to generate.