clock.c revision 192109
1/*- 2 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 3 * Copyright (C) 1995, 1996 TooLs GmbH. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by TooLs GmbH. 17 * 4. The name of TooLs GmbH may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 * $NetBSD: clock.c,v 1.9 2000/01/19 02:52:19 msaitoh Exp $ 32 */ 33/* 34 * Copyright (C) 2001 Benno Rice. 35 * All rights reserved. 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 46 * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR 47 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 48 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 49 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 51 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 52 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 53 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 54 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 55 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56 */ 57 58#include <sys/cdefs.h> 59__FBSDID("$FreeBSD: head/sys/powerpc/aim/clock.c 192109 2009-05-14 16:48:25Z raj $"); 60 61#include <sys/param.h> 62#include <sys/systm.h> 63#include <sys/kernel.h> 64#include <sys/bus.h> 65#include <sys/interrupt.h> 66#include <sys/pcpu.h> 67#include <sys/sysctl.h> 68#include <sys/timetc.h> 69 70#include <dev/ofw/openfirm.h> 71 72#include <machine/clock.h> 73#include <machine/cpu.h> 74#include <machine/intr.h> 75#include <machine/md_var.h> 76#include <machine/smp.h> 77 78/* 79 * Initially we assume a processor with a bus frequency of 12.5 MHz. 80 */ 81u_long ns_per_tick = 80; 82static u_long ticks_per_sec = 12500000; 83static long ticks_per_intr; 84 85static timecounter_get_t decr_get_timecount; 86 87static struct timecounter decr_timecounter = { 88 decr_get_timecount, /* get_timecount */ 89 0, /* no poll_pps */ 90 ~0u, /* counter_mask */ 91 0, /* frequency */ 92 "decrementer" /* name */ 93}; 94 95void 96decr_intr(struct trapframe *frame) 97{ 98 long tick; 99 int nticks; 100 101 /* 102 * Check whether we are initialized. 103 */ 104 if (!ticks_per_intr) 105 return; 106 107 /* 108 * Based on the actual time delay since the last decrementer reload, 109 * we arrange for earlier interrupt next time. 110 */ 111 __asm ("mfdec %0" : "=r"(tick)); 112 for (nticks = 0; tick < 0; nticks++) 113 tick += ticks_per_intr; 114 mtdec(tick); 115 116 if (PCPU_GET(cpuid) == 0) { 117 while (nticks-- > 0) 118 hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); 119 } else { 120 while (nticks-- > 0) 121 hardclock_cpu(TRAPF_USERMODE(frame)); 122 } 123} 124 125void 126decr_init(void) 127{ 128 struct cpuref cpu; 129 register_t msr; 130 131 /* 132 * Check the BSP's timebase frequency. Sometimes we can't find the BSP, so fall 133 * back to the first CPU in this case. 134 */ 135 136 if (platform_smp_get_bsp(&cpu) != 0) 137 platform_smp_first_cpu(&cpu); 138 139 ticks_per_sec = platform_timebase_freq(&cpu); 140 141 msr = mfmsr(); 142 mtmsr(msr & ~PSL_EE); 143 144 ns_per_tick = 1000000000 / ticks_per_sec; 145 ticks_per_intr = ticks_per_sec / hz; 146 mtdec(ticks_per_intr); 147 148 mtmsr(msr); 149} 150 151#ifdef SMP 152void 153decr_ap_init(void) 154{ 155 156} 157#endif 158 159void 160decr_tc_init(void) 161{ 162 decr_timecounter.tc_frequency = ticks_per_sec; 163 tc_init(&decr_timecounter); 164} 165 166static unsigned 167decr_get_timecount(struct timecounter *tc) 168{ 169 register_t tb; 170 171 __asm __volatile("mftb %0" : "=r"(tb)); 172 return (tb); 173} 174 175/* 176 * Wait for about n microseconds (at least!). 177 */ 178void 179DELAY(int n) 180{ 181 u_quad_t tb, ttb; 182 183 tb = mftb(); 184 ttb = tb + (n * 1000 + ns_per_tick - 1) / ns_per_tick; 185 while (tb < ttb) 186 tb = mftb(); 187} 188 189/* 190 * Nothing to do. 191 */ 192void 193cpu_startprofclock(void) 194{ 195 196 /* Do nothing */ 197} 198 199void 200cpu_stopprofclock(void) 201{ 202} 203