1 /* $NetBSD: mips3_clock.c,v 1.10 2008/01/31 17:37:45 tsutsui Exp $ */ 2 3 /* 4 * Copyright (c) 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * the Systems Programming Group of the University of Utah Computer 9 * Science Department and Ralph Campbell. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * from: Utah Hdr: clock.c 1.18 91/01/21 36 * 37 * @(#)clock.c 8.1 (Berkeley) 6/10/93 38 */ 39 /* 40 * Copyright (c) 1988 University of Utah. 41 * 42 * This code is derived from software contributed to Berkeley by 43 * the Systems Programming Group of the University of Utah Computer 44 * Science Department and Ralph Campbell. 45 * 46 * Redistribution and use in source and binary forms, with or without 47 * modification, are permitted provided that the following conditions 48 * are met: 49 * 1. Redistributions of source code must retain the above copyright 50 * notice, this list of conditions and the following disclaimer. 51 * 2. Redistributions in binary form must reproduce the above copyright 52 * notice, this list of conditions and the following disclaimer in the 53 * documentation and/or other materials provided with the distribution. 54 * 3. All advertising materials mentioning features or use of this software 55 * must display the following acknowledgement: 56 * This product includes software developed by the University of 57 * California, Berkeley and its contributors. 58 * 4. Neither the name of the University nor the names of its contributors 59 * may be used to endorse or promote products derived from this software 60 * without specific prior written permission. 61 * 62 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 63 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 64 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 65 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 66 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 67 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 68 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 69 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 70 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 71 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 72 * SUCH DAMAGE. 73 * 74 * from: Utah Hdr: clock.c 1.18 91/01/21 75 * 76 * @(#)clock.c 8.1 (Berkeley) 6/10/93 77 */ 78 79 #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 80 81 __KERNEL_RCSID(0, "$NetBSD: mips3_clock.c,v 1.10 2008/01/31 17:37:45 tsutsui Exp $"); 82 83 #include <sys/param.h> 84 #include <sys/systm.h> 85 #include <sys/kernel.h> 86 #include <sys/timetc.h> 87 #include <sys/cpu.h> 88 89 #include <mips/mips3_clock.h> 90 91 #include <machine/intr.h> 92 #include <machine/locore.h> 93 94 /* 95 * Wait for at least "n" microseconds. 96 */ 97 void 98 mips3_delay(int n) 99 { 100 u_long divisor_delay; 101 uint32_t cur, last, delta, usecs; 102 103 last = mips3_cp0_count_read(); 104 delta = usecs = 0; 105 106 divisor_delay = curcpu()->ci_divisor_delay; 107 if (divisor_delay == 0) { 108 /* 109 * Frequency values in curcpu() are not initialized. 110 * Assume faster frequency since longer delays are harmless. 111 * Note CPU_MIPS_DOUBLE_COUNT is ignored here. 112 */ 113 #define FAST_FREQ (300 * 1000 * 1000) /* fast enough? */ 114 divisor_delay = FAST_FREQ / (1000 * 1000); 115 } 116 117 while (n > usecs) { 118 cur = mips3_cp0_count_read(); 119 120 /* 121 * The MIPS3 CP0 counter always counts upto UINT32_MAX, 122 * so no need to check wrapped around case. 123 */ 124 delta += (cur - last); 125 126 last = cur; 127 128 while (delta >= divisor_delay) { 129 /* 130 * delta is not so larger than divisor_delay here, 131 * and using DIV/DIVU ops could be much slower. 132 * (though longer delay may be harmless) 133 */ 134 usecs++; 135 delta -= divisor_delay; 136 } 137 } 138 } 139 140 /* 141 * Support for using the MIPS 3 clock as a timecounter. 142 */ 143 144 void 145 mips3_init_tc(void) 146 { 147 #if !defined(MULTIPROCESSOR) 148 static struct timecounter tc = { 149 (timecounter_get_t *)mips3_cp0_count_read, /* get_timecount */ 150 0, /* no poll_pps */ 151 ~0u, /* counter_mask */ 152 0, /* frequency */ 153 "mips3_cp0_counter", /* name */ 154 100, /* quality */ 155 }; 156 157 tc.tc_frequency = curcpu()->ci_cpu_freq; 158 if (mips_cpu_flags & CPU_MIPS_DOUBLE_COUNT) { 159 tc.tc_frequency /= 2; 160 } 161 162 tc_init(&tc); 163 #endif 164 } 165 166 __weak_alias(delay, mips3_delay); 167