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