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