Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.16-rc4 140 lines 3.1 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#ifdef CONFIG_OPROFILE_CELL 36 /* Register for oprofile user tool to check cell kernel profiling 37 * support. 38 */ 39 unsigned long cell_support; 40#endif 41#endif 42 unsigned long enable_kernel; 43 unsigned long enable_user; 44}; 45 46/* Per-arch configuration */ 47struct op_powerpc_model { 48 int (*reg_setup) (struct op_counter_config *, 49 struct op_system_config *, 50 int num_counters); 51 int (*cpu_setup) (struct op_counter_config *); 52 int (*start) (struct op_counter_config *); 53 int (*global_start) (struct op_counter_config *); 54 void (*stop) (void); 55 void (*global_stop) (void); 56 int (*sync_start)(void); 57 int (*sync_stop)(void); 58 void (*handle_interrupt) (struct pt_regs *, 59 struct op_counter_config *); 60 int num_counters; 61}; 62 63extern struct op_powerpc_model op_model_fsl_emb; 64extern struct op_powerpc_model op_model_rs64; 65extern struct op_powerpc_model op_model_power4; 66extern struct op_powerpc_model op_model_7450; 67extern struct op_powerpc_model op_model_cell; 68extern struct op_powerpc_model op_model_pa6t; 69 70 71/* All the classic PPC parts use these */ 72static inline unsigned int classic_ctr_read(unsigned int i) 73{ 74 switch(i) { 75 case 0: 76 return mfspr(SPRN_PMC1); 77 case 1: 78 return mfspr(SPRN_PMC2); 79 case 2: 80 return mfspr(SPRN_PMC3); 81 case 3: 82 return mfspr(SPRN_PMC4); 83 case 4: 84 return mfspr(SPRN_PMC5); 85 case 5: 86 return mfspr(SPRN_PMC6); 87 88/* No PPC32 chip has more than 6 so far */ 89#ifdef CONFIG_PPC64 90 case 6: 91 return mfspr(SPRN_PMC7); 92 case 7: 93 return mfspr(SPRN_PMC8); 94#endif 95 default: 96 return 0; 97 } 98} 99 100static inline void classic_ctr_write(unsigned int i, unsigned int val) 101{ 102 switch(i) { 103 case 0: 104 mtspr(SPRN_PMC1, val); 105 break; 106 case 1: 107 mtspr(SPRN_PMC2, val); 108 break; 109 case 2: 110 mtspr(SPRN_PMC3, val); 111 break; 112 case 3: 113 mtspr(SPRN_PMC4, val); 114 break; 115 case 4: 116 mtspr(SPRN_PMC5, val); 117 break; 118 case 5: 119 mtspr(SPRN_PMC6, val); 120 break; 121 122/* No PPC32 chip has more than 6, yet */ 123#ifdef CONFIG_PPC64 124 case 6: 125 mtspr(SPRN_PMC7, val); 126 break; 127 case 7: 128 mtspr(SPRN_PMC8, val); 129 break; 130#endif 131 default: 132 break; 133 } 134} 135 136 137extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth); 138 139#endif /* __KERNEL__ */ 140#endif /* _ASM_POWERPC_OPROFILE_IMPL_H */