diff options
Diffstat (limited to 'arch/powerpc/include/asm')
-rw-r--r-- | arch/powerpc/include/asm/hw_irq.h | 36 | ||||
-rw-r--r-- | arch/powerpc/include/asm/paca.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/perf_counter.h | 98 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/systbl.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/unistd.h | 1 |
6 files changed, 139 insertions, 1 deletions
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index b7e034b0a6dd..53512374e1c9 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
@@ -131,5 +131,41 @@ static inline int irqs_disabled_flags(unsigned long flags) | |||
131 | */ | 131 | */ |
132 | struct irq_chip; | 132 | struct irq_chip; |
133 | 133 | ||
134 | #ifdef CONFIG_PERF_COUNTERS | ||
135 | static inline unsigned long test_perf_counter_pending(void) | ||
136 | { | ||
137 | unsigned long x; | ||
138 | |||
139 | asm volatile("lbz %0,%1(13)" | ||
140 | : "=r" (x) | ||
141 | : "i" (offsetof(struct paca_struct, perf_counter_pending))); | ||
142 | return x; | ||
143 | } | ||
144 | |||
145 | static inline void set_perf_counter_pending(void) | ||
146 | { | ||
147 | asm volatile("stb %0,%1(13)" : : | ||
148 | "r" (1), | ||
149 | "i" (offsetof(struct paca_struct, perf_counter_pending))); | ||
150 | } | ||
151 | |||
152 | static inline void clear_perf_counter_pending(void) | ||
153 | { | ||
154 | asm volatile("stb %0,%1(13)" : : | ||
155 | "r" (0), | ||
156 | "i" (offsetof(struct paca_struct, perf_counter_pending))); | ||
157 | } | ||
158 | |||
159 | #else | ||
160 | |||
161 | static inline unsigned long test_perf_counter_pending(void) | ||
162 | { | ||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | static inline void set_perf_counter_pending(void) {} | ||
167 | static inline void clear_perf_counter_pending(void) {} | ||
168 | #endif /* CONFIG_PERF_COUNTERS */ | ||
169 | |||
134 | #endif /* __KERNEL__ */ | 170 | #endif /* __KERNEL__ */ |
135 | #endif /* _ASM_POWERPC_HW_IRQ_H */ | 171 | #endif /* _ASM_POWERPC_HW_IRQ_H */ |
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index 0ea1985bdb8b..c8a3cbfe02ff 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -105,6 +105,7 @@ struct paca_struct { | |||
105 | u8 soft_enabled; /* irq soft-enable flag */ | 105 | u8 soft_enabled; /* irq soft-enable flag */ |
106 | u8 hard_enabled; /* set if irqs are enabled in MSR */ | 106 | u8 hard_enabled; /* set if irqs are enabled in MSR */ |
107 | u8 io_sync; /* writel() needs spin_unlock sync */ | 107 | u8 io_sync; /* writel() needs spin_unlock sync */ |
108 | u8 perf_counter_pending; /* PM interrupt while soft-disabled */ | ||
108 | 109 | ||
109 | /* Stuff for accurate time accounting */ | 110 | /* Stuff for accurate time accounting */ |
110 | u64 user_time; /* accumulated usermode TB ticks */ | 111 | u64 user_time; /* accumulated usermode TB ticks */ |
diff --git a/arch/powerpc/include/asm/perf_counter.h b/arch/powerpc/include/asm/perf_counter.h new file mode 100644 index 000000000000..cc7c887705b8 --- /dev/null +++ b/arch/powerpc/include/asm/perf_counter.h | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * Performance counter support - PowerPC-specific definitions. | ||
3 | * | ||
4 | * Copyright 2008-2009 Paul Mackerras, IBM Corporation. | ||
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 | #include <linux/types.h> | ||
12 | |||
13 | #define MAX_HWCOUNTERS 8 | ||
14 | #define MAX_EVENT_ALTERNATIVES 8 | ||
15 | #define MAX_LIMITED_HWCOUNTERS 2 | ||
16 | |||
17 | /* | ||
18 | * This struct provides the constants and functions needed to | ||
19 | * describe the PMU on a particular POWER-family CPU. | ||
20 | */ | ||
21 | struct power_pmu { | ||
22 | int n_counter; | ||
23 | int max_alternatives; | ||
24 | u64 add_fields; | ||
25 | u64 test_adder; | ||
26 | int (*compute_mmcr)(u64 events[], int n_ev, | ||
27 | unsigned int hwc[], u64 mmcr[]); | ||
28 | int (*get_constraint)(u64 event, u64 *mskp, u64 *valp); | ||
29 | int (*get_alternatives)(u64 event, unsigned int flags, | ||
30 | u64 alt[]); | ||
31 | void (*disable_pmc)(unsigned int pmc, u64 mmcr[]); | ||
32 | int (*limited_pmc_event)(u64 event); | ||
33 | u32 flags; | ||
34 | int n_generic; | ||
35 | int *generic_events; | ||
36 | int (*cache_events)[PERF_COUNT_HW_CACHE_MAX] | ||
37 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
38 | [PERF_COUNT_HW_CACHE_RESULT_MAX]; | ||
39 | }; | ||
40 | |||
41 | extern struct power_pmu *ppmu; | ||
42 | |||
43 | /* | ||
44 | * Values for power_pmu.flags | ||
45 | */ | ||
46 | #define PPMU_LIMITED_PMC5_6 1 /* PMC5/6 have limited function */ | ||
47 | #define PPMU_ALT_SIPR 2 /* uses alternate posn for SIPR/HV */ | ||
48 | |||
49 | /* | ||
50 | * Values for flags to get_alternatives() | ||
51 | */ | ||
52 | #define PPMU_LIMITED_PMC_OK 1 /* can put this on a limited PMC */ | ||
53 | #define PPMU_LIMITED_PMC_REQD 2 /* have to put this on a limited PMC */ | ||
54 | #define PPMU_ONLY_COUNT_RUN 4 /* only counting in run state */ | ||
55 | |||
56 | struct pt_regs; | ||
57 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | ||
58 | #define perf_misc_flags(regs) perf_misc_flags(regs) | ||
59 | |||
60 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | ||
61 | |||
62 | /* | ||
63 | * The power_pmu.get_constraint function returns a 64-bit value and | ||
64 | * a 64-bit mask that express the constraints between this event and | ||
65 | * other events. | ||
66 | * | ||
67 | * The value and mask are divided up into (non-overlapping) bitfields | ||
68 | * of three different types: | ||
69 | * | ||
70 | * Select field: this expresses the constraint that some set of bits | ||
71 | * in MMCR* needs to be set to a specific value for this event. For a | ||
72 | * select field, the mask contains 1s in every bit of the field, and | ||
73 | * the value contains a unique value for each possible setting of the | ||
74 | * MMCR* bits. The constraint checking code will ensure that two events | ||
75 | * that set the same field in their masks have the same value in their | ||
76 | * value dwords. | ||
77 | * | ||
78 | * Add field: this expresses the constraint that there can be at most | ||
79 | * N events in a particular class. A field of k bits can be used for | ||
80 | * N <= 2^(k-1) - 1. The mask has the most significant bit of the field | ||
81 | * set (and the other bits 0), and the value has only the least significant | ||
82 | * bit of the field set. In addition, the 'add_fields' and 'test_adder' | ||
83 | * in the struct power_pmu for this processor come into play. The | ||
84 | * add_fields value contains 1 in the LSB of the field, and the | ||
85 | * test_adder contains 2^(k-1) - 1 - N in the field. | ||
86 | * | ||
87 | * NAND field: this expresses the constraint that you may not have events | ||
88 | * in all of a set of classes. (For example, on PPC970, you can't select | ||
89 | * events from the FPU, ISU and IDU simultaneously, although any two are | ||
90 | * possible.) For N classes, the field is N+1 bits wide, and each class | ||
91 | * is assigned one bit from the least-significant N bits. The mask has | ||
92 | * only the most-significant bit set, and the value has only the bit | ||
93 | * for the event's class set. The test_adder has the least significant | ||
94 | * bit set in the field. | ||
95 | * | ||
96 | * If an event is not subject to the constraint expressed by a particular | ||
97 | * field, then it will have 0 in both the mask and value for that field. | ||
98 | */ | ||
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index e8018d540e87..fb359b0a6937 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -492,11 +492,13 @@ | |||
492 | #define MMCR0_FCHV 0x00000001UL /* freeze conditions in hypervisor mode */ | 492 | #define MMCR0_FCHV 0x00000001UL /* freeze conditions in hypervisor mode */ |
493 | #define SPRN_MMCR1 798 | 493 | #define SPRN_MMCR1 798 |
494 | #define SPRN_MMCRA 0x312 | 494 | #define SPRN_MMCRA 0x312 |
495 | #define MMCRA_SDSYNC 0x80000000UL /* SDAR synced with SIAR */ | ||
495 | #define MMCRA_SIHV 0x10000000UL /* state of MSR HV when SIAR set */ | 496 | #define MMCRA_SIHV 0x10000000UL /* state of MSR HV when SIAR set */ |
496 | #define MMCRA_SIPR 0x08000000UL /* state of MSR PR when SIAR set */ | 497 | #define MMCRA_SIPR 0x08000000UL /* state of MSR PR when SIAR set */ |
497 | #define MMCRA_SLOT 0x07000000UL /* SLOT bits (37-39) */ | 498 | #define MMCRA_SLOT 0x07000000UL /* SLOT bits (37-39) */ |
498 | #define MMCRA_SLOT_SHIFT 24 | 499 | #define MMCRA_SLOT_SHIFT 24 |
499 | #define MMCRA_SAMPLE_ENABLE 0x00000001UL /* enable sampling */ | 500 | #define MMCRA_SAMPLE_ENABLE 0x00000001UL /* enable sampling */ |
501 | #define POWER6_MMCRA_SDSYNC 0x0000080000000000ULL /* SDAR/SIAR synced */ | ||
500 | #define POWER6_MMCRA_SIHV 0x0000040000000000ULL | 502 | #define POWER6_MMCRA_SIHV 0x0000040000000000ULL |
501 | #define POWER6_MMCRA_SIPR 0x0000020000000000ULL | 503 | #define POWER6_MMCRA_SIPR 0x0000020000000000ULL |
502 | #define POWER6_MMCRA_THRM 0x00000020UL | 504 | #define POWER6_MMCRA_THRM 0x00000020UL |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index d98a30dfd41c..a0b92de51c7e 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -322,6 +322,6 @@ SYSCALL_SPU(epoll_create1) | |||
322 | SYSCALL_SPU(dup3) | 322 | SYSCALL_SPU(dup3) |
323 | SYSCALL_SPU(pipe2) | 323 | SYSCALL_SPU(pipe2) |
324 | SYSCALL(inotify_init1) | 324 | SYSCALL(inotify_init1) |
325 | SYSCALL(ni_syscall) | 325 | SYSCALL_SPU(perf_counter_open) |
326 | COMPAT_SYS_SPU(preadv) | 326 | COMPAT_SYS_SPU(preadv) |
327 | COMPAT_SYS_SPU(pwritev) | 327 | COMPAT_SYS_SPU(pwritev) |
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 3f06f8ec81c5..4badac2d11d1 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
@@ -341,6 +341,7 @@ | |||
341 | #define __NR_dup3 316 | 341 | #define __NR_dup3 316 |
342 | #define __NR_pipe2 317 | 342 | #define __NR_pipe2 317 |
343 | #define __NR_inotify_init1 318 | 343 | #define __NR_inotify_init1 318 |
344 | #define __NR_perf_counter_open 319 | ||
344 | #define __NR_preadv 320 | 345 | #define __NR_preadv 320 |
345 | #define __NR_pwritev 321 | 346 | #define __NR_pwritev 321 |
346 | 347 | ||