Skip to content

Commit

Permalink
ARM: 8306/1: loop_udelay: remove bogomips value limitation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nicolas Pitre authored and Russell King committed Jun 22, 2016
1 parent 2374b06 commit 215e362
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 14 deletions.
6 changes: 3 additions & 3 deletions arch/arm/include/asm/delay.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__

Expand All @@ -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);

Expand Down
5 changes: 4 additions & 1 deletion arch/arm/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 5 additions & 10 deletions arch/arm/lib/delay-loop.S
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,26 @@
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/delay.h>

.text

.LC0: .word loops_per_jiffy
.LC1: .word UDELAY_MULT

/*
* r0 <= 2000
* lpj <= 0x01ffffff (max. 3355 bogomips)
* HZ <= 1000
*/

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

/*
Expand Down

0 comments on commit 215e362

Please sign in to comment.