mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
3d635aba0b
Use bcl 20,31,0f rather than plain bl to avoid unbalancing the link stack. Update the code to use REL16 relocs, available for ppc64 in 2009 (and ppc32 in 2005). Signed-off-by: Alan Modra <amodra@gmail.com> [mpe: Incorporate more detail into the change log] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
68 lines
1.6 KiB
ArmAsm
68 lines
1.6 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copied from <file:arch/powerpc/kernel/misc_32.S>
|
|
*
|
|
* This file contains miscellaneous low-level functions.
|
|
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
|
|
*
|
|
* Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
|
|
* and Paul Mackerras.
|
|
*
|
|
* kexec bits:
|
|
* Copyright (C) 2002-2003 Eric Biederman <ebiederm@xmission.com>
|
|
* GameCube/ppc32 port Copyright (C) 2004 Albert Herranz
|
|
*/
|
|
#include "ppc_asm.h"
|
|
|
|
#define SPRN_PVR 0x11F /* Processor Version Register */
|
|
|
|
.text
|
|
|
|
/* udelay needs to know the period of the
|
|
* timebase in nanoseconds. This used to be hardcoded to be 60ns
|
|
* (period of 66MHz/4). Now a variable is used that is initialized to
|
|
* 60 for backward compatibility, but it can be overridden as necessary
|
|
* with code something like this:
|
|
* extern unsigned long timebase_period_ns;
|
|
* timebase_period_ns = 1000000000 / bd->bi_tbfreq;
|
|
*/
|
|
.data
|
|
.globl timebase_period_ns
|
|
timebase_period_ns:
|
|
.long 60
|
|
|
|
.text
|
|
/*
|
|
* Delay for a number of microseconds
|
|
*/
|
|
.globl udelay
|
|
udelay:
|
|
mulli r4,r3,1000 /* nanoseconds */
|
|
/* Change r4 to be the number of ticks using:
|
|
* (nanoseconds + (timebase_period_ns - 1 )) / timebase_period_ns
|
|
* timebase_period_ns defaults to 60 (16.6MHz) */
|
|
mflr r5
|
|
bcl 20,31,0f
|
|
0: mflr r6
|
|
mtlr r5
|
|
addis r5,r6,(timebase_period_ns-0b)@ha
|
|
lwz r5,(timebase_period_ns-0b)@l(r5)
|
|
add r4,r4,r5
|
|
addi r4,r4,-1
|
|
divw r4,r4,r5 /* BUS ticks */
|
|
1: MFTBU(r5)
|
|
MFTBL(r6)
|
|
MFTBU(r7)
|
|
cmpw 0,r5,r7
|
|
bne 1b /* Get [synced] base time */
|
|
addc r9,r6,r4 /* Compute end time */
|
|
addze r8,r5
|
|
2: MFTBU(r5)
|
|
cmpw 0,r5,r8
|
|
blt 2b
|
|
bgt 3f
|
|
MFTBL(r6)
|
|
cmpw 0,r6,r9
|
|
blt 2b
|
|
3: blr
|