Prepare v2023.10
[platform/kernel/u-boot.git] / arch / powerpc / lib / ticks.S
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2000, 2001
4  * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com.
5  *  base on code by
6  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7  */
8
9 #include <ppc_asm.tmpl>
10 #include <ppc_defs.h>
11 #include <config.h>
12
13 /*
14  * unsigned long long get_ticks(void);
15  *
16  * read timebase as "long long"
17  */
18         .globl  get_ticks
19 get_ticks:
20 1:      mftbu   r3
21         mftb    r4
22         mftbu   r5
23         cmp     0,r3,r5
24         bne     1b
25         blr
26
27 /*
28  * Delay for a number of ticks
29  */
30         .globl  wait_ticks
31 wait_ticks:
32         stwu    r1, -16(r1)
33         mflr    r0              /* save link register */
34         stw     r0, 20(r1)      /* Use r0 or GDB will be unhappy */
35         stw     r14, 12(r1)     /* save used registers */
36         stw     r15, 8(r1)
37         mr      r14, r3         /* save tick count */
38         bl      get_ticks       /* Get start time */
39
40         /* Calculate end time */
41         addc    r14, r4, r14    /* Compute end time lower */
42         addze   r15, r3         /*     and end time upper */
43
44 #if defined(CONFIG_WATCHDOG) || defined(CONFIG_HW_WATCHDOG)
45         bl      schedule        /* Trigger watchdog, if needed */
46 #endif
47 1:      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