Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.13-rc5 124 lines 3.2 kB view raw
1/* 2 * Common time prototypes and such for all ppc machines. 3 * 4 * Written by Cort Dougan (cort@cs.nmt.edu) to merge 5 * Paul Mackerras' version and mine for PReP and Pmac. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13#ifndef __PPC64_TIME_H 14#define __PPC64_TIME_H 15 16#ifdef __KERNEL__ 17#include <linux/config.h> 18#include <linux/types.h> 19#include <linux/mc146818rtc.h> 20 21#include <asm/processor.h> 22#include <asm/paca.h> 23#include <asm/iSeries/HvCall.h> 24 25/* time.c */ 26extern unsigned long tb_ticks_per_jiffy; 27extern unsigned long tb_ticks_per_usec; 28extern unsigned long tb_ticks_per_sec; 29extern unsigned long tb_to_xs; 30extern unsigned tb_to_us; 31extern unsigned long tb_last_stamp; 32 33struct rtc_time; 34extern void to_tm(int tim, struct rtc_time * tm); 35extern time_t last_rtc_update; 36 37void generic_calibrate_decr(void); 38void setup_default_decr(void); 39 40/* Some sane defaults: 125 MHz timebase, 1GHz processor */ 41extern unsigned long ppc_proc_freq; 42#define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8) 43extern unsigned long ppc_tb_freq; 44#define DEFAULT_TB_FREQ 125000000UL 45 46/* 47 * By putting all of this stuff into a single struct we 48 * reduce the number of cache lines touched by do_gettimeofday. 49 * Both by collecting all of the data in one cache line and 50 * by touching only one TOC entry 51 */ 52struct gettimeofday_vars { 53 unsigned long tb_to_xs; 54 unsigned long stamp_xsec; 55 unsigned long tb_orig_stamp; 56}; 57 58struct gettimeofday_struct { 59 unsigned long tb_ticks_per_sec; 60 struct gettimeofday_vars vars[2]; 61 struct gettimeofday_vars * volatile varp; 62 unsigned var_idx; 63 unsigned tb_to_us; 64}; 65 66struct div_result { 67 unsigned long result_high; 68 unsigned long result_low; 69}; 70 71int via_calibrate_decr(void); 72 73static __inline__ unsigned long get_tb(void) 74{ 75 return mftb(); 76} 77 78/* Accessor functions for the decrementer register. */ 79static __inline__ unsigned int get_dec(void) 80{ 81 return (mfspr(SPRN_DEC)); 82} 83 84static __inline__ void set_dec(int val) 85{ 86#ifdef CONFIG_PPC_ISERIES 87 struct paca_struct *lpaca = get_paca(); 88 int cur_dec; 89 90 if (lpaca->lppaca.shared_proc) { 91 lpaca->lppaca.virtual_decr = val; 92 cur_dec = get_dec(); 93 if (cur_dec > val) 94 HvCall_setVirtualDecr(); 95 } else 96#endif 97 mtspr(SPRN_DEC, val); 98} 99 100static inline unsigned long tb_ticks_since(unsigned long tstamp) 101{ 102 return get_tb() - tstamp; 103} 104 105#define mulhwu(x,y) \ 106({unsigned z; asm ("mulhwu %0,%1,%2" : "=r" (z) : "r" (x), "r" (y)); z;}) 107#define mulhdu(x,y) \ 108({unsigned long z; asm ("mulhdu %0,%1,%2" : "=r" (z) : "r" (x), "r" (y)); z;}) 109 110 111unsigned mulhwu_scale_factor(unsigned, unsigned); 112void div128_by_32( unsigned long dividend_high, unsigned long dividend_low, 113 unsigned divisor, struct div_result *dr ); 114 115/* Used to store Processor Utilization register (purr) values */ 116 117struct cpu_usage { 118 u64 current_tb; /* Holds the current purr register values */ 119}; 120 121DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array); 122 123#endif /* __KERNEL__ */ 124#endif /* __PPC64_TIME_H */