fix timer routines
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1241 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
		| @@ -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 | 	.text | ||||||
| 	.globl	_timebase | /* | ||||||
| _timebase: |  * unsigned long long _get_ticks(void); | ||||||
| 	mftbu	3 |  */ | ||||||
| 	mftb    4 | 	.globl	_get_ticks | ||||||
| 	mftbu	5 | _get_ticks: | ||||||
| 	cmpw	3, 5 | 1:	mftbu	r3 | ||||||
| 	bne	_timebase | 	mftb    r4 | ||||||
|  | 	mftbu	r5 | ||||||
|  | 	cmpw	0,r3,r5 | ||||||
|  | 	bne	1b | ||||||
| 	blr | 	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 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,30 +1,35 @@ | |||||||
| /* Copyright 2000  AG Electronics Ltd. */ | /* Copyright 2000  AG Electronics Ltd. */ | ||||||
| /* This code is distributed without warranty under the GPL v2 (see COPYING) */ | /* This code is distributed without warranty under the GPL v2 (see COPYING) */ | ||||||
|  |  | ||||||
| #include <timer.h> |  | ||||||
| #include <ppc.h> | #include <ppc.h> | ||||||
|  | #include <timer.h> | ||||||
|  | #include <clock.h> | ||||||
|  |  | ||||||
| unsigned long get_hz(void) | unsigned long get_hz(void) | ||||||
| { | { | ||||||
| 	return get_clock_speed(); | 	return get_clock_speed(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
| unsigned long ticks_since_boot(void) | unsigned long ticks_since_boot(void) | ||||||
| { | { | ||||||
| 	extern unsigned long _timebase(void); | 	extern unsigned long _get_ticks(void); | ||||||
| 	return _timebase(); | 	return _get_ticks(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void sleep_ticks(unsigned long ticks) | void sleep_ticks(unsigned long ticks) | ||||||
| { | { | ||||||
| 	unsigned long then = ticks + ticks_since_boot(); | 	unsigned long now = ticks_since_boot(); | ||||||
| 	while(ticks_since_boot() < then) | 	unsigned long then = ticks + now; | ||||||
| 		; | 	while(now < then) | ||||||
|  | 		now = ticks_since_boot(); | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| void udelay(int usecs) | void udelay(int usecs) | ||||||
| { | { | ||||||
|  | 	extern void _wait_ticks(unsigned long); | ||||||
| 	unsigned long ticksperusec = get_hz() / 1000000; | 	unsigned long ticksperusec = get_hz() / 1000000; | ||||||
|  |  | ||||||
| 	sleep_ticks(ticksperusec * usecs); | 	_wait_ticks(ticksperusec * usecs); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user