Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 555d97ac authored by Andy Fleming's avatar Andy Fleming Committed by Paul Mackerras
Browse files

[PATCH] powerpc: G4+ oprofile support



This patch adds oprofile support for the 7450 and all its multitudinous
derivatives.

* Added 7450 (and derivatives) support for oprofile
* Changed e500 cputable to have oprofile model and cpu_type fields
* Added support for classic 32-bit performance monitor interrupt
* Cleaned up common powerpc oprofile code to be as common as possible
* Cleaned up oprofile_impl.h to reflect 32 bit classic code
* Added 32-bit MMCRx bitfield definitions and SPR numbers

Signed-off-by: default avatarAndy Fleming <afleming@freescale.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent e5cd0404
Loading
Loading
Loading
Loading
+63 −11
Original line number Diff line number Diff line
@@ -545,7 +545,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7450 2.1 */
		.pvr_mask		= 0xffffffff,
@@ -556,7 +560,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7450 2.3 and newer */
		.pvr_mask		= 0xffff0000,
@@ -567,7 +575,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7455 rev 1.x */
		.pvr_mask		= 0xffffff00,
@@ -578,7 +590,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7455 rev 2.0 */
		.pvr_mask		= 0xffffffff,
@@ -589,7 +605,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7455 others */
		.pvr_mask		= 0xffff0000,
@@ -600,7 +620,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7447/7457 Rev 1.0 */
		.pvr_mask		= 0xffffffff,
@@ -611,7 +635,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7447/7457 Rev 1.1 */
		.pvr_mask		= 0xffffffff,
@@ -622,7 +650,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7447/7457 Rev 1.2 and later */
		.pvr_mask		= 0xffff0000,
@@ -633,7 +665,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7447A */
		.pvr_mask		= 0xffff0000,
@@ -644,7 +680,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 7448 */
		.pvr_mask		= 0xffff0000,
@@ -655,7 +695,11 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 6,
		.cpu_setup		= __setup_cpu_745x
		.cpu_setup		= __setup_cpu_745x,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type      = "ppc/7450",
		.oprofile_model         = &op_model_7450,
#endif
	},
	{	/* 82xx (8240, 8245, 8260 are all 603e cores) */
		.pvr_mask		= 0x7fff0000,
@@ -979,6 +1023,10 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 4,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type	= "ppc/e500",
		.oprofile_model		= &op_model_fsl_booke,
#endif
	},
	{	/* e500v2 */
		.pvr_mask		= 0xffff0000,
@@ -992,6 +1040,10 @@ struct cpu_spec cpu_specs[] = {
		.icache_bsize		= 32,
		.dcache_bsize		= 32,
		.num_pmcs		= 4,
#ifdef CONFIG_OPROFILE
		.oprofile_cpu_type	= "ppc/e500",
		.oprofile_model		= &op_model_fsl_booke,
#endif
	},
#endif
#if !CLASSIC_PPC
+6 −6
Original line number Diff line number Diff line
@@ -466,16 +466,11 @@ SystemCall:
 * by executing an altivec instruction.
 */
	. = 0xf00
	b	Trap_0f
	b	PerformanceMonitor

	. = 0xf20
	b	AltiVecUnavailable

Trap_0f:
	EXCEPTION_PROLOG
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_EE(0xf00, unknown_exception)

/*
 * Handle TLB miss for instruction on 603/603e.
 * Note: we get an alternate set of r0 - r3 to use automatically.
@@ -719,6 +714,11 @@ AltiVecUnavailable:
#endif /* CONFIG_ALTIVEC */
	EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception)

PerformanceMonitor:
	EXCEPTION_PROLOG
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0xf00, performance_monitor_exception)

#ifdef CONFIG_ALTIVEC
/* Note that the AltiVec support is closely modeled after the FP
 * support.  Changes to one are likely to be applicable to the
+5 −0
Original line number Diff line number Diff line
@@ -43,8 +43,13 @@ static void dummy_perf(struct pt_regs *regs)
	mtspr(SPRN_MMCR0, mmcr0);
}
#else
/* Ensure exceptions are disabled */
static void dummy_perf(struct pt_regs *regs)
{
	unsigned int mmcr0 = mfspr(SPRN_MMCR0);

	mmcr0 &= ~(MMCR0_PMXE);
	mtspr(SPRN_MMCR0, mmcr0);
}
#endif

+0 −2
Original line number Diff line number Diff line
@@ -901,12 +901,10 @@ void altivec_unavailable_exception(struct pt_regs *regs)
	die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT);
}

#if defined(CONFIG_PPC64) || defined(CONFIG_E500)
void performance_monitor_exception(struct pt_regs *regs)
{
	perf_irq(regs);
}
#endif

#ifdef CONFIG_8xx
void SoftwareEmulation(struct pt_regs *regs)
+1 −0
Original line number Diff line number Diff line
@@ -9,3 +9,4 @@ DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \
oprofile-y := $(DRIVER_OBJS) common.o
oprofile-$(CONFIG_PPC64) += op_model_rs64.o op_model_power4.o
oprofile-$(CONFIG_FSL_BOOKE) += op_model_fsl_booke.o
oprofile-$(CONFIG_PPC32) += op_model_7450.o
Loading