• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
4  *
5  * Based on alpha version.
6  */
7 
8 #ifndef _ASM_POWERPC_OPROFILE_IMPL_H
9 #define _ASM_POWERPC_OPROFILE_IMPL_H
10 #ifdef __KERNEL__
11 
12 #define OP_MAX_COUNTER 8
13 
14 /* Per-counter configuration as set via oprofilefs.  */
15 struct op_counter_config {
16 	unsigned long enabled;
17 	unsigned long event;
18 	unsigned long count;
19 	/* Classic doesn't support per-counter user/kernel selection */
20 	unsigned long kernel;
21 	unsigned long user;
22 	unsigned long unit_mask;
23 };
24 
25 /* System-wide configuration as set via oprofilefs.  */
26 struct op_system_config {
27 #ifdef CONFIG_PPC64
28 	unsigned long mmcr0;
29 	unsigned long mmcr1;
30 	unsigned long mmcra;
31 #ifdef CONFIG_OPROFILE_CELL
32 	/* Register for oprofile user tool to check cell kernel profiling
33 	 * support.
34 	 */
35 	unsigned long cell_support;
36 #endif
37 #endif
38 	unsigned long enable_kernel;
39 	unsigned long enable_user;
40 };
41 
42 /* Per-arch configuration */
43 struct op_powerpc_model {
44 	int (*reg_setup) (struct op_counter_config *,
45 			   struct op_system_config *,
46 			   int num_counters);
47 	int  (*cpu_setup) (struct op_counter_config *);
48 	int  (*start) (struct op_counter_config *);
49 	int  (*global_start) (struct op_counter_config *);
50 	void (*stop) (void);
51 	void (*global_stop) (void);
52 	int (*sync_start)(void);
53 	int (*sync_stop)(void);
54 	void (*handle_interrupt) (struct pt_regs *,
55 				  struct op_counter_config *);
56 	int num_counters;
57 };
58 
59 extern struct op_powerpc_model op_model_fsl_emb;
60 extern struct op_powerpc_model op_model_power4;
61 extern struct op_powerpc_model op_model_7450;
62 extern struct op_powerpc_model op_model_cell;
63 extern struct op_powerpc_model op_model_pa6t;
64 
65 
66 /* All the classic PPC parts use these */
classic_ctr_read(unsigned int i)67 static inline unsigned int classic_ctr_read(unsigned int i)
68 {
69 	switch(i) {
70 	case 0:
71 		return mfspr(SPRN_PMC1);
72 	case 1:
73 		return mfspr(SPRN_PMC2);
74 	case 2:
75 		return mfspr(SPRN_PMC3);
76 	case 3:
77 		return mfspr(SPRN_PMC4);
78 	case 4:
79 		return mfspr(SPRN_PMC5);
80 	case 5:
81 		return mfspr(SPRN_PMC6);
82 
83 /* No PPC32 chip has more than 6 so far */
84 #ifdef CONFIG_PPC64
85 	case 6:
86 		return mfspr(SPRN_PMC7);
87 	case 7:
88 		return mfspr(SPRN_PMC8);
89 #endif
90 	default:
91 		return 0;
92 	}
93 }
94 
classic_ctr_write(unsigned int i,unsigned int val)95 static inline void classic_ctr_write(unsigned int i, unsigned int val)
96 {
97 	switch(i) {
98 	case 0:
99 		mtspr(SPRN_PMC1, val);
100 		break;
101 	case 1:
102 		mtspr(SPRN_PMC2, val);
103 		break;
104 	case 2:
105 		mtspr(SPRN_PMC3, val);
106 		break;
107 	case 3:
108 		mtspr(SPRN_PMC4, val);
109 		break;
110 	case 4:
111 		mtspr(SPRN_PMC5, val);
112 		break;
113 	case 5:
114 		mtspr(SPRN_PMC6, val);
115 		break;
116 
117 /* No PPC32 chip has more than 6, yet */
118 #ifdef CONFIG_PPC64
119 	case 6:
120 		mtspr(SPRN_PMC7, val);
121 		break;
122 	case 7:
123 		mtspr(SPRN_PMC8, val);
124 		break;
125 #endif
126 	default:
127 		break;
128 	}
129 }
130 
131 
132 extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth);
133 
134 #endif /* __KERNEL__ */
135 #endif /* _ASM_POWERPC_OPROFILE_IMPL_H */
136