diff mbox

[09/11] ARM: perf: add PMUv2 common event definitions

Message ID 1307379355-13802-10-git-send-email-will.deacon@arm.com (mailing list archive)
State New, archived
Headers show

Commit Message

Will Deacon June 6, 2011, 4:55 p.m. UTC
The PMUv2 specification reserves a number of event encodings
for common events.

This patch adds these events to the common event enumeration
in preparation for PMUv2 cores, such as Cortex-A15.

Signed-off-by: Will Deacon <will.deacon@arm.com>
---
 arch/arm/kernel/perf_event_v7.c |   35 +++++++++++++++++++++++++----------
 1 files changed, 25 insertions(+), 10 deletions(-)

Comments

Jean Pihet June 7, 2011, 7:18 a.m. UTC | #1
Hi Will,

On Mon, Jun 6, 2011 at 6:55 PM, Will Deacon <will.deacon@arm.com> wrote:
> The PMUv2 specification reserves a number of event encodings
> for common events.
>
> This patch adds these events to the common event enumeration
> in preparation for PMUv2 cores, such as Cortex-A15.
>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
> ---
>  arch/arm/kernel/perf_event_v7.c |   35 +++++++++++++++++++++++++----------
>  1 files changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
> index 554eba3..01b1145 100644
> --- a/arch/arm/kernel/perf_event_v7.c
> +++ b/arch/arm/kernel/perf_event_v7.c
> @@ -17,17 +17,23 @@
>  */
>
>  #ifdef CONFIG_CPU_V7
> -/* Common ARMv7 event types */
> +/*
> + * Common ARMv7 event types
> + *
> + * Note: An implementation may not be able to count all of these events
> + * but the encodings are considered to be `reserved' in the case that
> + * they are not available.
> + */
>  enum armv7_perf_types {
>        ARMV7_PERFCTR_PMNC_SW_INCR              = 0x00,
>        ARMV7_PERFCTR_IFETCH_MISS               = 0x01,
>        ARMV7_PERFCTR_ITLB_MISS                 = 0x02,
> -       ARMV7_PERFCTR_DCACHE_REFILL             = 0x03,
> -       ARMV7_PERFCTR_DCACHE_ACCESS             = 0x04,
> +       ARMV7_PERFCTR_DCACHE_REFILL             = 0x03, /* L1 */
> +       ARMV7_PERFCTR_DCACHE_ACCESS             = 0x04, /* L1 */
>        ARMV7_PERFCTR_DTLB_REFILL               = 0x05,
>        ARMV7_PERFCTR_DREAD                     = 0x06,
>        ARMV7_PERFCTR_DWRITE                    = 0x07,
> -
> +       ARMV7_PERFCTR_INSTR_EXECUTED            = 0x08,
>        ARMV7_PERFCTR_EXC_TAKEN                 = 0x09,
>        ARMV7_PERFCTR_EXC_EXECUTED              = 0x0A,
>        ARMV7_PERFCTR_CID_WRITE                 = 0x0B,
> @@ -39,21 +45,30 @@ enum armv7_perf_types {
>         */
>        ARMV7_PERFCTR_PC_WRITE                  = 0x0C,
>        ARMV7_PERFCTR_PC_IMM_BRANCH             = 0x0D,
> +       ARMV7_PERFCTR_PC_PROC_RETURN            = 0x0E,
Will ARMV7_PERFCTR_INSTR_EXECUTED and ARMV7_PERFCTR_PC_PROC_RETURN
work for all v7 implementations? For example they are not defined for
A9.

>        ARMV7_PERFCTR_UNALIGNED_ACCESS          = 0x0F,
> +
> +       /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */
>        ARMV7_PERFCTR_PC_BRANCH_MIS_PRED        = 0x10,
>        ARMV7_PERFCTR_CLOCK_CYCLES              = 0x11,
> -
> -       ARMV7_PERFCTR_PC_BRANCH_MIS_USED        = 0x12,
> +       ARMV7_PERFCTR_PC_BRANCH_PRED            = 0x12,
> +       ARMV7_PERFCTR_MEM_ACCESS                = 0x13,
> +       ARMV7_PERFCTR_L1_ICACHE_ACCESS          = 0x14,
> +       ARMV7_PERFCTR_L1_DCACHE_WB              = 0x15,
> +       ARMV7_PERFCTR_L2_DCACHE_ACCESS          = 0x16,
> +       ARMV7_PERFCTR_L2_DCACHE_REFILL          = 0x17,
> +       ARMV7_PERFCTR_L2_DCACHE_WB              = 0x18,
> +       ARMV7_PERFCTR_BUS_ACCESS                = 0x19,
> +       ARMV7_PERFCTR_MEMORY_ERROR              = 0x1A,
> +       ARMV7_PERFCTR_INSTR_SPEC                = 0x1B,
> +       ARMV7_PERFCTR_TTBR_WRITE                = 0x1C,
> +       ARMV7_PERFCTR_BUS_CYCLES                = 0x1D,
Same question for those new events that are not defined for A8 and A9.

Thanks,
Jean

>
>        ARMV7_PERFCTR_CPU_CYCLES                = 0xFF
>  };
>
>  /* ARMv7 Cortex-A8 specific event types */
>  enum armv7_a8_perf_types {
> -       ARMV7_PERFCTR_INSTR_EXECUTED            = 0x08,
> -
> -       ARMV7_PERFCTR_PC_PROC_RETURN            = 0x0E,
> -
>        ARMV7_PERFCTR_WRITE_BUFFER_FULL         = 0x40,
>        ARMV7_PERFCTR_L2_STORE_MERGED           = 0x41,
>        ARMV7_PERFCTR_L2_STORE_BUFF             = 0x42,
> --
> 1.7.0.4
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
Will Deacon June 7, 2011, 8:51 a.m. UTC | #2
Hi Jean,

Thanks for looking at this bag of hex values!

> On Mon, Jun 6, 2011 at 6:55 PM, Will Deacon <will.deacon@arm.com> wrote:
> > The PMUv2 specification reserves a number of event encodings
> > for common events.
> >
> > This patch adds these events to the common event enumeration
> > in preparation for PMUv2 cores, such as Cortex-A15.
> >
> > Signed-off-by: Will Deacon <will.deacon@arm.com>
> > ---
> >  arch/arm/kernel/perf_event_v7.c |   35 +++++++++++++++++++++++++----------
> >  1 files changed, 25 insertions(+), 10 deletions(-)

[...]

> >  enum armv7_perf_types {
> >        ARMV7_PERFCTR_PMNC_SW_INCR              = 0x00,
> >        ARMV7_PERFCTR_IFETCH_MISS               = 0x01,
> >        ARMV7_PERFCTR_ITLB_MISS                 = 0x02,
> > -       ARMV7_PERFCTR_DCACHE_REFILL             = 0x03,
> > -       ARMV7_PERFCTR_DCACHE_ACCESS             = 0x04,
> > +       ARMV7_PERFCTR_DCACHE_REFILL             = 0x03, /* L1 */
> > +       ARMV7_PERFCTR_DCACHE_ACCESS             = 0x04, /* L1 */
> >        ARMV7_PERFCTR_DTLB_REFILL               = 0x05,
> >        ARMV7_PERFCTR_DREAD                     = 0x06,
> >        ARMV7_PERFCTR_DWRITE                    = 0x07,
> > -
> > +       ARMV7_PERFCTR_INSTR_EXECUTED            = 0x08,
> >        ARMV7_PERFCTR_EXC_TAKEN                 = 0x09,
> >        ARMV7_PERFCTR_EXC_EXECUTED              = 0x0A,
> >        ARMV7_PERFCTR_CID_WRITE                 = 0x0B,
> > @@ -39,21 +45,30 @@ enum armv7_perf_types {
> >         */
> >        ARMV7_PERFCTR_PC_WRITE                  = 0x0C,
> >        ARMV7_PERFCTR_PC_IMM_BRANCH             = 0x0D,
> > +       ARMV7_PERFCTR_PC_PROC_RETURN            = 0x0E,
> Will ARMV7_PERFCTR_INSTR_EXECUTED and ARMV7_PERFCTR_PC_PROC_RETURN
> work for all v7 implementations? For example they are not defined for
> A9.

Correct, A9 doesn't support these and in general they are not mandatory.
The useful part is that this event space cannot be reused for different
events, so if an event of encoding 0x08 *is* supported, it absolutely
must be ARMV7_PERFCTR_INSTR_EXECUTED.

PMUv2 does define some feature registers (bitmaps) in the co-processor
space, which tell you the supported events out of the common encodings.
I don't think this is much use for the kernel, but it might be for
userspace. If somebody decides they want it then I'll happily expose it
through debugfs.
 
> >        ARMV7_PERFCTR_UNALIGNED_ACCESS          = 0x0F,
> > +
> > +       /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */
> >        ARMV7_PERFCTR_PC_BRANCH_MIS_PRED        = 0x10,
> >        ARMV7_PERFCTR_CLOCK_CYCLES              = 0x11,
> > -
> > -       ARMV7_PERFCTR_PC_BRANCH_MIS_USED        = 0x12,
> > +       ARMV7_PERFCTR_PC_BRANCH_PRED            = 0x12,
> > +       ARMV7_PERFCTR_MEM_ACCESS                = 0x13,
> > +       ARMV7_PERFCTR_L1_ICACHE_ACCESS          = 0x14,
> > +       ARMV7_PERFCTR_L1_DCACHE_WB              = 0x15,
> > +       ARMV7_PERFCTR_L2_DCACHE_ACCESS          = 0x16,
> > +       ARMV7_PERFCTR_L2_DCACHE_REFILL          = 0x17,
> > +       ARMV7_PERFCTR_L2_DCACHE_WB              = 0x18,
> > +       ARMV7_PERFCTR_BUS_ACCESS                = 0x19,
> > +       ARMV7_PERFCTR_MEMORY_ERROR              = 0x1A,
> > +       ARMV7_PERFCTR_INSTR_SPEC                = 0x1B,
> > +       ARMV7_PERFCTR_TTBR_WRITE                = 0x1C,
> > +       ARMV7_PERFCTR_BUS_CYCLES                = 0x1D,
> Same question for those new events that are not defined for A8 and A9.

Same response actually. The core may implement a subset of these, but the
encodings remain reserved otherwise.

Thanks for taking a look,

Will
diff mbox

Patch

diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
index 554eba3..01b1145 100644
--- a/arch/arm/kernel/perf_event_v7.c
+++ b/arch/arm/kernel/perf_event_v7.c
@@ -17,17 +17,23 @@ 
  */
 
 #ifdef CONFIG_CPU_V7
-/* Common ARMv7 event types */
+/*
+ * Common ARMv7 event types
+ *
+ * Note: An implementation may not be able to count all of these events
+ * but the encodings are considered to be `reserved' in the case that
+ * they are not available.
+ */
 enum armv7_perf_types {
 	ARMV7_PERFCTR_PMNC_SW_INCR		= 0x00,
 	ARMV7_PERFCTR_IFETCH_MISS		= 0x01,
 	ARMV7_PERFCTR_ITLB_MISS			= 0x02,
-	ARMV7_PERFCTR_DCACHE_REFILL		= 0x03,
-	ARMV7_PERFCTR_DCACHE_ACCESS		= 0x04,
+	ARMV7_PERFCTR_DCACHE_REFILL		= 0x03,	/* L1 */
+	ARMV7_PERFCTR_DCACHE_ACCESS		= 0x04,	/* L1 */
 	ARMV7_PERFCTR_DTLB_REFILL		= 0x05,
 	ARMV7_PERFCTR_DREAD			= 0x06,
 	ARMV7_PERFCTR_DWRITE			= 0x07,
-
+	ARMV7_PERFCTR_INSTR_EXECUTED		= 0x08,
 	ARMV7_PERFCTR_EXC_TAKEN			= 0x09,
 	ARMV7_PERFCTR_EXC_EXECUTED		= 0x0A,
 	ARMV7_PERFCTR_CID_WRITE			= 0x0B,
@@ -39,21 +45,30 @@  enum armv7_perf_types {
 	 */
 	ARMV7_PERFCTR_PC_WRITE			= 0x0C,
 	ARMV7_PERFCTR_PC_IMM_BRANCH		= 0x0D,
+	ARMV7_PERFCTR_PC_PROC_RETURN		= 0x0E,
 	ARMV7_PERFCTR_UNALIGNED_ACCESS		= 0x0F,
+
+	/* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */
 	ARMV7_PERFCTR_PC_BRANCH_MIS_PRED	= 0x10,
 	ARMV7_PERFCTR_CLOCK_CYCLES		= 0x11,
-
-	ARMV7_PERFCTR_PC_BRANCH_MIS_USED	= 0x12,
+	ARMV7_PERFCTR_PC_BRANCH_PRED		= 0x12,
+	ARMV7_PERFCTR_MEM_ACCESS		= 0x13,
+	ARMV7_PERFCTR_L1_ICACHE_ACCESS		= 0x14,
+	ARMV7_PERFCTR_L1_DCACHE_WB		= 0x15,
+	ARMV7_PERFCTR_L2_DCACHE_ACCESS		= 0x16,
+	ARMV7_PERFCTR_L2_DCACHE_REFILL		= 0x17,
+	ARMV7_PERFCTR_L2_DCACHE_WB		= 0x18,
+	ARMV7_PERFCTR_BUS_ACCESS		= 0x19,
+	ARMV7_PERFCTR_MEMORY_ERROR		= 0x1A,
+	ARMV7_PERFCTR_INSTR_SPEC		= 0x1B,
+	ARMV7_PERFCTR_TTBR_WRITE		= 0x1C,
+	ARMV7_PERFCTR_BUS_CYCLES		= 0x1D,
 
 	ARMV7_PERFCTR_CPU_CYCLES		= 0xFF
 };
 
 /* ARMv7 Cortex-A8 specific event types */
 enum armv7_a8_perf_types {
-	ARMV7_PERFCTR_INSTR_EXECUTED		= 0x08,
-
-	ARMV7_PERFCTR_PC_PROC_RETURN		= 0x0E,
-
 	ARMV7_PERFCTR_WRITE_BUFFER_FULL		= 0x40,
 	ARMV7_PERFCTR_L2_STORE_MERGED		= 0x41,
 	ARMV7_PERFCTR_L2_STORE_BUFF		= 0x42,