| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This file is subject to the terms and conditions of the GNU General Public | 
					
						
							|  |  |  |  * License.  See the file "COPYING" in the main directory of this archive | 
					
						
							|  |  |  |  * for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 1998, 1999, 2003 by Ralf Baechle | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef _ASM_TIMEX_H
 | 
					
						
							|  |  |  | #define _ASM_TIMEX_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-07 01:00:22 +09:00
										 |  |  | #ifdef __KERNEL__
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-12 13:47:32 +02:00
										 |  |  | #include <asm/cpu-features.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <asm/mipsregs.h>
 | 
					
						
							| 
									
										
										
										
											2013-09-12 13:47:32 +02:00
										 |  |  | #include <asm/cpu-type.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-11-01 15:45:37 +00:00
										 |  |  |  * This is the clock rate of the i8253 PIT.  A MIPS system may not have | 
					
						
							|  |  |  |  * a PIT by the symbol is used all over the kernel including some APIs. | 
					
						
							|  |  |  |  * So keeping it defined to the number for the PIT is the only sane thing | 
					
						
							|  |  |  |  * for now. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-11-01 15:45:37 +00:00
										 |  |  | #define CLOCK_TICK_RATE 1193182
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Standard way to access the cycle counter. | 
					
						
							|  |  |  |  * Currently only used on SMP for scheduling. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Only the low 32 bits are available as a continuously counting entity. | 
					
						
							|  |  |  |  * But this only means we'll force a reschedule every 8 seconds or so, | 
					
						
							|  |  |  |  * which isn't an evil thing. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * We know that all SMP capable CPUs have cycle counters. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef unsigned int cycles_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-12 13:47:32 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * On R4000/R4400 before version 5.0 an erratum exists such that if the | 
					
						
							|  |  |  |  * cycle counter is read in the exact moment that it is matching the | 
					
						
							|  |  |  |  * compare register, no interrupt will be generated. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * There is a suggested workaround and also the erratum can't strike if | 
					
						
							|  |  |  |  * the compare interrupt isn't being used as the clock source device. | 
					
						
							|  |  |  |  * However for now the implementaton of this function doesn't get these | 
					
						
							|  |  |  |  * fine details right. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-10-11 23:46:15 +01:00
										 |  |  | static inline cycles_t get_cycles(void) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-09-12 13:47:32 +02:00
										 |  |  | 	switch (boot_cpu_type()) { | 
					
						
							|  |  |  | 	case CPU_R4400PC: | 
					
						
							|  |  |  | 	case CPU_R4400SC: | 
					
						
							|  |  |  | 	case CPU_R4400MC: | 
					
						
							|  |  |  | 		if ((read_c0_prid() & 0xff) >= 0x0050) | 
					
						
							|  |  |  | 			return read_c0_count(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case CPU_R4000PC: | 
					
						
							|  |  |  |         case CPU_R4000SC: | 
					
						
							|  |  |  |         case CPU_R4000MC: | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		if (cpu_has_counter) | 
					
						
							|  |  |  | 			return read_c0_count(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0;	/* no usable counter */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-07 01:00:22 +09:00
										 |  |  | #endif /* __KERNEL__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif /*  _ASM_TIMEX_H */
 |