diff options
Diffstat (limited to 'arch/powerpc/kernel/perf_event_fsl_emb.c')
-rw-r--r-- | arch/powerpc/kernel/perf_event_fsl_emb.c | 37 |
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 | ||
381 | static 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 | ||
431 | struct pmu *hw_perf_event_init(struct perf_event *event) | 424 | static 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 | ||
522 | static 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 | } |