aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/common/bL_switcher.c
diff options
context:
space:
mode:
authorDave Martin <dave.martin@linaro.org>2012-05-14 12:40:07 -0400
committerNicolas Pitre <nicolas.pitre@linaro.org>2013-09-23 18:47:29 -0400
commit1bfbddb6f3a0dbb8c3996d1c4d4911d695737c15 (patch)
tree2370ebf2ea93b4ef1af68da722290c0a96aee4e3 /arch/arm/common/bL_switcher.c
parent6137eba6c2b9bc2b7fd52e77741f50e43db4b5a6 (diff)
ARM: bL_switcher: Basic trace events support
This patch adds simple trace events to the b.L switcher code to allow tracing of CPU migration events. To make use of the trace events, you will need: CONFIG_FTRACE=y CONFIG_ENABLE_DEFAULT_TRACERS=y The following events are added: * power:cpu_migrate_begin * power:cpu_migrate_finish each with the following data: u64 timestamp; u32 cpu_hwid; power:cpu_migrate_begin occurs immediately before the switcher-specific migration operations start. power:cpu_migrate_finish occurs immediately when migration is completed. The cpu_hwid field contains the ID fields of the MPIDR. * For power:cpu_migrate_begin, cpu_hwid is the ID of the outbound physical CPU (equivalent to (from_phys_cpu,from_phys_cluster)). * For power:cpu_migrate_finish, cpu_hwid is the ID of the inbound physical CPU (equivalent to (to_phys_cpu,to_phys_cluster)). By design, the cpu_hwid field is masked in the same way as the device tree cpu node reg property, allowing direct correlation to the DT description of the hardware. The timestamp is added in order to minimise timing noise. An accurate system-wide clock should be used for generating this (hopefully getnstimeofday is appropriate, but it could be changed). It could be any monotonic shared clock, since the aim is to allow accurate deltas to be computed. We don't necessarily care about accurate synchronisation with wall clock time. In practice, each switch takes place on a single logical CPU, and the trace infrastructure should guarantee that events are well-ordered with respect to a single logical CPU. Signed-off-by: Dave Martin <dave.martin@linaro.org> Signed-off-by: Nicolas Pitre <nico@linaro.org>
Diffstat (limited to 'arch/arm/common/bL_switcher.c')
-rw-r--r--arch/arm/common/bL_switcher.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/arm/common/bL_switcher.c b/arch/arm/common/bL_switcher.c
index dc53eb8dcc81..7002de360d23 100644
--- a/arch/arm/common/bL_switcher.c
+++ b/arch/arm/common/bL_switcher.c
@@ -20,6 +20,7 @@
20#include <linux/cpumask.h> 20#include <linux/cpumask.h>
21#include <linux/kthread.h> 21#include <linux/kthread.h>
22#include <linux/wait.h> 22#include <linux/wait.h>
23#include <linux/time.h>
23#include <linux/clockchips.h> 24#include <linux/clockchips.h>
24#include <linux/hrtimer.h> 25#include <linux/hrtimer.h>
25#include <linux/tick.h> 26#include <linux/tick.h>
@@ -33,10 +34,14 @@
33#include <linux/moduleparam.h> 34#include <linux/moduleparam.h>
34 35
35#include <asm/smp_plat.h> 36#include <asm/smp_plat.h>
37#include <asm/cputype.h>
36#include <asm/suspend.h> 38#include <asm/suspend.h>
37#include <asm/mcpm.h> 39#include <asm/mcpm.h>
38#include <asm/bL_switcher.h> 40#include <asm/bL_switcher.h>
39 41
42#define CREATE_TRACE_POINTS
43#include <trace/events/power_cpu_migrate.h>
44
40 45
41/* 46/*
42 * Use our own MPIDR accessors as the generic ones in asm/cputype.h have 47 * Use our own MPIDR accessors as the generic ones in asm/cputype.h have
@@ -52,6 +57,16 @@ static int read_mpidr(void)
52} 57}
53 58
54/* 59/*
60 * Get a global nanosecond time stamp for tracing.
61 */
62static s64 get_ns(void)
63{
64 struct timespec ts;
65 getnstimeofday(&ts);
66 return timespec_to_ns(&ts);
67}
68
69/*
55 * bL switcher core code. 70 * bL switcher core code.
56 */ 71 */
57 72
@@ -208,6 +223,7 @@ static int bL_switch_to(unsigned int new_cluster_id)
208 */ 223 */
209 local_irq_disable(); 224 local_irq_disable();
210 local_fiq_disable(); 225 local_fiq_disable();
226 trace_cpu_migrate_begin(get_ns(), ob_mpidr);
211 227
212 /* redirect GIC's SGIs to our counterpart */ 228 /* redirect GIC's SGIs to our counterpart */
213 gic_migrate_target(bL_gic_id[ib_cpu][ib_cluster]); 229 gic_migrate_target(bL_gic_id[ib_cpu][ib_cluster]);
@@ -250,6 +266,7 @@ static int bL_switch_to(unsigned int new_cluster_id)
250 tdev->evtdev->next_event, 1); 266 tdev->evtdev->next_event, 1);
251 } 267 }
252 268
269 trace_cpu_migrate_finish(get_ns(), ib_mpidr);
253 local_fiq_enable(); 270 local_fiq_enable();
254 local_irq_enable(); 271 local_irq_enable();
255 272