[ARM] oprofile: add ARM11 UP support
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Tue, 19 Dec 2006 12:41:22 +0000 (12:41 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 6 Feb 2007 16:46:44 +0000 (16:46 +0000)
Add oprofile glue for ARM11 (ARMv6) oprofile support.  This
connects the ARM11 core profiling support to the oprofile code
for uniprocessor configurations.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/oprofile/Kconfig
arch/arm/oprofile/Makefile
arch/arm/oprofile/common.c
arch/arm/oprofile/op_arm_model.h
arch/arm/oprofile/op_model_v6.c [new file with mode: 0644]

index 615a6b9503a4c45638dffceb3f7bd8e51fae6112..40cc1894b517f893dcdd4dd98d1d486e1b75a2b9 100644 (file)
@@ -19,8 +19,18 @@ config OPROFILE
 
          If unsure, say N.
 
+if OPROFILE
+
+config OPROFILE_ARMV6
+       bool
+       depends on CPU_V6 && !SMP
+       default y
+       select OPROFILE_ARM11_CORE
+
 config OPROFILE_ARM11_CORE
        bool
 
+endif
+
 endmenu
 
index 30352d6c4a25e906f82ff09c0b4f9f1f4c227a2d..3d5ff306db78a446305ed3f37692332760076296 100644 (file)
@@ -9,3 +9,4 @@ DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \
 oprofile-y                             := $(DRIVER_OBJS) common.o backtrace.o
 oprofile-$(CONFIG_CPU_XSCALE)          += op_model_xscale.o
 oprofile-$(CONFIG_OPROFILE_ARM11_CORE) += op_model_arm11_core.o
+oprofile-$(CONFIG_OPROFILE_ARMV6)      += op_model_v6.o
index 6f833358cd0612c4c13e5d59619e86ccee2749e5..f1b24fbd8e67ac41ec925ceff3bf0274f206fd41 100644 (file)
@@ -135,6 +135,10 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
        spec = &op_xscale_spec;
 #endif
 
+#ifdef CONFIG_OPROFILE_ARMV6
+       spec = &op_armv6_spec;
+#endif
+
        if (spec) {
                ret = spec->init();
                if (ret < 0)
index 38c6ad158547e2e615620888c59848be57784f46..ad1c962ed17b47e13f38b4570745e97c6246305c 100644 (file)
@@ -24,6 +24,8 @@ struct op_arm_model_spec {
 extern struct op_arm_model_spec op_xscale_spec;
 #endif
 
+extern struct op_arm_model_spec op_armv6_spec;
+
 extern void arm_backtrace(struct pt_regs * const regs, unsigned int depth);
 
 extern int __init op_arm_init(struct oprofile_operations *ops, struct op_arm_model_spec *spec);
diff --git a/arch/arm/oprofile/op_model_v6.c b/arch/arm/oprofile/op_model_v6.c
new file mode 100644 (file)
index 0000000..fe58138
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+ * @file op_model_v6.c
+ * ARM11 Performance Monitor Driver
+ *
+ * Based on op_model_xscale.c
+ *
+ * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
+ * @remark Copyright 2000-2004 MontaVista Software Inc
+ * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
+ * @remark Copyright 2004 Intel Corporation
+ * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
+ * @remark Copyright 2004 OProfile Authors
+ *
+ * @remark Read the file COPYING
+ *
+ * @author Tony Lindgren <tony@atomide.com>
+ */
+
+/* #define DEBUG */
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/oprofile.h>
+#include <linux/interrupt.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+
+#include "op_counter.h"
+#include "op_arm_model.h"
+#include "op_model_arm11_core.h"
+
+static int irqs[] = {
+#ifdef CONFIG_ARCH_OMAP2
+       3,
+#endif
+};
+
+static void armv6_pmu_stop(void)
+{
+       arm11_stop_pmu();
+       arm11_release_interrupts(irqs, ARRAY_SIZE(irqs));
+}
+
+static int armv6_pmu_start(void)
+{
+       int ret;
+
+       ret = arm11_request_interrupts(irqs, ARRAY_SIZE(irqs));
+       if (ret >= 0)
+               ret = arm11_start_pmu();
+
+       return ret;
+}
+
+static int armv6_detect_pmu(void)
+{
+       return 0;
+}
+
+struct op_arm_model_spec op_armv6_spec = {
+       .init           = armv6_detect_pmu,
+       .num_counters   = 3,
+       .setup_ctrs     = arm11_setup_pmu,
+       .start          = armv6_pmu_start,
+       .stop           = armv6_pmu_stop,
+       .name           = "arm/armv6",
+};