30c71a03b189b583db02c9c219d020e010234852
[linux-2.6.git] / arch / ppc64 / oprofile / op_impl.h
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 OP_IMPL_H
13 #define OP_IMPL_H 1
14
15 #define OP_MAX_COUNTER 8
16
17 #define MSR_PMM         (1UL << (63 - 61))
18
19 /* freeze counters. set to 1 on a perfmon exception */
20 #define MMCR0_FC        (1UL << (31 - 0))
21
22 /* freeze in supervisor state */
23 #define MMCR0_KERNEL_DISABLE (1UL << (31 - 1))
24
25 /* freeze in problem state */
26 #define MMCR0_PROBLEM_DISABLE (1UL << (31 - 2))
27
28 /* freeze counters while MSR mark = 1 */
29 #define MMCR0_FCM1      (1UL << (31 - 3))
30
31 /* performance monitor exception enable */
32 #define MMCR0_PMXE      (1UL << (31 - 5))
33
34 /* freeze counters on enabled condition or event */
35 #define MMCR0_FCECE     (1UL << (31 - 6))
36
37 /* PMC1 count enable*/
38 #define MMCR0_PMC1INTCONTROL    (1UL << (31 - 16))
39
40 /* PMCn count enable*/
41 #define MMCR0_PMCNINTCONTROL    (1UL << (31 - 17))
42
43 /* performance monitor alert has occurred, set to 0 after handling exception */
44 #define MMCR0_PMAO      (1UL << (31 - 24))
45
46 /* state of MSR HV when SIAR set */
47 #define MMCRA_SIHV      (1UL << (63 - 35))
48
49 /* state of MSR PR when SIAR set */
50 #define MMCRA_SIPR      (1UL << (63 - 36))
51
52 /* enable sampling */
53 #define MMCRA_SAMPLE_ENABLE     (1UL << (63 - 63))
54
55 /* Per-counter configuration as set via oprofilefs.  */
56 struct op_counter_config {
57         unsigned long valid;
58         unsigned long enabled;
59         unsigned long event;
60         unsigned long count;
61         unsigned long kernel;
62         /* We dont support per counter user/kernel selection */
63         unsigned long user;
64         unsigned long unit_mask;
65 };
66
67 /* System-wide configuration as set via oprofilefs.  */
68 struct op_system_config {
69         unsigned long mmcr0;
70         unsigned long mmcr1;
71         unsigned long mmcra;
72         unsigned long enable_kernel;
73         unsigned long enable_user;
74         unsigned long backtrace_spinlocks;
75 };
76
77 /* Per-arch configuration */
78 struct op_ppc64_model {
79         void (*reg_setup) (struct op_counter_config *,
80                            struct op_system_config *,
81                            int num_counters);
82         void (*cpu_setup) (void *);
83         void (*start) (struct op_counter_config *);
84         void (*stop) (void);
85         void (*handle_interrupt) (struct pt_regs *,
86                                   struct op_counter_config *);
87         int num_counters;
88 };
89
90 static inline unsigned int ctr_read(unsigned int i)
91 {
92         switch(i) {
93         case 0:
94                 return mfspr(SPRN_PMC1);
95         case 1:
96                 return mfspr(SPRN_PMC2);
97         case 2:
98                 return mfspr(SPRN_PMC3);
99         case 3:
100                 return mfspr(SPRN_PMC4);
101         case 4:
102                 return mfspr(SPRN_PMC5);
103         case 5:
104                 return mfspr(SPRN_PMC6);
105         case 6:
106                 return mfspr(SPRN_PMC7);
107         case 7:
108                 return mfspr(SPRN_PMC8);
109         default:
110                 return 0;
111         }
112 }
113
114 static inline void ctr_write(unsigned int i, unsigned int val)
115 {
116         switch(i) {
117         case 0:
118                 mtspr(SPRN_PMC1, val);
119                 break;
120         case 1:
121                 mtspr(SPRN_PMC2, val);
122                 break;
123         case 2:
124                 mtspr(SPRN_PMC3, val);
125                 break;
126         case 3:
127                 mtspr(SPRN_PMC4, val);
128                 break;
129         case 4:
130                 mtspr(SPRN_PMC5, val);
131                 break;
132         case 5:
133                 mtspr(SPRN_PMC6, val);
134                 break;
135         case 6:
136                 mtspr(SPRN_PMC7, val);
137                 break;
138         case 7:
139                 mtspr(SPRN_PMC8, val);
140                 break;
141         default:
142                 break;
143         }
144 }
145
146 #endif