xref: /openbmc/u-boot/arch/powerpc/lib/ticks.S (revision dd4671cb)
1/*
2 * (C) Copyright 2000, 2001
3 * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com.
4 *  base on code by
5 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
6 *
7 * SPDX-License-Identifier:	GPL-2.0+
8 */
9
10#include <ppc_asm.tmpl>
11#include <ppc_defs.h>
12#include <config.h>
13#include <watchdog.h>
14
15/*
16 * unsigned long long get_ticks(void);
17 *
18 * read timebase as "long long"
19 */
20	.globl	get_ticks
21get_ticks:
221:	mftbu	r3
23	mftb	r4
24	mftbu	r5
25	cmp	0,r3,r5
26	bne	1b
27	blr
28
29/*
30 * Delay for a number of ticks
31 */
32	.globl	wait_ticks
33wait_ticks:
34	stwu	r1, -16(r1)
35	mflr	r0		/* save link register */
36	stw	r0, 20(r1)	/* Use r0 or GDB will be unhappy */
37	stw	r14, 12(r1)	/* save used registers */
38	stw	r15, 8(r1)
39	mr	r14, r3		/* save tick count */
40	bl	get_ticks	/* Get start time */
41
42	/* Calculate end time */
43	addc    r14, r4, r14	/* Compute end time lower */
44	addze	r15, r3		/*     and end time upper */
45
46	WATCHDOG_RESET		/* Trigger watchdog, if needed */
471:	bl	get_ticks	/* Get current time */
48	subfc	r4, r4, r14	/* Subtract current time from end time */
49	subfe.	r3, r3, r15
50	bge	1b		/* Loop until time expired */
51
52	lwz     r15, 8(r1)	/* restore saved registers */
53	lwz     r14, 12(r1)
54	lwz     r0, 20(r1)
55	addi	r1,r1,16
56	mtlr	r0
57	blr
58