diff options
author | Greg Watson <jarrah@users.sourceforge.net> | 2003-11-02 17:01:47 +0000 |
---|---|---|
committer | Greg Watson <jarrah@users.sourceforge.net> | 2003-11-02 17:01:47 +0000 |
commit | 95e914781748db585186bb88ab88c02e4a97b8ca (patch) | |
tree | 26e37147739529d63215a415fe990deb09ba78e6 | |
parent | 5bcd408b8e72a582bfad61da827a51c2349d037a (diff) | |
download | coreboot-95e914781748db585186bb88ab88c02e4a97b8ca.tar.xz |
fix timer routines
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1241 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r-- | src/arch/ppc/lib/timebase.S | 66 | ||||
-rw-r--r-- | src/arch/ppc/lib/timer.c | 19 |
2 files changed, 69 insertions, 16 deletions
diff --git a/src/arch/ppc/lib/timebase.S b/src/arch/ppc/lib/timebase.S index 248248bd82..3c9ebc018f 100644 --- a/src/arch/ppc/lib/timebase.S +++ b/src/arch/ppc/lib/timebase.S @@ -1,12 +1,60 @@ -/* Copyright 1999-2000 AG Electronics Ltd. */ -/* This code is distributed without warranty under the GPL v2 (see COPYING) */ +/* + * (C) Copyright 2000, 2001 + * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com. + * base on code by + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ +#include <ppc_asm.tmpl> .text - .globl _timebase -_timebase: - mftbu 3 - mftb 4 - mftbu 5 - cmpw 3, 5 - bne _timebase +/* + * unsigned long long _get_ticks(void); + */ + .globl _get_ticks +_get_ticks: +1: mftbu r3 + mftb r4 + mftbu r5 + cmpw 0,r3,r5 + bne 1b blr + +/* + * Delay for a number of ticks + */ + .globl _wait_ticks +_wait_ticks: + mflr r8 /* save link register */ + mr r7, r3 /* save tick count */ + bl _get_ticks /* Get start time */ + + /* Calculate end time */ + addc r7, r4, r7 /* Compute end time lower */ + addze r6, r3 /* and end time upper */ + +1: bl _get_ticks /* Get current time */ + subfc r4, r4, r7 /* Subtract current time from end time */ + subfe. r3, r3, r6 + bge 1b /* Loop until time expired */ + + mtlr r8 /* restore link register */ + blr + diff --git a/src/arch/ppc/lib/timer.c b/src/arch/ppc/lib/timer.c index 37576d71f4..dee891af57 100644 --- a/src/arch/ppc/lib/timer.c +++ b/src/arch/ppc/lib/timer.c @@ -1,30 +1,35 @@ /* Copyright 2000 AG Electronics Ltd. */ /* This code is distributed without warranty under the GPL v2 (see COPYING) */ -#include <timer.h> #include <ppc.h> +#include <timer.h> +#include <clock.h> unsigned long get_hz(void) { return get_clock_speed(); } +#if 0 unsigned long ticks_since_boot(void) { - extern unsigned long _timebase(void); - return _timebase(); + extern unsigned long _get_ticks(void); + return _get_ticks(); } void sleep_ticks(unsigned long ticks) { - unsigned long then = ticks + ticks_since_boot(); - while(ticks_since_boot() < then) - ; + unsigned long now = ticks_since_boot(); + unsigned long then = ticks + now; + while(now < then) + now = ticks_since_boot(); } +#endif void udelay(int usecs) { + extern void _wait_ticks(unsigned long); unsigned long ticksperusec = get_hz() / 1000000; - sleep_ticks(ticksperusec * usecs); + _wait_ticks(ticksperusec * usecs); } |