Skip to content

Commit

Permalink
[ARM] oprofile: add ARM11 UP support
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Russell King authored and Russell King committed Feb 6, 2007
1 parent c265a76 commit 2d9e1ae
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 0 deletions.
10 changes: 10 additions & 0 deletions arch/arm/oprofile/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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

1 change: 1 addition & 0 deletions arch/arm/oprofile/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions arch/arm/oprofile/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions arch/arm/oprofile/op_arm_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
67 changes: 67 additions & 0 deletions arch/arm/oprofile/op_model_v6.c
Original file line number Diff line number Diff line change
@@ -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",
};

0 comments on commit 2d9e1ae

Please sign in to comment.