Commit 541d284b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arm64-perf' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm[64] perf updates from Will Deacon:
 "In the past, I have funnelled perf updates through the respective
  architecture trees, but now that the arm/arm64 perf driver has been
  largely consolidated under drivers/perf/, it makes more sense to send
  a separate pull, particularly as I'm listed as maintainer for all the
  files involved.  I offered the branch to arm-soc, but Arnd suggested
  that I just send it to you directly.

  So, here is the arm/arm64 perf queue for 4.5.  The main features are
  described below, but the most useful change is from Drew, which
  advertises our architected event mapping in sysfs so that the perf
  tool is a lot more user friendly and no longer requires the use of
  magic hex constants for profiling common events.

   - Support for the CPU PMU in Cortex-A72

   - Add sysfs entries to describe the architected events and their
     mappings for PMUv{1-3}"

* tag 'arm64-perf' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: perf: add support for Cortex-A72
  arm64: perf: add format entry to describe event -> config mapping
  ARM: perf: add format entry to describe event -> config mapping
  arm64: kernel: enforce pmuserenr_el0 initialization and restore
  arm64: perf: Correct Cortex-A53/A57 compatible values
  arm64: perf: Add event descriptions
  arm64: perf: Convert event enums to #defines
  arm: perf: Add event descriptions
  arm: perf: Convert event enums to #defines
  drivers/perf: kill armpmu_register
parents fa5fd7c6 5d7ee877
...@@ -9,8 +9,9 @@ Required properties: ...@@ -9,8 +9,9 @@ Required properties:
- compatible : should be one of - compatible : should be one of
"apm,potenza-pmu" "apm,potenza-pmu"
"arm,armv8-pmuv3" "arm,armv8-pmuv3"
"arm.cortex-a57-pmu" "arm,cortex-a72-pmu"
"arm.cortex-a53-pmu" "arm,cortex-a57-pmu"
"arm,cortex-a53-pmu"
"arm,cortex-a17-pmu" "arm,cortex-a17-pmu"
"arm,cortex-a15-pmu" "arm,cortex-a15-pmu"
"arm,cortex-a12-pmu" "arm,cortex-a12-pmu"
......
This diff is collapsed.
This diff is collapsed.
...@@ -117,6 +117,7 @@ ENTRY(cpu_do_resume) ...@@ -117,6 +117,7 @@ ENTRY(cpu_do_resume)
*/ */
ubfx x11, x11, #1, #1 ubfx x11, x11, #1, #1
msr oslar_el1, x11 msr oslar_el1, x11
msr pmuserenr_el0, xzr // Disable PMU access from EL0
mov x0, x12 mov x0, x12
dsb nsh // Make sure local tlb invalidation completed dsb nsh // Make sure local tlb invalidation completed
isb isb
...@@ -153,6 +154,7 @@ ENTRY(__cpu_setup) ...@@ -153,6 +154,7 @@ ENTRY(__cpu_setup)
msr cpacr_el1, x0 // Enable FP/ASIMD msr cpacr_el1, x0 // Enable FP/ASIMD
mov x0, #1 << 12 // Reset mdscr_el1 and disable mov x0, #1 << 12 // Reset mdscr_el1 and disable
msr mdscr_el1, x0 // access to the DCC from EL0 msr mdscr_el1, x0 // access to the DCC from EL0
msr pmuserenr_el0, xzr // Disable PMU access from EL0
/* /*
* Memory region attributes for LPAE: * Memory region attributes for LPAE:
* *
......
...@@ -551,14 +551,6 @@ static void armpmu_init(struct arm_pmu *armpmu) ...@@ -551,14 +551,6 @@ static void armpmu_init(struct arm_pmu *armpmu)
}; };
} }
int armpmu_register(struct arm_pmu *armpmu, int type)
{
armpmu_init(armpmu);
pr_info("enabled with %s PMU driver, %d counters available\n",
armpmu->name, armpmu->num_events);
return perf_pmu_register(&armpmu->pmu, armpmu->name, type);
}
/* Set at runtime when we know what CPU type we are. */ /* Set at runtime when we know what CPU type we are. */
static struct arm_pmu *__oprofile_cpu_pmu; static struct arm_pmu *__oprofile_cpu_pmu;
...@@ -887,6 +879,8 @@ int arm_pmu_device_probe(struct platform_device *pdev, ...@@ -887,6 +879,8 @@ int arm_pmu_device_probe(struct platform_device *pdev,
return -ENOMEM; return -ENOMEM;
} }
armpmu_init(pmu);
if (!__oprofile_cpu_pmu) if (!__oprofile_cpu_pmu)
__oprofile_cpu_pmu = pmu; __oprofile_cpu_pmu = pmu;
...@@ -912,10 +906,13 @@ int arm_pmu_device_probe(struct platform_device *pdev, ...@@ -912,10 +906,13 @@ int arm_pmu_device_probe(struct platform_device *pdev,
if (ret) if (ret)
goto out_free; goto out_free;
ret = armpmu_register(pmu, -1); ret = perf_pmu_register(&pmu->pmu, pmu->name, -1);
if (ret) if (ret)
goto out_destroy; goto out_destroy;
pr_info("enabled with %s PMU driver, %d counters available\n",
pmu->name, pmu->num_events);
return 0; return 0;
out_destroy: out_destroy:
......
...@@ -111,8 +111,6 @@ struct arm_pmu { ...@@ -111,8 +111,6 @@ struct arm_pmu {
#define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu)) #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
int armpmu_register(struct arm_pmu *armpmu, int type);
u64 armpmu_event_update(struct perf_event *event); u64 armpmu_event_update(struct perf_event *event);
int armpmu_event_set_period(struct perf_event *event); int armpmu_event_set_period(struct perf_event *event);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment