1
2
3
4
5
6
7
8
9
10
11#include <linux/kernel.h>
12#include <linux/sched.h>
13#include <linux/perf_event.h>
14#include <linux/percpu.h>
15#include <linux/hardirq.h>
16#include <linux/uaccess.h>
17#include <asm/reg.h>
18#include <asm/pmc.h>
19#include <asm/machdep.h>
20#include <asm/firmware.h>
21#include <asm/ptrace.h>
22#include <asm/code-patching.h>
23
24#define BHRB_MAX_ENTRIES 32
25#define BHRB_TARGET 0x0000000000000002
26#define BHRB_PREDICTION 0x0000000000000001
27#define BHRB_EA 0xFFFFFFFFFFFFFFFCUL
28
29struct cpu_hw_events {
30 int n_events;
31 int n_percpu;
32 int disabled;
33 int n_added;
34 int n_limited;
35 u8 pmcs_enabled;
36 struct perf_event *event[MAX_HWEVENTS];
37 u64 events[MAX_HWEVENTS];
38 unsigned int flags[MAX_HWEVENTS];
39
40
41
42
43
44 unsigned long mmcr[4];
45 struct perf_event *limited_counter[MAX_LIMITED_HWCOUNTERS];
46 u8 limited_hwidx[MAX_LIMITED_HWCOUNTERS];
47 u64 alternatives[MAX_HWEVENTS][MAX_EVENT_ALTERNATIVES];
48 unsigned long amasks[MAX_HWEVENTS][MAX_EVENT_ALTERNATIVES];
49 unsigned long avalues[MAX_HWEVENTS][MAX_EVENT_ALTERNATIVES];
50
51 unsigned int txn_flags;
52 int n_txn_start;
53
54
55 u64 bhrb_filter;
56 unsigned int bhrb_users;
57 void *bhrb_context;
58 struct perf_branch_stack bhrb_stack;
59 struct perf_branch_entry bhrb_entries[BHRB_MAX_ENTRIES];
60 u64 ic_init;
61};
62
63static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
64
65static struct power_pmu *ppmu;
66
67
68
69
70
71
72
73
74static unsigned int freeze_events_kernel = MMCR0_FCS;
75
76
77
78
79
80#ifdef CONFIG_PPC32
81
82#define MMCR0_FCHV 0
83#define MMCR0_PMCjCE MMCR0_PMCnCE
84#define MMCR0_FC56 0
85#define MMCR0_PMAO 0
86#define MMCR0_EBE 0
87#define MMCR0_BHRBA 0
88#define MMCR0_PMCC 0
89#define MMCR0_PMCC_U6 0
90
91#define SPRN_MMCRA SPRN_MMCR2
92#define MMCRA_SAMPLE_ENABLE 0
93
94static inline unsigned long perf_ip_adjust(struct pt_regs *regs)
95{
96 return 0;
97}
98static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp) { }
99static inline u32 perf_get_misc_flags(struct pt_regs *regs)
100{
101 return 0;
102}
103static inline void perf_read_regs(struct pt_regs *regs)
104{
105 regs->result = 0;
106}
107static inline int perf_intr_is_nmi(struct pt_regs *regs)
108{
109 return 0;
110}
111
112static inline int siar_valid(struct pt_regs *regs)
113{
114 return 1;
115}
116
117static bool is_ebb_event(struct perf_event *event) { return false; }
118static int ebb_event_check(struct perf_event *event) { return 0; }
119static void ebb_event_add(struct perf_event *event) { }
120static void ebb_switch_out(unsigned long mmcr0) { }
121static unsigned long ebb_switch_in(bool ebb, struct cpu_hw_events *cpuhw)
122{
123 return cpuhw->mmcr[0];
124}
125
126static inline void power_pmu_bhrb_enable(struct perf_event *event) {}
127static inline void power_pmu_bhrb_disable(struct perf_event *event) {}
128static void power_pmu_sched_task(struct perf_event_context *ctx, bool sched_in) {}
129static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}
130static void pmao_restore_workaround(bool ebb) { }
131static bool use_ic(u64 event)
132{
133 return false;
134}
135#endif
136
137static bool regs_use_siar(struct pt_regs *regs)
138{
139
140
141
142
143
144
145
146
147
148 return ((TRAP(regs) == 0xf00) && regs->result);
149}
150
151
152
153
154#ifdef CONFIG_PPC64
155
156static inline unsigned long perf_ip_adjust(struct pt_regs *regs)
157{
158 unsigned long mmcra = regs->dsisr;
159
160 if ((ppmu->flags & PPMU_HAS_SSLOT) && (mmcra & MMCRA_SAMPLE_ENABLE)) {
161 unsigned long slot = (mmcra & MMCRA_SLOT) >> MMCRA_SLOT_SHIFT;
162 if (slot > 1)
163 return 4 * (slot - 1);
164 }
165
166 return 0;
167}
168
169
170
171
172
173
174
175
176
177static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)
178{
179 unsigned long mmcra = regs->dsisr;
180 bool sdar_valid;
181
182 if (ppmu->flags & PPMU_HAS_SIER)
183 sdar_valid = regs->dar & SIER_SDAR_VALID;
184 else {
185 unsigned long sdsync;
186
187 if (ppmu->flags & PPMU_SIAR_VALID)
188 sdsync = POWER7P_MMCRA_SDAR_VALID;
189 else if (ppmu->flags & PPMU_ALT_SIPR)
190 sdsync = POWER6_MMCRA_SDSYNC;
191 else if (ppmu->flags & PPMU_NO_SIAR)
192 sdsync = MMCRA_SAMPLE_ENABLE;
193 else
194 sdsync = MMCRA_SDSYNC;
195
196 sdar_valid = mmcra & sdsync;
197 }
198
199 if (!(mmcra & MMCRA_SAMPLE_ENABLE) || sdar_valid)
200 *addrp = mfspr(SPRN_SDAR);
201}
202
203static bool regs_sihv(struct pt_regs *regs)
204{
205 unsigned long sihv = MMCRA_SIHV;
206
207 if (ppmu->flags & PPMU_HAS_SIER)
208 return !!(regs->dar & SIER_SIHV);
209
210 if (ppmu->flags & PPMU_ALT_SIPR)
211 sihv = POWER6_MMCRA_SIHV;
212
213 return !!(regs->dsisr & sihv);
214}
215
216static bool regs_sipr(struct pt_regs *regs)
217{
218 unsigned long sipr = MMCRA_SIPR;
219
220 if (ppmu->flags & PPMU_HAS_SIER)
221 return !!(regs->dar & SIER_SIPR);
222
223 if (ppmu->flags & PPMU_ALT_SIPR)
224 sipr = POWER6_MMCRA_SIPR;
225
226 return !!(regs->dsisr & sipr);
227}
228
229static inline u32 perf_flags_from_msr(struct pt_regs *regs)
230{
231 if (regs->msr & MSR_PR)
232 return PERF_RECORD_MISC_USER;
233 if ((regs->msr & MSR_HV) && freeze_events_kernel != MMCR0_FCHV)
234 return PERF_RECORD_MISC_HYPERVISOR;
235 return PERF_RECORD_MISC_KERNEL;
236}
237
238static inline u32 perf_get_misc_flags(struct pt_regs *regs)
239{
240 bool use_siar = regs_use_siar(regs);
241
242 if (!use_siar)
243 return perf_flags_from_msr(regs);
244
245
246
247
248
249
250
251 if (ppmu->flags & PPMU_NO_SIPR) {
252 unsigned long siar = mfspr(SPRN_SIAR);
253 if (is_kernel_addr(siar))
254 return PERF_RECORD_MISC_KERNEL;
255 return PERF_RECORD_MISC_USER;
256 }
257
258
259 if (regs_sipr(regs))
260 return PERF_RECORD_MISC_USER;
261
262 if (regs_sihv(regs) && (freeze_events_kernel != MMCR0_FCHV))
263 return PERF_RECORD_MISC_HYPERVISOR;
264
265 return PERF_RECORD_MISC_KERNEL;
266}
267
268
269
270
271
272
273
274
275static inline void perf_read_regs(struct pt_regs *regs)
276{
277 unsigned long mmcra = mfspr(SPRN_MMCRA);
278 int marked = mmcra & MMCRA_SAMPLE_ENABLE;
279 int use_siar;
280
281 regs->dsisr = mmcra;
282
283 if (ppmu->flags & PPMU_HAS_SIER)
284 regs->dar = mfspr(SPRN_SIER);
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303 if (TRAP(regs) != 0xf00)
304 use_siar = 0;
305 else if ((ppmu->flags & PPMU_NO_SIAR))
306 use_siar = 0;
307 else if (marked)
308 use_siar = 1;
309 else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING))
310 use_siar = 0;
311 else if (!(ppmu->flags & PPMU_NO_SIPR) && regs_sipr(regs))
312 use_siar = 0;
313 else
314 use_siar = 1;
315
316 regs->result = use_siar;
317}
318
319
320
321
322
323static inline int perf_intr_is_nmi(struct pt_regs *regs)
324{
325 return !regs->softe;
326}
327
328
329
330
331
332
333
334
335static inline int siar_valid(struct pt_regs *regs)
336{
337 unsigned long mmcra = regs->dsisr;
338 int marked = mmcra & MMCRA_SAMPLE_ENABLE;
339
340 if (marked) {
341 if (ppmu->flags & PPMU_HAS_SIER)
342 return regs->dar & SIER_SIAR_VALID;
343
344 if (ppmu->flags & PPMU_SIAR_VALID)
345 return mmcra & POWER7P_MMCRA_SIAR_VALID;
346 }
347
348 return 1;
349}
350
351
352
353static void power_pmu_bhrb_reset(void)
354{
355 asm volatile(PPC_CLRBHRB);
356}
357
358static void power_pmu_bhrb_enable(struct perf_event *event)
359{
360 struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
361
362 if (!ppmu->bhrb_nr)
363 return;
364
365
366 if (event->ctx->task && cpuhw->bhrb_context != event->ctx) {
367 power_pmu_bhrb_reset();
368 cpuhw->bhrb_context = event->ctx;
369 }
370 cpuhw->bhrb_users++;
371 perf_sched_cb_inc(event->ctx->pmu);
372}
373
374static void power_pmu_bhrb_disable(struct perf_event *event)
375{
376 struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
377
378 if (!ppmu->bhrb_nr)
379 return;
380
381 WARN_ON_ONCE(!cpuhw->bhrb_users);
382 cpuhw->bhrb_users--;
383 perf_sched_cb_dec(event->ctx->pmu);
384
385 if (!cpuhw->disabled && !cpuhw->bhrb_users) {
386
387
388
389
390
391 cpuhw->bhrb_context = NULL;
392 }
393}
394
395
396
397
398static void power_pmu_sched_task(struct perf_event_context *ctx, bool sched_in)
399{
400 if (!ppmu->bhrb_nr)
401 return;
402
403 if (sched_in)
404 power_pmu_bhrb_reset();
405}
406
407static __u64 power_pmu_bhrb_to(u64 addr)
408{
409 unsigned int instr;
410 int ret;
411 __u64 target;
412
413 if (is_kernel_addr(addr))
414 return branch_target((unsigned int *)addr);
415
416
417 pagefault_disable();
418 ret = __get_user_inatomic(instr, (unsigned int __user *)addr);
419 if (ret) {
420 pagefault_enable();
421 return 0;
422 }
423 pagefault_enable();
424
425 target = branch_target(&instr);
426 if ((!target) || (instr & BRANCH_ABSOLUTE))
427 return target;
428
429
430 return target - (unsigned long)&instr + addr;
431}
432
433
434static void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw)
435{
436 u64 val;
437 u64 addr;
438 int r_index, u_index, pred;
439
440 r_index = 0;
441 u_index = 0;
442 while (r_index < ppmu->bhrb_nr) {
443
444 val = read_bhrb(r_index++);
445 if (!val)
446
447 break;
448 else {
449 addr = val & BHRB_EA;
450 pred = val & BHRB_PREDICTION;
451
452 if (!addr)
453
454 continue;
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474 if (val & BHRB_TARGET) {
475
476
477
478 cpuhw->bhrb_entries[u_index].to = addr;
479 cpuhw->bhrb_entries[u_index].mispred = pred;
480 cpuhw->bhrb_entries[u_index].predicted = ~pred;
481
482
483 val = read_bhrb(r_index++);
484 addr = val & BHRB_EA;
485 if (val & BHRB_TARGET) {
486
487
488 r_index--;
489 addr = 0;
490 }
491 cpuhw->bhrb_entries[u_index].from = addr;
492 } else {
493
494
495 cpuhw->bhrb_entries[u_index].from = addr;
496 cpuhw->bhrb_entries[u_index].to =
497 power_pmu_bhrb_to(addr);
498 cpuhw->bhrb_entries[u_index].mispred = pred;
499 cpuhw->bhrb_entries[u_index].predicted = ~pred;
500 }
501 u_index++;
502
503 }
504 }
505 cpuhw->bhrb_stack.nr = u_index;
506 return;
507}
508
509static bool is_ebb_event(struct perf_event *event)
510{
511
512
513
514
515
516 return (ppmu->flags & PPMU_ARCH_207S) &&
517 ((event->attr.config >> PERF_EVENT_CONFIG_EBB_SHIFT) & 1);
518}
519
520static int ebb_event_check(struct perf_event *event)
521{
522 struct perf_event *leader = event->group_leader;
523
524
525 if (is_ebb_event(leader) != is_ebb_event(event))
526 return -EINVAL;
527
528 if (is_ebb_event(event)) {
529 if (!(event->attach_state & PERF_ATTACH_TASK))
530 return -EINVAL;
531
532 if (!leader->attr.pinned || !leader->attr.exclusive)
533 return -EINVAL;
534
535 if (event->attr.freq ||
536 event->attr.inherit ||
537 event->attr.sample_type ||
538 event->attr.sample_period ||
539 event->attr.enable_on_exec)
540 return -EINVAL;
541 }
542
543 return 0;
544}
545
546static void ebb_event_add(struct perf_event *event)
547{
548 if (!is_ebb_event(event) || current->thread.used_ebb)
549 return;
550
551
552
553
554
555
556
557 current->thread.used_ebb = 1;
558 current->thread.mmcr0 |= MMCR0_PMXE;
559}
560
561static void ebb_switch_out(unsigned long mmcr0)
562{
563 if (!(mmcr0 & MMCR0_EBE))
564 return;
565
566 current->thread.siar = mfspr(SPRN_SIAR);
567 current->thread.sier = mfspr(SPRN_SIER);
568 current->thread.sdar = mfspr(SPRN_SDAR);
569 current->thread.mmcr0 = mmcr0 & MMCR0_USER_MASK;
570 current->thread.mmcr2 = mfspr(SPRN_MMCR2) & MMCR2_USER_MASK;
571}
572
573static unsigned long ebb_switch_in(bool ebb, struct cpu_hw_events *cpuhw)
574{
575 unsigned long mmcr0 = cpuhw->mmcr[0];
576
577 if (!ebb)
578 goto out;
579
580
581 mmcr0 |= MMCR0_EBE | MMCR0_BHRBA | MMCR0_PMCC_U6;
582
583
584
585
586
587
588 mmcr0 |= current->thread.mmcr0;
589
590
591
592
593
594
595 if (!(current->thread.mmcr0 & MMCR0_PMXE))
596 mmcr0 &= ~MMCR0_PMXE;
597
598 mtspr(SPRN_SIAR, current->thread.siar);
599 mtspr(SPRN_SIER, current->thread.sier);
600 mtspr(SPRN_SDAR, current->thread.sdar);
601
602
603
604
605
606
607
608
609 mtspr(SPRN_MMCR2, cpuhw->mmcr[3] | current->thread.mmcr2);
610out:
611 return mmcr0;
612}
613
614static void pmao_restore_workaround(bool ebb)
615{
616 unsigned pmcs[6];
617
618 if (!cpu_has_feature(CPU_FTR_PMAO_BUG))
619 return;
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654 if ((current->thread.mmcr0 & (MMCR0_PMAO | MMCR0_PMAO_SYNC)) != MMCR0_PMAO)
655 return;
656
657
658 if (ebb && !(current->thread.bescr & BESCR_GE))
659 return;
660
661
662
663
664
665 hard_irq_disable();
666
667
668
669
670
671
672 pmcs[0] = mfspr(SPRN_PMC1);
673 pmcs[1] = mfspr(SPRN_PMC2);
674 pmcs[2] = mfspr(SPRN_PMC3);
675 pmcs[3] = mfspr(SPRN_PMC4);
676 pmcs[4] = mfspr(SPRN_PMC5);
677 pmcs[5] = mfspr(SPRN_PMC6);
678
679
680 mtspr(SPRN_MMCR2, 0);
681
682
683 mtspr(SPRN_PMC6, 0x7FFFFFFE);
684
685
686 mtspr(SPRN_MMCR0, MMCR0_PMXE | MMCR0_PMCjCE | MMCR0_PMAO);
687
688
689 mtspr(SPRN_MMCR0, MMCR0_FC | MMCR0_PMAO);
690
691 mtspr(SPRN_PMC1, pmcs[0]);
692 mtspr(SPRN_PMC2, pmcs[1]);
693 mtspr(SPRN_PMC3, pmcs[2]);
694 mtspr(SPRN_PMC4, pmcs[3]);
695 mtspr(SPRN_PMC5, pmcs[4]);
696 mtspr(SPRN_PMC6, pmcs[5]);
697}
698
699static bool use_ic(u64 event)
700{
701 if (cpu_has_feature(CPU_FTR_POWER9_DD1) &&
702 (event == 0x200f2 || event == 0x300f2))
703 return true;
704
705 return false;
706}
707#endif
708
709static void perf_event_interrupt(struct pt_regs *regs);
710
711
712
713
714static unsigned long read_pmc(int idx)
715{
716 unsigned long val;
717
718 switch (idx) {
719 case 1:
720 val = mfspr(SPRN_PMC1);
721 break;
722 case 2:
723 val = mfspr(SPRN_PMC2);
724 break;
725 case 3:
726 val = mfspr(SPRN_PMC3);
727 break;
728 case 4:
729 val = mfspr(SPRN_PMC4);
730 break;
731 case 5:
732 val = mfspr(SPRN_PMC5);
733 break;
734 case 6:
735 val = mfspr(SPRN_PMC6);
736 break;
737#ifdef CONFIG_PPC64
738 case 7:
739 val = mfspr(SPRN_PMC7);
740 break;
741 case 8:
742 val = mfspr(SPRN_PMC8);
743 break;
744#endif
745 default:
746 printk(KERN_ERR "oops trying to read PMC%d\n", idx);
747 val = 0;
748 }
749 return val;
750}
751
752
753
754
755static void write_pmc(int idx, unsigned long val)
756{
757 switch (idx) {
758 case 1:
759 mtspr(SPRN_PMC1, val);
760 break;
761 case 2:
762 mtspr(SPRN_PMC2, val);
763 break;
764 case 3:
765 mtspr(SPRN_PMC3, val);
766 break;
767 case 4:
768 mtspr(SPRN_PMC4, val);
769 break;
770 case 5:
771 mtspr(SPRN_PMC5, val);
772 break;
773 case 6:
774 mtspr(SPRN_PMC6, val);
775 break;
776#ifdef CONFIG_PPC64
777 case 7:
778 mtspr(SPRN_PMC7, val);
779 break;
780 case 8:
781 mtspr(SPRN_PMC8, val);
782 break;
783#endif
784 default:
785 printk(KERN_ERR "oops trying to write PMC%d\n", idx);
786 }
787}
788
789
790void perf_event_print_debug(void)
791{
792 unsigned long sdar, sier, flags;
793 u32 pmcs[MAX_HWEVENTS];
794 int i;
795
796 if (!ppmu) {
797 pr_info("Performance monitor hardware not registered.\n");
798 return;
799 }
800
801 if (!ppmu->n_counter)
802 return;
803
804 local_irq_save(flags);
805
806 pr_info("CPU: %d PMU registers, ppmu = %s n_counters = %d",
807 smp_processor_id(), ppmu->name, ppmu->n_counter);
808
809 for (i = 0; i < ppmu->n_counter; i++)
810 pmcs[i] = read_pmc(i + 1);
811
812 for (; i < MAX_HWEVENTS; i++)
813 pmcs[i] = 0xdeadbeef;
814
815 pr_info("PMC1: %08x PMC2: %08x PMC3: %08x PMC4: %08x\n",
816 pmcs[0], pmcs[1], pmcs[2], pmcs[3]);
817
818 if (ppmu->n_counter > 4)
819 pr_info("PMC5: %08x PMC6: %08x PMC7: %08x PMC8: %08x\n",
820 pmcs[4], pmcs[5], pmcs[6], pmcs[7]);
821
822 pr_info("MMCR0: %016lx MMCR1: %016lx MMCRA: %016lx\n",
823 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCRA));
824
825 sdar = sier = 0;
826#ifdef CONFIG_PPC64
827 sdar = mfspr(SPRN_SDAR);
828
829 if (ppmu->flags & PPMU_HAS_SIER)
830 sier = mfspr(SPRN_SIER);
831
832 if (ppmu->flags & PPMU_ARCH_207S) {
833 pr_info("MMCR2: %016lx EBBHR: %016lx\n",
834 mfspr(SPRN_MMCR2), mfspr(SPRN_EBBHR));
835 pr_info("EBBRR: %016lx BESCR: %016lx\n",
836 mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
837 }
838#endif
839 pr_info("SIAR: %016lx SDAR: %016lx SIER: %016lx\n",
840 mfspr(SPRN_SIAR), sdar, sier);
841
842 local_irq_restore(flags);
843}
844
845
846
847
848
849
850
851static int power_check_constraints(struct cpu_hw_events *cpuhw,
852 u64 event_id[], unsigned int cflags[],
853 int n_ev)
854{
855 unsigned long mask, value, nv;
856 unsigned long smasks[MAX_HWEVENTS], svalues[MAX_HWEVENTS];
857 int n_alt[MAX_HWEVENTS], choice[MAX_HWEVENTS];
858 int i, j;
859 unsigned long addf = ppmu->add_fields;
860 unsigned long tadd = ppmu->test_adder;
861
862 if (n_ev > ppmu->n_counter)
863 return -1;
864
865
866 for (i = 0; i < n_ev; ++i) {
867 if ((cflags[i] & PPMU_LIMITED_PMC_REQD)
868 && !ppmu->limited_pmc_event(event_id[i])) {
869 ppmu->get_alternatives(event_id[i], cflags[i],
870 cpuhw->alternatives[i]);
871 event_id[i] = cpuhw->alternatives[i][0];
872 }
873 if (ppmu->get_constraint(event_id[i], &cpuhw->amasks[i][0],
874 &cpuhw->avalues[i][0]))
875 return -1;
876 }
877 value = mask = 0;
878 for (i = 0; i < n_ev; ++i) {
879 nv = (value | cpuhw->avalues[i][0]) +
880 (value & cpuhw->avalues[i][0] & addf);
881 if ((((nv + tadd) ^ value) & mask) != 0 ||
882 (((nv + tadd) ^ cpuhw->avalues[i][0]) &
883 cpuhw->amasks[i][0]) != 0)
884 break;
885 value = nv;
886 mask |= cpuhw->amasks[i][0];
887 }
888 if (i == n_ev)
889 return 0;
890
891
892 if (!ppmu->get_alternatives)
893 return -1;
894 for (i = 0; i < n_ev; ++i) {
895 choice[i] = 0;
896 n_alt[i] = ppmu->get_alternatives(event_id[i], cflags[i],
897 cpuhw->alternatives[i]);
898 for (j = 1; j < n_alt[i]; ++j)
899 ppmu->get_constraint(cpuhw->alternatives[i][j],
900 &cpuhw->amasks[i][j],
901 &cpuhw->avalues[i][j]);
902 }
903
904
905 i = 0;
906 j = -1;
907 value = mask = nv = 0;
908 while (i < n_ev) {
909 if (j >= 0) {
910
911 value = svalues[i];
912 mask = smasks[i];
913 j = choice[i];
914 }
915
916
917
918
919 while (++j < n_alt[i]) {
920 nv = (value | cpuhw->avalues[i][j]) +
921 (value & cpuhw->avalues[i][j] & addf);
922 if ((((nv + tadd) ^ value) & mask) == 0 &&
923 (((nv + tadd) ^ cpuhw->avalues[i][j])
924 & cpuhw->amasks[i][j]) == 0)
925 break;
926 }
927 if (j >= n_alt[i]) {
928
929
930
931
932
933 if (--i < 0)
934 return -1;
935 } else {
936
937
938
939
940
941
942 choice[i] = j;
943 svalues[i] = value;
944 smasks[i] = mask;
945 value = nv;
946 mask |= cpuhw->amasks[i][j];
947 ++i;
948 j = -1;
949 }
950 }
951
952
953 for (i = 0; i < n_ev; ++i)
954 event_id[i] = cpuhw->alternatives[i][choice[i]];
955 return 0;
956}
957
958
959
960
961
962
963static int check_excludes(struct perf_event **ctrs, unsigned int cflags[],
964 int n_prev, int n_new)
965{
966 int eu = 0, ek = 0, eh = 0;
967 int i, n, first;
968 struct perf_event *event;
969
970
971
972
973
974
975 if (ppmu->flags & PPMU_ARCH_207S)
976 return 0;
977
978 n = n_prev + n_new;
979 if (n <= 1)
980 return 0;
981
982 first = 1;
983 for (i = 0; i < n; ++i) {
984 if (cflags[i] & PPMU_LIMITED_PMC_OK) {
985 cflags[i] &= ~PPMU_LIMITED_PMC_REQD;
986 continue;
987 }
988 event = ctrs[i];
989 if (first) {
990 eu = event->attr.exclude_user;
991 ek = event->attr.exclude_kernel;
992 eh = event->attr.exclude_hv;
993 first = 0;
994 } else if (event->attr.exclude_user != eu ||
995 event->attr.exclude_kernel != ek ||
996 event->attr.exclude_hv != eh) {
997 return -EAGAIN;
998 }
999 }
1000
1001 if (eu || ek || eh)
1002 for (i = 0; i < n; ++i)
1003 if (cflags[i] & PPMU_LIMITED_PMC_OK)
1004 cflags[i] |= PPMU_LIMITED_PMC_REQD;
1005
1006 return 0;
1007}
1008
1009static u64 check_and_compute_delta(u64 prev, u64 val)
1010{
1011 u64 delta = (val - prev) & 0xfffffffful;
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022 if (prev > val && (prev - val) < 256)
1023 delta = 0;
1024
1025 return delta;
1026}
1027
1028static void power_pmu_read(struct perf_event *event)
1029{
1030 s64 val, delta, prev;
1031 struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
1032
1033 if (event->hw.state & PERF_HES_STOPPED)
1034 return;
1035
1036 if (!event->hw.idx)
1037 return;
1038
1039 if (is_ebb_event(event)) {
1040 val = read_pmc(event->hw.idx);
1041 if (use_ic(event->attr.config)) {
1042 val = mfspr(SPRN_IC);
1043 if (val > cpuhw->ic_init)
1044 val = val - cpuhw->ic_init;
1045 else
1046 val = val + (0 - cpuhw->ic_init);
1047 }
1048 local64_set(&event->hw.prev_count, val);
1049 return;
1050 }
1051
1052
1053
1054
1055
1056
1057 do {
1058 prev = local64_read(&event->hw.prev_count);
1059 barrier();
1060 val = read_pmc(event->hw.idx);
1061 if (use_ic(event->attr.config)) {
1062 val = mfspr(SPRN_IC);
1063 if (val > cpuhw->ic_init)
1064 val = val - cpuhw->ic_init;
1065 else
1066 val = val + (0 - cpuhw->ic_init);
1067 }
1068 delta = check_and_compute_delta(prev, val);
1069 if (!delta)
1070 return;
1071 } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev);
1072
1073 local64_add(delta, &event->count);
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084 do {
1085 prev = local64_read(&event->hw.period_left);
1086 val = prev - delta;
1087 if (val < 1)
1088 val = 1;
1089 } while (local64_cmpxchg(&event->hw.period_left, prev, val) != prev);
1090}
1091
1092
1093
1094
1095
1096
1097static int is_limited_pmc(int pmcnum)
1098{
1099 return (ppmu->flags & PPMU_LIMITED_PMC5_6)
1100 && (pmcnum == 5 || pmcnum == 6);
1101}
1102
1103static void freeze_limited_counters(struct cpu_hw_events *cpuhw,
1104 unsigned long pmc5, unsigned long pmc6)
1105{
1106 struct perf_event *event;
1107 u64 val, prev, delta;
1108 int i;
1109
1110 for (i = 0; i < cpuhw->n_limited; ++i) {
1111 event = cpuhw->limited_counter[i];
1112 if (!event->hw.idx)
1113 continue;
1114 val = (event->hw.idx == 5) ? pmc5 : pmc6;
1115 prev = local64_read(&event->hw.prev_count);
1116 event->hw.idx = 0;
1117 delta = check_and_compute_delta(prev, val);
1118 if (delta)
1119 local64_add(delta, &event->count);
1120 }
1121}
1122
1123static void thaw_limited_counters(struct cpu_hw_events *cpuhw,
1124 unsigned long pmc5, unsigned long pmc6)
1125{
1126 struct perf_event *event;
1127 u64 val, prev;
1128 int i;
1129
1130 for (i = 0; i < cpuhw->n_limited; ++i) {
1131 event = cpuhw->limited_counter[i];
1132 event->hw.idx = cpuhw->limited_hwidx[i];
1133 val = (event->hw.idx == 5) ? pmc5 : pmc6;
1134 prev = local64_read(&event->hw.prev_count);
1135 if (check_and_compute_delta(prev, val))
1136 local64_set(&event->hw.prev_count, val);
1137 perf_event_update_userpage(event);
1138 }
1139}
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152static void write_mmcr0(struct cpu_hw_events *cpuhw, unsigned long mmcr0)
1153{
1154 unsigned long pmc5, pmc6;
1155
1156 if (!cpuhw->n_limited) {
1157 mtspr(SPRN_MMCR0, mmcr0);
1158 return;
1159 }
1160
1161
1162
1163
1164
1165
1166
1167
1168 asm volatile("mtspr %3,%2; mfspr %0,%4; mfspr %1,%5"
1169 : "=&r" (pmc5), "=&r" (pmc6)
1170 : "r" (mmcr0 & ~(MMCR0_PMC1CE | MMCR0_PMCjCE)),
1171 "i" (SPRN_MMCR0),
1172 "i" (SPRN_PMC5), "i" (SPRN_PMC6));
1173
1174 if (mmcr0 & MMCR0_FC)
1175 freeze_limited_counters(cpuhw, pmc5, pmc6);
1176 else
1177 thaw_limited_counters(cpuhw, pmc5, pmc6);
1178
1179
1180
1181
1182
1183 if (mmcr0 & (MMCR0_PMC1CE | MMCR0_PMCjCE))
1184 mtspr(SPRN_MMCR0, mmcr0);
1185}
1186
1187
1188
1189
1190
1191static void power_pmu_disable(struct pmu *pmu)
1192{
1193 struct cpu_hw_events *cpuhw;
1194 unsigned long flags, mmcr0, val;
1195
1196 if (!ppmu)
1197 return;
1198 local_irq_save(flags);
1199 cpuhw = this_cpu_ptr(&cpu_hw_events);
1200
1201 if (!cpuhw->disabled) {
1202
1203
1204
1205 if (!cpuhw->pmcs_enabled) {
1206 ppc_enable_pmcs();
1207 cpuhw->pmcs_enabled = 1;
1208 }
1209
1210
1211
1212
1213 val = mmcr0 = mfspr(SPRN_MMCR0);
1214 val |= MMCR0_FC;
1215 val &= ~(MMCR0_EBE | MMCR0_BHRBA | MMCR0_PMCC | MMCR0_PMAO |
1216 MMCR0_FC56);
1217
1218
1219
1220
1221
1222
1223 write_mmcr0(cpuhw, val);
1224 mb();
1225
1226
1227
1228
1229 if (cpuhw->mmcr[2] & MMCRA_SAMPLE_ENABLE) {
1230 mtspr(SPRN_MMCRA,
1231 cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE);
1232 mb();
1233 }
1234
1235 cpuhw->disabled = 1;
1236 cpuhw->n_added = 0;
1237
1238 ebb_switch_out(mmcr0);
1239 }
1240
1241 local_irq_restore(flags);
1242}
1243
1244
1245
1246
1247
1248
1249static void power_pmu_enable(struct pmu *pmu)
1250{
1251 struct perf_event *event;
1252 struct cpu_hw_events *cpuhw;
1253 unsigned long flags;
1254 long i;
1255 unsigned long val, mmcr0;
1256 s64 left;
1257 unsigned int hwc_index[MAX_HWEVENTS];
1258 int n_lim;
1259 int idx;
1260 bool ebb;
1261
1262 if (!ppmu)
1263 return;
1264 local_irq_save(flags);
1265
1266 cpuhw = this_cpu_ptr(&cpu_hw_events);
1267 if (!cpuhw->disabled)
1268 goto out;
1269
1270 if (cpuhw->n_events == 0) {
1271 ppc_set_pmu_inuse(0);
1272 goto out;
1273 }
1274
1275 cpuhw->disabled = 0;
1276
1277
1278
1279
1280
1281
1282 ebb = is_ebb_event(cpuhw->event[0]);
1283
1284
1285
1286
1287
1288
1289
1290 if (!cpuhw->n_added) {
1291 mtspr(SPRN_MMCRA, cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE);
1292 mtspr(SPRN_MMCR1, cpuhw->mmcr[1]);
1293 goto out_enable;
1294 }
1295
1296
1297
1298
1299 memset(cpuhw->mmcr, 0, sizeof(cpuhw->mmcr));
1300
1301 if (ppmu->compute_mmcr(cpuhw->events, cpuhw->n_events, hwc_index,
1302 cpuhw->mmcr, cpuhw->event)) {
1303
1304 printk(KERN_ERR "oops compute_mmcr failed\n");
1305 goto out;
1306 }
1307
1308 if (!(ppmu->flags & PPMU_ARCH_207S)) {
1309
1310
1311
1312
1313
1314 event = cpuhw->event[0];
1315 if (event->attr.exclude_user)
1316 cpuhw->mmcr[0] |= MMCR0_FCP;
1317 if (event->attr.exclude_kernel)
1318 cpuhw->mmcr[0] |= freeze_events_kernel;
1319 if (event->attr.exclude_hv)
1320 cpuhw->mmcr[0] |= MMCR0_FCHV;
1321 }
1322
1323
1324
1325
1326
1327
1328 ppc_set_pmu_inuse(1);
1329 mtspr(SPRN_MMCRA, cpuhw->mmcr[2] & ~MMCRA_SAMPLE_ENABLE);
1330 mtspr(SPRN_MMCR1, cpuhw->mmcr[1]);
1331 mtspr(SPRN_MMCR0, (cpuhw->mmcr[0] & ~(MMCR0_PMC1CE | MMCR0_PMCjCE))
1332 | MMCR0_FC);
1333 if (ppmu->flags & PPMU_ARCH_207S)
1334 mtspr(SPRN_MMCR2, cpuhw->mmcr[3]);
1335
1336
1337
1338
1339
1340 for (i = 0; i < cpuhw->n_events; ++i) {
1341 event = cpuhw->event[i];
1342 if (event->hw.idx && event->hw.idx != hwc_index[i] + 1) {
1343 power_pmu_read(event);
1344 write_pmc(event->hw.idx, 0);
1345 event->hw.idx = 0;
1346 }
1347 }
1348
1349
1350
1351
1352 cpuhw->n_limited = n_lim = 0;
1353 for (i = 0; i < cpuhw->n_events; ++i) {
1354 event = cpuhw->event[i];
1355 if (event->hw.idx)
1356 continue;
1357 idx = hwc_index[i] + 1;
1358 if (is_limited_pmc(idx)) {
1359 cpuhw->limited_counter[n_lim] = event;
1360 cpuhw->limited_hwidx[n_lim] = idx;
1361 ++n_lim;
1362 continue;
1363 }
1364
1365 if (ebb)
1366 val = local64_read(&event->hw.prev_count);
1367 else {
1368 val = 0;
1369 if (event->hw.sample_period) {
1370 left = local64_read(&event->hw.period_left);
1371 if (left < 0x80000000L)
1372 val = 0x80000000L - left;
1373 }
1374 local64_set(&event->hw.prev_count, val);
1375 }
1376
1377 event->hw.idx = idx;
1378 if (event->hw.state & PERF_HES_STOPPED)
1379 val = 0;
1380 write_pmc(idx, val);
1381
1382 perf_event_update_userpage(event);
1383 }
1384 cpuhw->n_limited = n_lim;
1385 cpuhw->mmcr[0] |= MMCR0_PMXE | MMCR0_FCECE;
1386
1387 out_enable:
1388 pmao_restore_workaround(ebb);
1389
1390 mmcr0 = ebb_switch_in(ebb, cpuhw);
1391
1392 mb();
1393 if (cpuhw->bhrb_users)
1394 ppmu->config_bhrb(cpuhw->bhrb_filter);
1395
1396 write_mmcr0(cpuhw, mmcr0);
1397
1398
1399
1400
1401 if (cpuhw->mmcr[2] & MMCRA_SAMPLE_ENABLE) {
1402 mb();
1403 mtspr(SPRN_MMCRA, cpuhw->mmcr[2]);
1404 }
1405
1406 out:
1407
1408 local_irq_restore(flags);
1409}
1410
1411static int collect_events(struct perf_event *group, int max_count,
1412 struct perf_event *ctrs[], u64 *events,
1413 unsigned int *flags)
1414{
1415 int n = 0;
1416 struct perf_event *event;
1417
1418 if (!is_software_event(group)) {
1419 if (n >= max_count)
1420 return -1;
1421 ctrs[n] = group;
1422 flags[n] = group->hw.event_base;
1423 events[n++] = group->hw.config;
1424 }
1425 list_for_each_entry(event, &group->sibling_list, group_entry) {
1426 if (!is_software_event(event) &&
1427 event->state != PERF_EVENT_STATE_OFF) {
1428 if (n >= max_count)
1429 return -1;
1430 ctrs[n] = event;
1431 flags[n] = event->hw.event_base;
1432 events[n++] = event->hw.config;
1433 }
1434 }
1435 return n;
1436}
1437
1438
1439
1440
1441
1442
1443
1444static int power_pmu_add(struct perf_event *event, int ef_flags)
1445{
1446 struct cpu_hw_events *cpuhw;
1447 unsigned long flags;
1448 int n0;
1449 int ret = -EAGAIN;
1450
1451 local_irq_save(flags);
1452 perf_pmu_disable(event->pmu);
1453
1454
1455
1456
1457
1458 cpuhw = this_cpu_ptr(&cpu_hw_events);
1459 n0 = cpuhw->n_events;
1460 if (n0 >= ppmu->n_counter)
1461 goto out;
1462 cpuhw->event[n0] = event;
1463 cpuhw->events[n0] = event->hw.config;
1464 cpuhw->flags[n0] = event->hw.event_base;
1465
1466
1467
1468
1469
1470
1471
1472 if (!(ef_flags & PERF_EF_START))
1473 event->hw.state = PERF_HES_STOPPED | PERF_HES_UPTODATE;
1474 else
1475 event->hw.state = 0;
1476
1477
1478
1479
1480
1481
1482 if (cpuhw->txn_flags & PERF_PMU_TXN_ADD)
1483 goto nocheck;
1484
1485 if (check_excludes(cpuhw->event, cpuhw->flags, n0, 1))
1486 goto out;
1487 if (power_check_constraints(cpuhw, cpuhw->events, cpuhw->flags, n0 + 1))
1488 goto out;
1489 event->hw.config = cpuhw->events[n0];
1490
1491nocheck:
1492 ebb_event_add(event);
1493
1494 ++cpuhw->n_events;
1495 ++cpuhw->n_added;
1496
1497 ret = 0;
1498 out:
1499 if (has_branch_stack(event)) {
1500 power_pmu_bhrb_enable(event);
1501 cpuhw->bhrb_filter = ppmu->bhrb_filter_map(
1502 event->attr.branch_sample_type);
1503 }
1504
1505
1506
1507
1508
1509 if (use_ic(event->attr.config))
1510 cpuhw->ic_init = mfspr(SPRN_IC);
1511
1512 perf_pmu_enable(event->pmu);
1513 local_irq_restore(flags);
1514 return ret;
1515}
1516
1517
1518
1519
1520static void power_pmu_del(struct perf_event *event, int ef_flags)
1521{
1522 struct cpu_hw_events *cpuhw;
1523 long i;
1524 unsigned long flags;
1525
1526 local_irq_save(flags);
1527 perf_pmu_disable(event->pmu);
1528
1529 power_pmu_read(event);
1530
1531 cpuhw = this_cpu_ptr(&cpu_hw_events);
1532 for (i = 0; i < cpuhw->n_events; ++i) {
1533 if (event == cpuhw->event[i]) {
1534 while (++i < cpuhw->n_events) {
1535 cpuhw->event[i-1] = cpuhw->event[i];
1536 cpuhw->events[i-1] = cpuhw->events[i];
1537 cpuhw->flags[i-1] = cpuhw->flags[i];
1538 }
1539 --cpuhw->n_events;
1540 ppmu->disable_pmc(event->hw.idx - 1, cpuhw->mmcr);
1541 if (event->hw.idx) {
1542 write_pmc(event->hw.idx, 0);
1543 event->hw.idx = 0;
1544 }
1545 perf_event_update_userpage(event);
1546 break;
1547 }
1548 }
1549 for (i = 0; i < cpuhw->n_limited; ++i)
1550 if (event == cpuhw->limited_counter[i])
1551 break;
1552 if (i < cpuhw->n_limited) {
1553 while (++i < cpuhw->n_limited) {
1554 cpuhw->limited_counter[i-1] = cpuhw->limited_counter[i];
1555 cpuhw->limited_hwidx[i-1] = cpuhw->limited_hwidx[i];
1556 }
1557 --cpuhw->n_limited;
1558 }
1559 if (cpuhw->n_events == 0) {
1560
1561 cpuhw->mmcr[0] &= ~(MMCR0_PMXE | MMCR0_FCECE);
1562 }
1563
1564 if (has_branch_stack(event))
1565 power_pmu_bhrb_disable(event);
1566
1567 perf_pmu_enable(event->pmu);
1568 local_irq_restore(flags);
1569}
1570
1571
1572
1573
1574
1575
1576static void power_pmu_start(struct perf_event *event, int ef_flags)
1577{
1578 unsigned long flags;
1579 s64 left;
1580 unsigned long val;
1581
1582 if (!event->hw.idx || !event->hw.sample_period)
1583 return;
1584
1585 if (!(event->hw.state & PERF_HES_STOPPED))
1586 return;
1587
1588 if (ef_flags & PERF_EF_RELOAD)
1589 WARN_ON_ONCE(!(event->hw.state & PERF_HES_UPTODATE));
1590
1591 local_irq_save(flags);
1592 perf_pmu_disable(event->pmu);
1593
1594 event->hw.state = 0;
1595 left = local64_read(&event->hw.period_left);
1596
1597 val = 0;
1598 if (left < 0x80000000L)
1599 val = 0x80000000L - left;
1600
1601 write_pmc(event->hw.idx, val);
1602
1603 perf_event_update_userpage(event);
1604 perf_pmu_enable(event->pmu);
1605 local_irq_restore(flags);
1606}
1607
1608static void power_pmu_stop(struct perf_event *event, int ef_flags)
1609{
1610 unsigned long flags;
1611
1612 if (!event->hw.idx || !event->hw.sample_period)
1613 return;
1614
1615 if (event->hw.state & PERF_HES_STOPPED)
1616 return;
1617
1618 local_irq_save(flags);
1619 perf_pmu_disable(event->pmu);
1620
1621 power_pmu_read(event);
1622 event->hw.state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
1623 write_pmc(event->hw.idx, 0);
1624
1625 perf_event_update_userpage(event);
1626 perf_pmu_enable(event->pmu);
1627 local_irq_restore(flags);
1628}
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639static void power_pmu_start_txn(struct pmu *pmu, unsigned int txn_flags)
1640{
1641 struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
1642
1643 WARN_ON_ONCE(cpuhw->txn_flags);
1644
1645 cpuhw->txn_flags = txn_flags;
1646 if (txn_flags & ~PERF_PMU_TXN_ADD)
1647 return;
1648
1649 perf_pmu_disable(pmu);
1650 cpuhw->n_txn_start = cpuhw->n_events;
1651}
1652
1653
1654
1655
1656
1657
1658static void power_pmu_cancel_txn(struct pmu *pmu)
1659{
1660 struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
1661 unsigned int txn_flags;
1662
1663 WARN_ON_ONCE(!cpuhw->txn_flags);
1664
1665 txn_flags = cpuhw->txn_flags;
1666 cpuhw->txn_flags = 0;
1667 if (txn_flags & ~PERF_PMU_TXN_ADD)
1668 return;
1669
1670 perf_pmu_enable(pmu);
1671}
1672
1673
1674
1675
1676
1677
1678static int power_pmu_commit_txn(struct pmu *pmu)
1679{
1680 struct cpu_hw_events *cpuhw;
1681 long i, n;
1682
1683 if (!ppmu)
1684 return -EAGAIN;
1685
1686 cpuhw = this_cpu_ptr(&cpu_hw_events);
1687 WARN_ON_ONCE(!cpuhw->txn_flags);
1688
1689 if (cpuhw->txn_flags & ~PERF_PMU_TXN_ADD) {
1690 cpuhw->txn_flags = 0;
1691 return 0;
1692 }
1693
1694 n = cpuhw->n_events;
1695 if (check_excludes(cpuhw->event, cpuhw->flags, 0, n))
1696 return -EAGAIN;
1697 i = power_check_constraints(cpuhw, cpuhw->events, cpuhw->flags, n);
1698 if (i < 0)
1699 return -EAGAIN;
1700
1701 for (i = cpuhw->n_txn_start; i < n; ++i)
1702 cpuhw->event[i]->hw.config = cpuhw->events[i];
1703
1704 cpuhw->txn_flags = 0;
1705 perf_pmu_enable(pmu);
1706 return 0;
1707}
1708
1709
1710
1711
1712
1713
1714
1715
1716static int can_go_on_limited_pmc(struct perf_event *event, u64 ev,
1717 unsigned int flags)
1718{
1719 int n;
1720 u64 alt[MAX_EVENT_ALTERNATIVES];
1721
1722 if (event->attr.exclude_user
1723 || event->attr.exclude_kernel
1724 || event->attr.exclude_hv
1725 || event->attr.sample_period)
1726 return 0;
1727
1728 if (ppmu->limited_pmc_event(ev))
1729 return 1;
1730
1731
1732
1733
1734
1735 if (!ppmu->get_alternatives)
1736 return 0;
1737
1738 flags |= PPMU_LIMITED_PMC_OK | PPMU_LIMITED_PMC_REQD;
1739 n = ppmu->get_alternatives(ev, flags, alt);
1740
1741 return n > 0;
1742}
1743
1744
1745
1746
1747
1748
1749static u64 normal_pmc_alternative(u64 ev, unsigned long flags)
1750{
1751 u64 alt[MAX_EVENT_ALTERNATIVES];
1752 int n;
1753
1754 flags &= ~(PPMU_LIMITED_PMC_OK | PPMU_LIMITED_PMC_REQD);
1755 n = ppmu->get_alternatives(ev, flags, alt);
1756 if (!n)
1757 return 0;
1758 return alt[0];
1759}
1760
1761
1762static atomic_t num_events;
1763
1764static DEFINE_MUTEX(pmc_reserve_mutex);
1765
1766
1767
1768
1769static void hw_perf_event_destroy(struct perf_event *event)
1770{
1771 if (!atomic_add_unless(&num_events, -1, 1)) {
1772 mutex_lock(&pmc_reserve_mutex);
1773 if (atomic_dec_return(&num_events) == 0)
1774 release_pmc_hardware();
1775 mutex_unlock(&pmc_reserve_mutex);
1776 }
1777}
1778
1779
1780
1781
1782static int hw_perf_cache_event(u64 config, u64 *eventp)
1783{
1784 unsigned long type, op, result;
1785 int ev;
1786
1787 if (!ppmu->cache_events)
1788 return -EINVAL;
1789
1790
1791 type = config & 0xff;
1792 op = (config >> 8) & 0xff;
1793 result = (config >> 16) & 0xff;
1794
1795 if (type >= PERF_COUNT_HW_CACHE_MAX ||
1796 op >= PERF_COUNT_HW_CACHE_OP_MAX ||
1797 result >= PERF_COUNT_HW_CACHE_RESULT_MAX)
1798 return -EINVAL;
1799
1800 ev = (*ppmu->cache_events)[type][op][result];
1801 if (ev == 0)
1802 return -EOPNOTSUPP;
1803 if (ev == -1)
1804 return -EINVAL;
1805 *eventp = ev;
1806 return 0;
1807}
1808
1809static int power_pmu_event_init(struct perf_event *event)
1810{
1811 u64 ev;
1812 unsigned long flags;
1813 struct perf_event *ctrs[MAX_HWEVENTS];
1814 u64 events[MAX_HWEVENTS];
1815 unsigned int cflags[MAX_HWEVENTS];
1816 int n;
1817 int err;
1818 struct cpu_hw_events *cpuhw;
1819
1820 if (!ppmu)
1821 return -ENOENT;
1822
1823 if (has_branch_stack(event)) {
1824
1825 if (!(ppmu->flags & PPMU_ARCH_207S))
1826 return -EOPNOTSUPP;
1827 }
1828
1829 switch (event->attr.type) {
1830 case PERF_TYPE_HARDWARE:
1831 ev = event->attr.config;
1832 if (ev >= ppmu->n_generic || ppmu->generic_events[ev] == 0)
1833 return -EOPNOTSUPP;
1834 ev = ppmu->generic_events[ev];
1835 break;
1836 case PERF_TYPE_HW_CACHE:
1837 err = hw_perf_cache_event(event->attr.config, &ev);
1838 if (err)
1839 return err;
1840 break;
1841 case PERF_TYPE_RAW:
1842 ev = event->attr.config;
1843 break;
1844 default:
1845 return -ENOENT;
1846 }
1847
1848 event->hw.config_base = ev;
1849 event->hw.idx = 0;
1850
1851
1852
1853
1854
1855
1856 if (!firmware_has_feature(FW_FEATURE_LPAR))
1857 event->attr.exclude_hv = 0;
1858
1859
1860
1861
1862
1863
1864
1865 flags = 0;
1866 if (event->attach_state & PERF_ATTACH_TASK)
1867 flags |= PPMU_ONLY_COUNT_RUN;
1868
1869
1870
1871
1872
1873 if (ppmu->flags & PPMU_LIMITED_PMC5_6) {
1874 if (can_go_on_limited_pmc(event, ev, flags)) {
1875 flags |= PPMU_LIMITED_PMC_OK;
1876 } else if (ppmu->limited_pmc_event(ev)) {
1877
1878
1879
1880
1881
1882 ev = normal_pmc_alternative(ev, flags);
1883 if (!ev)
1884 return -EINVAL;
1885 }
1886 }
1887
1888
1889 err = ebb_event_check(event);
1890 if (err)
1891 return err;
1892
1893
1894
1895
1896
1897
1898 n = 0;
1899 if (event->group_leader != event) {
1900 n = collect_events(event->group_leader, ppmu->n_counter - 1,
1901 ctrs, events, cflags);
1902 if (n < 0)
1903 return -EINVAL;
1904 }
1905 events[n] = ev;
1906 ctrs[n] = event;
1907 cflags[n] = flags;
1908 if (check_excludes(ctrs, cflags, n, 1))
1909 return -EINVAL;
1910
1911 cpuhw = &get_cpu_var(cpu_hw_events);
1912 err = power_check_constraints(cpuhw, events, cflags, n + 1);
1913
1914 if (has_branch_stack(event)) {
1915 cpuhw->bhrb_filter = ppmu->bhrb_filter_map(
1916 event->attr.branch_sample_type);
1917
1918 if (cpuhw->bhrb_filter == -1) {
1919 put_cpu_var(cpu_hw_events);
1920 return -EOPNOTSUPP;
1921 }
1922 }
1923
1924 put_cpu_var(cpu_hw_events);
1925 if (err)
1926 return -EINVAL;
1927
1928 event->hw.config = events[n];
1929 event->hw.event_base = cflags[n];
1930 event->hw.last_period = event->hw.sample_period;
1931 local64_set(&event->hw.period_left, event->hw.last_period);
1932
1933
1934
1935
1936
1937 if (is_ebb_event(event))
1938 local64_set(&event->hw.prev_count, 0);
1939
1940
1941
1942
1943
1944
1945
1946 err = 0;
1947 if (!atomic_inc_not_zero(&num_events)) {
1948 mutex_lock(&pmc_reserve_mutex);
1949 if (atomic_read(&num_events) == 0 &&
1950 reserve_pmc_hardware(perf_event_interrupt))
1951 err = -EBUSY;
1952 else
1953 atomic_inc(&num_events);
1954 mutex_unlock(&pmc_reserve_mutex);
1955 }
1956 event->destroy = hw_perf_event_destroy;
1957
1958 return err;
1959}
1960
1961static int power_pmu_event_idx(struct perf_event *event)
1962{
1963 return event->hw.idx;
1964}
1965
1966ssize_t power_events_sysfs_show(struct device *dev,
1967 struct device_attribute *attr, char *page)
1968{
1969 struct perf_pmu_events_attr *pmu_attr;
1970
1971 pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr);
1972
1973 return sprintf(page, "event=0x%02llx\n", pmu_attr->id);
1974}
1975
1976static struct pmu power_pmu = {
1977 .pmu_enable = power_pmu_enable,
1978 .pmu_disable = power_pmu_disable,
1979 .event_init = power_pmu_event_init,
1980 .add = power_pmu_add,
1981 .del = power_pmu_del,
1982 .start = power_pmu_start,
1983 .stop = power_pmu_stop,
1984 .read = power_pmu_read,
1985 .start_txn = power_pmu_start_txn,
1986 .cancel_txn = power_pmu_cancel_txn,
1987 .commit_txn = power_pmu_commit_txn,
1988 .event_idx = power_pmu_event_idx,
1989 .sched_task = power_pmu_sched_task,
1990};
1991
1992
1993
1994
1995
1996
1997static void record_and_restart(struct perf_event *event, unsigned long val,
1998 struct pt_regs *regs)
1999{
2000 u64 period = event->hw.sample_period;
2001 s64 prev, delta, left;
2002 int record = 0;
2003
2004 if (event->hw.state & PERF_HES_STOPPED) {
2005 write_pmc(event->hw.idx, 0);
2006 return;
2007 }
2008
2009
2010 prev = local64_read(&event->hw.prev_count);
2011 delta = check_and_compute_delta(prev, val);
2012 local64_add(delta, &event->count);
2013
2014
2015
2016
2017
2018 val = 0;
2019 left = local64_read(&event->hw.period_left) - delta;
2020 if (delta == 0)
2021 left++;
2022 if (period) {
2023 if (left <= 0) {
2024 left += period;
2025 if (left <= 0)
2026 left = period;
2027 record = siar_valid(regs);
2028 event->hw.last_period = event->hw.sample_period;
2029 }
2030 if (left < 0x80000000LL)
2031 val = 0x80000000LL - left;
2032 }
2033
2034 write_pmc(event->hw.idx, val);
2035 local64_set(&event->hw.prev_count, val);
2036 local64_set(&event->hw.period_left, left);
2037 perf_event_update_userpage(event);
2038
2039
2040
2041
2042 if (record) {
2043 struct perf_sample_data data;
2044
2045 perf_sample_data_init(&data, ~0ULL, event->hw.last_period);
2046
2047 if (event->attr.sample_type &
2048 (PERF_SAMPLE_ADDR | PERF_SAMPLE_PHYS_ADDR))
2049 perf_get_data_addr(regs, &data.addr);
2050
2051 if (event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK) {
2052 struct cpu_hw_events *cpuhw;
2053 cpuhw = this_cpu_ptr(&cpu_hw_events);
2054 power_pmu_bhrb_read(cpuhw);
2055 data.br_stack = &cpuhw->bhrb_stack;
2056 }
2057
2058 if (event->attr.sample_type & PERF_SAMPLE_DATA_SRC &&
2059 ppmu->get_mem_data_src)
2060 ppmu->get_mem_data_src(&data.data_src, ppmu->flags, regs);
2061
2062 if (event->attr.sample_type & PERF_SAMPLE_WEIGHT &&
2063 ppmu->get_mem_weight)
2064 ppmu->get_mem_weight(&data.weight);
2065
2066 if (perf_event_overflow(event, &data, regs))
2067 power_pmu_stop(event, 0);
2068 }
2069}
2070
2071
2072
2073
2074
2075unsigned long perf_misc_flags(struct pt_regs *regs)
2076{
2077 u32 flags = perf_get_misc_flags(regs);
2078
2079 if (flags)
2080 return flags;
2081 return user_mode(regs) ? PERF_RECORD_MISC_USER :
2082 PERF_RECORD_MISC_KERNEL;
2083}
2084
2085
2086
2087
2088
2089unsigned long perf_instruction_pointer(struct pt_regs *regs)
2090{
2091 bool use_siar = regs_use_siar(regs);
2092
2093 if (use_siar && siar_valid(regs))
2094 return mfspr(SPRN_SIAR) + perf_ip_adjust(regs);
2095 else if (use_siar)
2096 return 0;
2097 else
2098 return regs->nip;
2099}
2100
2101static bool pmc_overflow_power7(unsigned long val)
2102{
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114 if ((0x80000000 - val) <= 256)
2115 return true;
2116
2117 return false;
2118}
2119
2120static bool pmc_overflow(unsigned long val)
2121{
2122 if ((int)val < 0)
2123 return true;
2124
2125 return false;
2126}
2127
2128
2129
2130
2131static void perf_event_interrupt(struct pt_regs *regs)
2132{
2133 int i, j;
2134 struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
2135 struct perf_event *event;
2136 unsigned long val[8];
2137 int found, active;
2138 int nmi;
2139
2140 if (cpuhw->n_limited)
2141 freeze_limited_counters(cpuhw, mfspr(SPRN_PMC5),
2142 mfspr(SPRN_PMC6));
2143
2144 perf_read_regs(regs);
2145
2146 nmi = perf_intr_is_nmi(regs);
2147 if (nmi)
2148 nmi_enter();
2149 else
2150 irq_enter();
2151
2152
2153 for (i = 0; i < ppmu->n_counter; ++i)
2154 val[i] = read_pmc(i + 1);
2155
2156
2157 found = 0;
2158 for (i = 0; i < ppmu->n_counter; ++i) {
2159 if (!pmc_overflow(val[i]))
2160 continue;
2161 if (is_limited_pmc(i + 1))
2162 continue;
2163
2164
2165
2166
2167
2168 found = 1;
2169 active = 0;
2170 for (j = 0; j < cpuhw->n_events; ++j) {
2171 event = cpuhw->event[j];
2172 if (event->hw.idx == (i + 1)) {
2173 active = 1;
2174 record_and_restart(event, val[i], regs);
2175 break;
2176 }
2177 }
2178 if (!active)
2179
2180 write_pmc(i + 1, 0);
2181 }
2182 if (!found && pvr_version_is(PVR_POWER7)) {
2183
2184 for (i = 0; i < cpuhw->n_events; ++i) {
2185 event = cpuhw->event[i];
2186 if (!event->hw.idx || is_limited_pmc(event->hw.idx))
2187 continue;
2188 if (pmc_overflow_power7(val[event->hw.idx - 1])) {
2189
2190 found = 1;
2191 record_and_restart(event,
2192 val[event->hw.idx - 1],
2193 regs);
2194 }
2195 }
2196 }
2197 if (!found && !nmi && printk_ratelimit())
2198 printk(KERN_WARNING "Can't find PMC that caused IRQ\n");
2199
2200
2201
2202
2203
2204
2205
2206
2207 write_mmcr0(cpuhw, cpuhw->mmcr[0]);
2208
2209 if (nmi)
2210 nmi_exit();
2211 else
2212 irq_exit();
2213}
2214
2215static int power_pmu_prepare_cpu(unsigned int cpu)
2216{
2217 struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu);
2218
2219 if (ppmu) {
2220 memset(cpuhw, 0, sizeof(*cpuhw));
2221 cpuhw->mmcr[0] = MMCR0_FC;
2222 }
2223 return 0;
2224}
2225
2226int register_power_pmu(struct power_pmu *pmu)
2227{
2228 if (ppmu)
2229 return -EBUSY;
2230
2231 ppmu = pmu;
2232 pr_info("%s performance monitor hardware support registered\n",
2233 pmu->name);
2234
2235 power_pmu.attr_groups = ppmu->attr_groups;
2236
2237#ifdef MSR_HV
2238
2239
2240
2241 if (mfmsr() & MSR_HV)
2242 freeze_events_kernel = MMCR0_FCHV;
2243#endif
2244
2245 perf_pmu_register(&power_pmu, "cpu", PERF_TYPE_RAW);
2246 cpuhp_setup_state(CPUHP_PERF_POWER, "perf/powerpc:prepare",
2247 power_pmu_prepare_cpu, NULL);
2248 return 0;
2249}
2250