aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/perf_event_fsl_emb.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/perf_event_fsl_emb.c')
-rw-r--r--arch/powerpc/kernel/perf_event_fsl_emb.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/arch/powerpc/kernel/perf_event_fsl_emb.c b/arch/powerpc/kernel/perf_event_fsl_emb.c
index d7619b5e7a6e..ea6a804e43fd 100644
--- a/arch/powerpc/kernel/perf_event_fsl_emb.c
+++ b/arch/powerpc/kernel/perf_event_fsl_emb.c
@@ -378,13 +378,6 @@ static void fsl_emb_pmu_unthrottle(struct perf_event *event)
378 local_irq_restore(flags); 378 local_irq_restore(flags);
379} 379}
380 380
381static struct pmu fsl_emb_pmu = {
382 .enable = fsl_emb_pmu_enable,
383 .disable = fsl_emb_pmu_disable,
384 .read = fsl_emb_pmu_read,
385 .unthrottle = fsl_emb_pmu_unthrottle,
386};
387
388/* 381/*
389 * Release the PMU if this is the last perf_event. 382 * Release the PMU if this is the last perf_event.
390 */ 383 */
@@ -428,7 +421,7 @@ static int hw_perf_cache_event(u64 config, u64 *eventp)
428 return 0; 421 return 0;
429} 422}
430 423
431struct pmu *hw_perf_event_init(struct perf_event *event) 424static int fsl_emb_pmu_event_init(struct perf_event *event)
432{ 425{
433 u64 ev; 426 u64 ev;
434 struct perf_event *events[MAX_HWEVENTS]; 427 struct perf_event *events[MAX_HWEVENTS];
@@ -441,14 +434,14 @@ struct pmu *hw_perf_event_init(struct perf_event *event)
441 case PERF_TYPE_HARDWARE: 434 case PERF_TYPE_HARDWARE:
442 ev = event->attr.config; 435 ev = event->attr.config;
443 if (ev >= ppmu->n_generic || ppmu->generic_events[ev] == 0) 436 if (ev >= ppmu->n_generic || ppmu->generic_events[ev] == 0)
444 return ERR_PTR(-EOPNOTSUPP); 437 return -EOPNOTSUPP;
445 ev = ppmu->generic_events[ev]; 438 ev = ppmu->generic_events[ev];
446 break; 439 break;
447 440
448 case PERF_TYPE_HW_CACHE: 441 case PERF_TYPE_HW_CACHE:
449 err = hw_perf_cache_event(event->attr.config, &ev); 442 err = hw_perf_cache_event(event->attr.config, &ev);
450 if (err) 443 if (err)
451 return ERR_PTR(err); 444 return err;
452 break; 445 break;
453 446
454 case PERF_TYPE_RAW: 447 case PERF_TYPE_RAW:
@@ -456,12 +449,12 @@ struct pmu *hw_perf_event_init(struct perf_event *event)
456 break; 449 break;
457 450
458 default: 451 default:
459 return ERR_PTR(-EINVAL); 452 return -ENOENT;
460 } 453 }
461 454
462 event->hw.config = ppmu->xlate_event(ev); 455 event->hw.config = ppmu->xlate_event(ev);
463 if (!(event->hw.config & FSL_EMB_EVENT_VALID)) 456 if (!(event->hw.config & FSL_EMB_EVENT_VALID))
464 return ERR_PTR(-EINVAL); 457 return -EINVAL;
465 458
466 /* 459 /*
467 * If this is in a group, check if it can go on with all the 460 * If this is in a group, check if it can go on with all the
@@ -473,7 +466,7 @@ struct pmu *hw_perf_event_init(struct perf_event *event)
473 n = collect_events(event->group_leader, 466 n = collect_events(event->group_leader,
474 ppmu->n_counter - 1, events); 467 ppmu->n_counter - 1, events);
475 if (n < 0) 468 if (n < 0)
476 return ERR_PTR(-EINVAL); 469 return -EINVAL;
477 } 470 }
478 471
479 if (event->hw.config & FSL_EMB_EVENT_RESTRICTED) { 472 if (event->hw.config & FSL_EMB_EVENT_RESTRICTED) {
@@ -484,7 +477,7 @@ struct pmu *hw_perf_event_init(struct perf_event *event)
484 } 477 }
485 478
486 if (num_restricted >= ppmu->n_restricted) 479 if (num_restricted >= ppmu->n_restricted)
487 return ERR_PTR(-EINVAL); 480 return -EINVAL;
488 } 481 }
489 482
490 event->hw.idx = -1; 483 event->hw.idx = -1;
@@ -497,7 +490,7 @@ struct pmu *hw_perf_event_init(struct perf_event *event)
497 if (event->attr.exclude_kernel) 490 if (event->attr.exclude_kernel)
498 event->hw.config_base |= PMLCA_FCS; 491 event->hw.config_base |= PMLCA_FCS;
499 if (event->attr.exclude_idle) 492 if (event->attr.exclude_idle)
500 return ERR_PTR(-ENOTSUPP); 493 return -ENOTSUPP;
501 494
502 event->hw.last_period = event->hw.sample_period; 495 event->hw.last_period = event->hw.sample_period;
503 local64_set(&event->hw.period_left, event->hw.last_period); 496 local64_set(&event->hw.period_left, event->hw.last_period);
@@ -523,11 +516,17 @@ struct pmu *hw_perf_event_init(struct perf_event *event)
523 } 516 }
524 event->destroy = hw_perf_event_destroy; 517 event->destroy = hw_perf_event_destroy;
525 518
526 if (err) 519 return err;
527 return ERR_PTR(err);
528 return &fsl_emb_pmu;
529} 520}
530 521
522static struct pmu fsl_emb_pmu = {
523 .event_init = fsl_emb_pmu_event_init,
524 .enable = fsl_emb_pmu_enable,
525 .disable = fsl_emb_pmu_disable,
526 .read = fsl_emb_pmu_read,
527 .unthrottle = fsl_emb_pmu_unthrottle,
528};
529
531/* 530/*
532 * A counter has overflowed; update its count and record 531 * A counter has overflowed; update its count and record
533 * things if requested. Note that interrupts are hard-disabled 532 * things if requested. Note that interrupts are hard-disabled
@@ -651,5 +650,7 @@ int register_fsl_emb_pmu(struct fsl_emb_pmu *pmu)
651 pr_info("%s performance monitor hardware support registered\n", 650 pr_info("%s performance monitor hardware support registered\n",
652 pmu->name); 651 pmu->name);
653 652
653 perf_pmu_register(&fsl_emb_pmu);
654
654 return 0; 655 return 0;
655} 656}