Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.22-rc5 132 lines 2.9 kB view raw
1/* 2 * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM 3 * 4 * Based on alpha version. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12#ifndef _ASM_POWERPC_OPROFILE_IMPL_H 13#define _ASM_POWERPC_OPROFILE_IMPL_H 14#ifdef __KERNEL__ 15 16#define OP_MAX_COUNTER 8 17 18/* Per-counter configuration as set via oprofilefs. */ 19struct op_counter_config { 20 unsigned long enabled; 21 unsigned long event; 22 unsigned long count; 23 /* Classic doesn't support per-counter user/kernel selection */ 24 unsigned long kernel; 25 unsigned long user; 26 unsigned long unit_mask; 27}; 28 29/* System-wide configuration as set via oprofilefs. */ 30struct op_system_config { 31#ifdef CONFIG_PPC64 32 unsigned long mmcr0; 33 unsigned long mmcr1; 34 unsigned long mmcra; 35#endif 36 unsigned long enable_kernel; 37 unsigned long enable_user; 38}; 39 40/* Per-arch configuration */ 41struct op_powerpc_model { 42 void (*reg_setup) (struct op_counter_config *, 43 struct op_system_config *, 44 int num_counters); 45 void (*cpu_setup) (struct op_counter_config *); 46 void (*start) (struct op_counter_config *); 47 void (*global_start) (struct op_counter_config *); 48 void (*stop) (void); 49 void (*global_stop) (void); 50 void (*handle_interrupt) (struct pt_regs *, 51 struct op_counter_config *); 52 int num_counters; 53}; 54 55extern struct op_powerpc_model op_model_fsl_booke; 56extern struct op_powerpc_model op_model_rs64; 57extern struct op_powerpc_model op_model_power4; 58extern struct op_powerpc_model op_model_7450; 59extern struct op_powerpc_model op_model_cell; 60extern struct op_powerpc_model op_model_pa6t; 61 62 63/* All the classic PPC parts use these */ 64static inline unsigned int classic_ctr_read(unsigned int i) 65{ 66 switch(i) { 67 case 0: 68 return mfspr(SPRN_PMC1); 69 case 1: 70 return mfspr(SPRN_PMC2); 71 case 2: 72 return mfspr(SPRN_PMC3); 73 case 3: 74 return mfspr(SPRN_PMC4); 75 case 4: 76 return mfspr(SPRN_PMC5); 77 case 5: 78 return mfspr(SPRN_PMC6); 79 80/* No PPC32 chip has more than 6 so far */ 81#ifdef CONFIG_PPC64 82 case 6: 83 return mfspr(SPRN_PMC7); 84 case 7: 85 return mfspr(SPRN_PMC8); 86#endif 87 default: 88 return 0; 89 } 90} 91 92static inline void classic_ctr_write(unsigned int i, unsigned int val) 93{ 94 switch(i) { 95 case 0: 96 mtspr(SPRN_PMC1, val); 97 break; 98 case 1: 99 mtspr(SPRN_PMC2, val); 100 break; 101 case 2: 102 mtspr(SPRN_PMC3, val); 103 break; 104 case 3: 105 mtspr(SPRN_PMC4, val); 106 break; 107 case 4: 108 mtspr(SPRN_PMC5, val); 109 break; 110 case 5: 111 mtspr(SPRN_PMC6, val); 112 break; 113 114/* No PPC32 chip has more than 6, yet */ 115#ifdef CONFIG_PPC64 116 case 6: 117 mtspr(SPRN_PMC7, val); 118 break; 119 case 7: 120 mtspr(SPRN_PMC8, val); 121 break; 122#endif 123 default: 124 break; 125 } 126} 127 128 129extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth); 130 131#endif /* __KERNEL__ */ 132#endif /* _ASM_POWERPC_OPROFILE_IMPL_H */