1/* $NetBSD: cpu_counter.h,v 1.9 2020/07/06 10:31:23 rin Exp $ */ 2 3/*- 4 * Copyright (c) 2000 Tsubai Masanari. 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. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef _POWERPC_CPU_COUNTER_H_ 30#define _POWERPC_CPU_COUNTER_H_ 31 32/* 33 * Machine-specific support for CPU counter. 34 */ 35 36#ifdef _KERNEL 37 38#ifdef _KERNEL_OPT 39#include "opt_ppcarch.h" 40#endif 41 42#include <powerpc/spr.h> 43#ifdef PPC_OEA601 44#include <powerpc/oea/spr.h> 45#endif 46 47#define cpu_hascounter() (1) 48#define cpu_counter() cpu_counter32() 49 50static __inline uint32_t 51cpu_counter32(void) 52{ 53 uint32_t rv, rtcu, scratch; 54 55 __asm volatile ( 56#ifdef PPC_OEA601 57 "mfpvr %0 \n" 58 "srwi %0,%0,16 \n" 59 "cmpwi %0,%3 \n" 60 "bne 1f \n" /* branch if not 601 */ 61 "lis %0,0x77 \n" 62 "ori %0,%0,0x3594 \n" /* 7.8125e6 */ 63 "mfspr %2,%4 \n" 64 "mullw %2,%2,%0 \n" 65 "mfspr %0,%5 \n" 66 "srwi %0,%0,7 \n" 67 "add %1,%2,%0 \n" 68 "b 2f \n" 69 "1: \n" 70#elif defined(PPC_IBM403) 71 "mftblo %1 \n" 72#elif defined(PPC_BOOKE) 73 "mfspr %1,%3 \n" 74#else 75 "mftb %1 \n" 76#endif 77 "2: \n" 78 : "=r"(scratch), "=r"(rv), "=r"(rtcu) 79#ifdef PPC_OEA601 80 : "n"(MPC601), "n"(SPR_RTCU_R), "n"(SPR_RTCL_R) 81#elif defined(PPC_BOOKE) 82 : "n"(SPR_TBL) 83#endif 84 ); 85 86 return rv; 87} 88 89extern uint32_t ticks_per_sec; 90 91static __inline uint64_t 92cpu_frequency(struct cpu_info *ci) 93{ 94 /* XXX this probably only works on 603 and newer */ 95 return ticks_per_sec; 96} 97 98#endif /* _KERNEL */ 99 100#endif /* _POWERPC_CPU_COUNTER_H_ */ 101