Blame SOURCES/libpfm-a64fx.patch

1de8ec
commit 0cfc35f73e0e39d54ba48c24e663bec93d164211
1de8ec
Author: Steve Kaufmann <steven.kaufmann@hpe.com>
1de8ec
Date:   Mon May 18 09:33:57 2020 -0700
1de8ec
1de8ec
    Enable support for Fujitsu A64FX core PMU
1de8ec
    
1de8ec
    This patch adds support for Fujitsu A64FX core PMU. This
1de8ec
    includes ARMv8 generic core events and Fujitsu model
1de8ec
    specfic events.
1de8ec
    
1de8ec
    Signed-off-by: Steve Kaufmann <steven.kaufmann@hpe.com>
1de8ec
1de8ec
diff --git a/README b/README
1de8ec
index f40489e..c21fb28 100644
1de8ec
--- a/README
1de8ec
+++ b/README
1de8ec
@@ -72,6 +72,7 @@ The library supports many PMUs. The current version can handle:
1de8ec
 		ARMV8 Cortex A57, A53
1de8ec
 		Applied Micro X-Gene
1de8ec
 		Qualcomm Krait
1de8ec
+		Fujitsu A64FX
1de8ec
 
1de8ec
 	- For SPARC
1de8ec
 		Ultra I, II
1de8ec
diff --git a/docs/Makefile b/docs/Makefile
1de8ec
index e39de6b..995ece0 100644
1de8ec
--- a/docs/Makefile
1de8ec
+++ b/docs/Makefile
1de8ec
@@ -122,7 +122,8 @@ ARCH_MAN += libpfm_arm_xgene.3 \
1de8ec
 	    libpfm_arm_ac15.3 \
1de8ec
 	    libpfm_arm_ac8.3 \
1de8ec
 	    libpfm_arm_ac9.3 \
1de8ec
-	    libpfm_arm_qcom_krait.3
1de8ec
+	    libpfm_arm_qcom_krait.3 \
1de8ec
+	    libpfm_arm_a64fx.3
1de8ec
 endif
1de8ec
 
1de8ec
 ifeq ($(CONFIG_PFMLIB_ARCH_ARM64),y)
1de8ec
diff --git a/docs/man3/libpfm_arm_a64fx.3 b/docs/man3/libpfm_arm_a64fx.3
1de8ec
new file mode 100644
1de8ec
index 0000000..6214eb7
1de8ec
--- /dev/null
1de8ec
+++ b/docs/man3/libpfm_arm_a64fx.3
1de8ec
@@ -0,0 +1,36 @@
1de8ec
+.TH LIBPFM 3  "May, 2020" "" "Linux Programmer's Manual"
1de8ec
+.SH NAME
1de8ec
+libpfm_arm_a64fx - support for Fujitsu A64FX PMU
1de8ec
+.SH SYNOPSIS
1de8ec
+.nf
1de8ec
+.B #include <perfmon/pfmlib.h>
1de8ec
+.sp
1de8ec
+.B PMU name: arm_a64fx
1de8ec
+.B PMU desc: Fujitsu A64FX
1de8ec
+.sp
1de8ec
+.SH DESCRIPTION
1de8ec
+The library supports the Fujitsu A64FX core PMU.
1de8ec
+
1de8ec
+This PMU supports 6 counters and privilege levels filtering.
1de8ec
+It can operate in both 32 and 64 bit modes.
1de8ec
+
1de8ec
+.SH MODIFIERS
1de8ec
+The following modifiers are supported on Fujitsu A64FX:
1de8ec
+.TP
1de8ec
+.B u
1de8ec
+Measure at the user level. This corresponds to \fBPFM_PLM3\fR.
1de8ec
+This is a boolean modifier.
1de8ec
+.TP
1de8ec
+.B k
1de8ec
+Measure at the kernel level. This corresponds to \fBPFM_PLM0\fR.
1de8ec
+This is a boolean modifier.
1de8ec
+.TP
1de8ec
+.B hv
1de8ec
+Measure at the hypervisor level. This corresponds to \fBPFM_PLMH\fR.
1de8ec
+This is a boolean modifier.
1de8ec
+
1de8ec
+.SH AUTHORS
1de8ec
+.nf
1de8ec
+Stephane Eranian <eranian@gmail.com>
1de8ec
+.if
1de8ec
+.PP
1de8ec
diff --git a/include/perfmon/pfmlib.h b/include/perfmon/pfmlib.h
1de8ec
index e19772a..caa93db 100644
1de8ec
--- a/include/perfmon/pfmlib.h
1de8ec
+++ b/include/perfmon/pfmlib.h
1de8ec
@@ -559,6 +559,8 @@ typedef enum {
1de8ec
 	PFM_PMU_ARM_THUNDERX2_LLC1,	/* Marvell ThunderX2 LLC unit 1 uncore */
1de8ec
 	PFM_PMU_ARM_THUNDERX2_CCPI0,	/* Marvell ThunderX2 Cross-Socket Interconnect unit 0 uncore */
1de8ec
 	PFM_PMU_ARM_THUNDERX2_CCPI1,	/* Marvell ThunderX2 Cross-Socket Interconnect unit 1 uncore */
1de8ec
+
1de8ec
+	PFM_PMU_ARM_A64FX,		/* Fujitsu A64FX processor */
1de8ec
 	/* MUST ADD NEW PMU MODELS HERE */
1de8ec
 
1de8ec
 	PFM_PMU_MAX			/* end marker */
1de8ec
diff --git a/lib/events/arm_fujitsu_a64fx_events.h b/lib/events/arm_fujitsu_a64fx_events.h
1de8ec
new file mode 100644
1de8ec
index 0000000..3b555f0
1de8ec
--- /dev/null
1de8ec
+++ b/lib/events/arm_fujitsu_a64fx_events.h
1de8ec
@@ -0,0 +1,1136 @@
1de8ec
+/*
1de8ec
+ *	Copyright 2020 Cray Inc. All Rights Reserved.
1de8ec
+ */
1de8ec
+
1de8ec
+/*
1de8ec
+ *	Fujitsu A64FX processor
1de8ec
+ *
1de8ec
+ *	A64FX® PMU Events
1de8ec
+ *	Fujitsu Limited
1de8ec
+ *	1.2, 28 April 2020
1de8ec
+ */
1de8ec
+
1de8ec
+static const arm_entry_t arm_a64fx_pe[ ] = {
1de8ec
+	{
1de8ec
+		.name = "SW_INCR",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0000,
1de8ec
+		.desc = "This event counts on writes to the PMSWINC register.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1I_CACHE_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0001,
1de8ec
+		.desc = "This event counts operations that cause a refill of at least the L1I cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1I_TLB_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0002,
1de8ec
+		.desc = "This event counts operations that cause a TLB refill of at least the L1I TLB.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_CACHE_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0003,
1de8ec
+		.desc = "This event counts operations that cause a refill of at least the L1D cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_CACHE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0004,
1de8ec
+		.desc = "This event counts operations that cause a cache access to at least the L1D cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_TLB_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0005,
1de8ec
+		.desc = "This event counts operations that cause a TLB refill of at least the L1D TLB.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "INST_RETIRED",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0008,
1de8ec
+		.desc = "This event counts every architecturally executed instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_TAKEN",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0009,
1de8ec
+		.desc = "This event counts each exception taken.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_RETURN",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x000a,
1de8ec
+		.desc = "This event counts each executed exception return instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "CID_WRITE_RETIRED",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x000b,
1de8ec
+		.desc = "This event counts every write to CONTEXTIDR.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BR_MIS_PRED",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0010,
1de8ec
+		.desc = "This event counts each correction to the predicted program flow that occurs because of a misprediction from, or no prediction from, the branch prediction resources and that relates to instructions that the branch prediction resources are capable of predicting.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "CPU_CYCLES",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0011,
1de8ec
+		.desc = "This event counts every cycle.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BR_PRED",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0012,
1de8ec
+		.desc = "This event counts every branch or other change in the program flow that the branch prediction resources are capable of predicting.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1I_CACHE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0014,
1de8ec
+		.desc = "This event counts operations that cause a cache access to at least the L1I cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_CACHE_WB",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0015,
1de8ec
+		.desc = "This event counts every write-back of data from the L1D cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0016,
1de8ec
+		.desc = "This event counts operations that cause a cache access to at least the L2 cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0017,
1de8ec
+		.desc = "This event counts operations that cause a refill of at least the L2 cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_WB",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0018,
1de8ec
+		.desc = "This event counts every write-back of data from the L2 cache.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "INST_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x001b,
1de8ec
+		.desc = "This event counts every architecturally executed instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "STALL_FRONTEND",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0023,
1de8ec
+		.desc = "This event counts every cycle counted by the CPU_CYCLES event on that no operations are issued because there are no operations available to issue for this PE from the frontend.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "STALL_BACKEND",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0024,
1de8ec
+		.desc = "This event counts every cycle counted by the CPU_CYCLES event on that no operations are issued because the backend is unable to accept any operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_TLB_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x002d,
1de8ec
+		.desc = "This event counts operations that cause a TLB refill of at least the L2D TLB.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2I_TLB_REFILL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x002e,
1de8ec
+		.desc = "This event counts operations that cause a TLB refill of at least the L2I TLB.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_TLB",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x002f,
1de8ec
+		.desc = "This event counts operations that cause a TLB access to at least the L2D TLB.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2I_TLB",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0030,
1de8ec
+		.desc = "This event counts operations that cause a TLB access to at least the L2I TLB.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_CACHE_REFILL_PRF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0049,
1de8ec
+		.desc = "This event counts L1D_CACHE_REFILL caused by software or hardware prefetch.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_REFILL_PRF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0059,
1de8ec
+		.desc = "This event counts L2D_CACHE_REFILL caused by software or hardware prefetch.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LDREX_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x006c,
1de8ec
+		.desc = "This event counts architecturally executed load-exclusive instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "STREX_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x006f,
1de8ec
+		.desc = "This event counts architecturally executed store-exclusive instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0070,
1de8ec
+		.desc = "This event counts architecturally executed memory-reading instructions, as defined by the LD_RETIRED event.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ST_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0071,
1de8ec
+		.desc = "This event counts architecturally executed memory-writing instructions, as defined by the ST_RETIRED event. This event counts DCZVA as a store operation.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LDST_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0072,
1de8ec
+		.desc = "This event counts architecturally executed memory-reading instructions and memory-writing instructions, as defined by the LD_RETIRED and ST_RETIRED events.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "DP_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0073,
1de8ec
+		.desc = "This event counts architecturally executed integer data-processing instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ASE_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0074,
1de8ec
+		.desc = "This event counts architecturally executed Advanced SIMD data-processing instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "VFP_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0075,
1de8ec
+		.desc = "This event counts architecturally executed floating-point data-processing instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "PC_WRITE_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0076,
1de8ec
+		.desc = "This event counts only software changes of the PC that defined by the instruction architecturally executed, condition code check pass and software change of the PC event.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "CRYPTO_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0077,
1de8ec
+		.desc = "This event counts architecturally executed cryptographic instructions, except PMULL and VMULL.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BR_IMMED_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0078,
1de8ec
+		.desc = "This event counts architecturally executed immediate branch instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BR_RETURN_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0079,
1de8ec
+		.desc = "This event counts architecturally executed procedure return operations that defined by the BR_RETURN_RETIRED event.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BR_INDIRECT_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x007a,
1de8ec
+		.desc = "This event counts architecturally executed indirect branch instructions that includes software change of the PC other than exception-generating instructions and immediate branch instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ISB_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x007c,
1de8ec
+		.desc = "This event counts architecturally executed Instruction Synchronization Barrier instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "DSB_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x007d,
1de8ec
+		.desc = "This event counts architecturally executed Data Synchronization Barrier instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "DMB_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x007e,
1de8ec
+		.desc = "This event counts architecturally executed Data Memory Barrier instructions, excluding the implied barrier operations of load/store operations with release consistency semantics.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_UNDEF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0081,
1de8ec
+		.desc = "This event counts only other synchronous exceptions that are taken locally.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_SVC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0082,
1de8ec
+		.desc = "This event counts only Supervisor Call exceptions that are taken locally.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_PABORT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0083,
1de8ec
+		.desc = "This event counts only Instruction Abort exceptions that are taken locally.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_DABORT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0084,
1de8ec
+		.desc = "This event counts only Data Abort or SError interrupt exceptions that are taken locally.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_IRQ",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0086,
1de8ec
+		.desc = "This event counts only IRQ exceptions that are taken locally, including Virtual IRQ exceptions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_FIQ",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0087,
1de8ec
+		.desc = "This event counts only FIQ exceptions that are taken locally, including Virtual FIQ exceptions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_SMC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0088,
1de8ec
+		.desc = "This event counts only Secure Monitor Call exceptions. The counter does not increment on SMC instructions trapped as a Hyp Trap exception.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXC_HVC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x008a,
1de8ec
+		.desc = "This event counts for both Hypervisor Call exceptions taken locally in the hypervisor and those taken as an exception from Non-secure EL1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "DCZVA_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x009f,
1de8ec
+		.desc = "This event counts architecturally executed zero blocking operations due to the 'DC ZVA' instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_MV_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0105,
1de8ec
+		.desc = "This event counts architecturally executed floating-point move operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "PRD_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0108,
1de8ec
+		.desc = "This event counts architecturally executed operations that using predicate register.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "IEL_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0109,
1de8ec
+		.desc = "This event counts architecturally executed inter-element manipulation operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "IREG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x010a,
1de8ec
+		.desc = "This event counts architecturally executed inter-register manipulation operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_LD_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0112,
1de8ec
+		.desc = "This event counts architecturally executed NOSIMD load operations that using SIMD and FP registers.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_ST_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0113,
1de8ec
+		.desc = "This event counts architecturally executed NOSIMD store operations that using SIMD and FP registers.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BC_LD_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x011a,
1de8ec
+		.desc = "This event counts architecturally executed SIMD broadcast floating-point load operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EFFECTIVE_INST_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0121,
1de8ec
+		.desc = "This event counts architecturally executed instructions, excluding the MOVPRFX instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "PRE_INDEX_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0123,
1de8ec
+		.desc = "This event counts architecturally executed operations that uses 'pre-index' as its addressing mode.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "POST_INDEX_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0124,
1de8ec
+		.desc = "This event counts architecturally executed operations that uses 'post-index' as its addressing mode.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "UOP_SPLIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0139,
1de8ec
+		.desc = "This event counts the occurrence count of the micro-operation split.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_L2_MISS",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0180,
1de8ec
+		.desc = "This event counts every cycle that no operation was committed because the oldest and uncommitted load/store operation waits for memory access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_L2_MISS_EX",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0181,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed because the oldest and uncommitted integer load instruction waits for memory access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_L1_MISS",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0182,
1de8ec
+		.desc = "This event counts every cycle that no instruction was committed because the oldest and uncommitted load/store operation waits for L2 cache access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_L1_MISS_EX",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0183,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed because the oldest and uncommitted integer load instruction waits for L2 cache access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0184,
1de8ec
+		.desc = "This event counts every cycle that no instruction was committed because the oldest and uncommitted load/store operation waits for L1D, L2 and memory access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_EX",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0185,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed because the oldest and uncommitted integer load instruction waits for L1D, L2 and memory access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_PFP_BUSY",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0186,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed due to the lack of an available prefetch port.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_PFP_BUSY_EX",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0187,
1de8ec
+		.desc = "This event counts the LD_COMP_WAIT_PFP_BUSY caused by an integer load operation.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "LD_COMP_WAIT_PFP_BUSY_SWPF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0188,
1de8ec
+		.desc = "This event counts the LD_COMP_WAIT_PFP_BUSY caused by a software prefetch instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EU_COMP_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0189,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed, and the oldest and uncommitted instruction is an integer or floating-point instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FL_COMP_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x018a,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed, and the oldest and uncommitted instruction is a floating-point instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BR_COMP_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x018b,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed, and the oldest and uncommitted instruction is a branch instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ROB_EMPTY",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x018c,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed because the CSE is empty.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ROB_EMPTY_STQ_BUSY",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x018d,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed because the CSE is empty and the all store ports are full.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "WFE_WFI_CYCLE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x018e,
1de8ec
+		.desc = "This event counts every cycle that the WFE/WFI instruction brings the instruction unit to a halt.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "0INST_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0190,
1de8ec
+		.desc = "This event counts every cycle that no instructions are committed, but counts at the time when commits MOVPRFX only.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "1INST_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0191,
1de8ec
+		.desc = "This event counts every cycle that one instruction is committed.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "2INST_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0192,
1de8ec
+		.desc = "This event counts every cycle that two instructions are committed.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "3INST_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0193,
1de8ec
+		.desc = "This event counts every cycle that three instructions are committed.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "4INST_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0194,
1de8ec
+		.desc = "This event counts every cycle that four instructions are committed.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "UOP_ONLY_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0198,
1de8ec
+		.desc = "This event counts every cycle that only any micro-operations are committed.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SINGLE_MOVPRFX_COMMIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0199,
1de8ec
+		.desc = "This event counts every cycle that only the MOVPRFX instruction is committed.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EAGA_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a0,
1de8ec
+		.desc = "This event counts valid cycles of EAGA pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EAGB_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a1,
1de8ec
+		.desc = "This event counts valid cycles of EAGB pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXA_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a2,
1de8ec
+		.desc = "This event counts valid cycles of EXA pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EXB_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a3,
1de8ec
+		.desc = "This event counts valid cycles of EXB pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FLA_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a4,
1de8ec
+		.desc = "This event counts valid cycles of FLA pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FLB_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a5,
1de8ec
+		.desc = "This event counts valid cycles of FLB pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "PRX_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01a6,
1de8ec
+		.desc = "This event counts valid cycles of PRX pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FLA_VAL_PRD_CNT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01b4,
1de8ec
+		.desc = "This event counts the number of 1 in the predicate bits of request in FLA pipeline, and corrects itself to be 16 when all bits are 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FLB_VAL_PRD_CNT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01b5,
1de8ec
+		.desc = "This event counts the number of 1 in the predicate bits of request in FLB pipeline, and corrects itself to be 16 when all bits are 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EA_CORE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x01e0,
1de8ec
+		.desc = "This event counts energy consumption per cycle of core.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_CACHE_REFILL_DM",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0200,
1de8ec
+		.desc = "This event counts L1D_CACHE_REFILL caused by demand access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1D_CACHE_REFILL_HWPRF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0202,
1de8ec
+		.desc = "This event counts L1D_CACHE_REFILL caused by hardware prefetch.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_MISS_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0208,
1de8ec
+		.desc = "This event counts outstanding L1D cache miss requests per cycle.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1I_MISS_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0209,
1de8ec
+		.desc = "This event counts outstanding L1I cache miss requests per cycle.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1HWPF_STREAM_PF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0230,
1de8ec
+		.desc = "This event counts streaming prefetch requests to L1D cache generated by hardware prefetcher.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1HWPF_INJ_ALLOC_PF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0231,
1de8ec
+		.desc = "This event counts allocation type prefetch injection requests to L1D cache generated by hardware prefetcher.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1HWPF_INJ_NOALLOC_PF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0232,
1de8ec
+		.desc = "This event counts non-allocation type prefetch injection requests to L1D cache generated by hardware prefetcher.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2HWPF_STREAM_PF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0233,
1de8ec
+		.desc = "This event counts streaming prefetch requests to L2 cache generated by hardware prefecher.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2HWPF_INJ_ALLOC_PF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0234,
1de8ec
+		.desc = "This event counts allocation type prefetch injection requests to L2 cache generated by hardware prefetcher.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2HWPF_INJ_NOALLOC_PF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0235,
1de8ec
+		.desc = "This event counts non-allocation type prefetch injection requests to L2 cache generated by hardware prefetcher.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2HWPF_OTHER",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0236,
1de8ec
+		.desc = "This event counts prefetch requests to L2 cache generated by the other causes.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE0_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0240,
1de8ec
+		.desc = "This event counts valid cycles of L1D cache pipeline#0.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE1_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0241,
1de8ec
+		.desc = "This event counts valid cycles of L1D cache pipeline#1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE0_VAL_IU_TAG_ADRS_SCE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0250,
1de8ec
+		.desc = "This event counts requests in L1D cache pipeline#0 that its sce bit of tagged address is 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE0_VAL_IU_TAG_ADRS_PFE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0251,
1de8ec
+		.desc = "This event counts requests in L1D cache pipeline#0 that its pfe bit of tagged address is 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE1_VAL_IU_TAG_ADRS_SCE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0252,
1de8ec
+		.desc = "This event counts requests in L1D cache pipeline#1 that its sce bit of tagged address is 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE1_VAL_IU_TAG_ADRS_PFE",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0253,
1de8ec
+		.desc = "This event counts requests in L1D cache pipeline#1 that its pfe bit of tagged address is 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE0_COMP",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0260,
1de8ec
+		.desc = "This event counts completed requests in L1D cache pipeline#0.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE1_COMP",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0261,
1de8ec
+		.desc = "This event counts completed requests in L1D cache pipeline#1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1I_PIPE_COMP",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0268,
1de8ec
+		.desc = "This event counts completed requests in L1I cache pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1I_PIPE_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0269,
1de8ec
+		.desc = "This event counts valid cycles of L1I cache pipeline.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE_ABORT_STLD_INTLK",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0274,
1de8ec
+		.desc = "This event counts aborted requests in L1D pipelines that due to store-load interlock.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE0_VAL_IU_NOT_SEC0",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02a0,
1de8ec
+		.desc = "This event counts requests in L1D cache pipeline#0 that its sector cache ID is not 0.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE1_VAL_IU_NOT_SEC0",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02a1,
1de8ec
+		.desc = "This event counts requests in L1D cache pipeline#1 that its sector cache ID is not 0.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE_COMP_GATHER_2FLOW",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02b0,
1de8ec
+		.desc = "This event counts the number of times where 2 elements of the gather instructions became 2flows because 2 elements could not be combined.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE_COMP_GATHER_1FLOW",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02b1,
1de8ec
+		.desc = "This event counts the number of times where 2 elements of the gather instructions became 1flow because 2 elements could be combined.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE_COMP_GATHER_0FLOW",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02b2,
1de8ec
+		.desc = "This event counts the number of times where 2 elements of the gather instructions became 0flow because both predicate values are 0.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE_COMP_SCATTER_1FLOW",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02b3,
1de8ec
+		.desc = "This event counts the number of flows of the scatter instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE0_COMP_PRD_CNT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02b8,
1de8ec
+		.desc = "This event counts the number of 1 in the predicate bits of request in L1D cache pipeline#0, and corrects itself to be 16 when all bits are 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L1_PIPE1_COMP_PRD_CNT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x02b9,
1de8ec
+		.desc = "This event counts the number of 1 in the predicate bits of request in L1D cache pipeline#1, and corrects itself to be 16 when all bits are 1.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_REFILL_DM",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0300,
1de8ec
+		.desc = "This event counts L2D_CACHE_REFILL caused by demand access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_REFILL_HWPRF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0302,
1de8ec
+		.desc = "This event counts L2D_CACHE_REFILL caused by hardware prefetch.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2_MISS_WAIT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0308,
1de8ec
+		.desc = "This event counts outstanding L2 cache miss requests per cycle. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2_MISS_COUNT",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0309,
1de8ec
+		.desc = "This event counts the number of times of L2 cache miss. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_CMG0",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0310,
1de8ec
+		.desc = "This event counts read requests from CMG0 to measured CMG, if measured CMG is not CMG0. Otherwise, this event counts read requests from CMG0 local memory to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_CMG1",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0311,
1de8ec
+		.desc = "This event counts read requests from CMG1 to measured CMG, if measured CMG is not CMG1. Otherwise, this event counts read requests from CMG1 local memory to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_CMG2",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0312,
1de8ec
+		.desc = "This event counts read requests from CMG2 to measured CMG, if measured CMG is not CMG2. Otherwise, this event counts read requests from CMG2 local memory to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_CMG3",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0313,
1de8ec
+		.desc = "This event counts read requests from CMG3 to measured CMG, if measured CMG is not CMG3. Otherwise, this event counts read requests from CMG3 local memory to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_TOFU",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0314,
1de8ec
+		.desc = "This event counts read requests from tofu controller to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_PCI",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0315,
1de8ec
+		.desc = "This event counts read requests from PCI controller to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_READ_TOTAL_MEM",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0316,
1de8ec
+		.desc = "This event counts read requests from measured CMG local memory to measured CMG. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_CMG0",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0318,
1de8ec
+		.desc = "This event counts write requests from measured CMG to CMG0, if measured CMG is not CMG0. Otherwise, this event counts write requests from measured CMG to CMG0 local memory. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_CMG1",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0319,
1de8ec
+		.desc = "This event counts write requests from measured CMG to CMG1, if measured CMG is not CMG1. Otherwise, this event counts write requests from measured CMG to CMG1 local memory. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_CMG2",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x031a,
1de8ec
+		.desc = "This event counts write requests from measured CMG to CMG2, if measured CMG is not CMG2. Otherwise, this event counts write requests from measured CMG to CMG2 local memory. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_CMG3",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x031b,
1de8ec
+		.desc = "This event counts write requests from measured CMG to CMG3, if measured CMG is not CMG3. Otherwise, this event counts write requests from measured CMG to CMG3 local memory. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_TOFU",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x031c,
1de8ec
+		.desc = "This event counts write requests from measured CMG to tofu controller. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_PCI",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x031d,
1de8ec
+		.desc = "This event counts write requests from measured CMG to PCI controller. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BUS_WRITE_TOTAL_MEM",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x031e,
1de8ec
+		.desc = "This event counts write requests from measured CMG to measured CMG local memory. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_SWAP_DM",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0325,
1de8ec
+		.desc = "This event counts operations where demand access hits an L2 cache refill buffer allocated by software or hardware prefetch.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_MIBMCH_PRF",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0326,
1de8ec
+		.desc = "This event counts operations where software or hardware prefetch hits an L2 cache refill buffer allocated by demand access.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2_PIPE_VAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0330,
1de8ec
+		.desc = "This event counts valid cycles of L2 cache pipeline. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2_PIPE_COMP_ALL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0350,
1de8ec
+		.desc = "This event counts completed requests in L2 cache pipeline. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2_PIPE_COMP_PF_L2MIB_MCH",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0370,
1de8ec
+		.desc = "This event counts operations where software or hardware prefetch hits an L2 cache refill buffer allocated by demand access. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "L2D_CACHE_SWAP_LOCAL",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x0396,
1de8ec
+		.desc = "This event counts operations where demand access hits an L2 cache refill buffer allocated by software or hardware prefetch. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EA_L2",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x03e0,
1de8ec
+		.desc = "This event counts energy consumption per cycle of L2 cache. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "EA_MEMORY",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x03e8,
1de8ec
+		.desc = "This event counts energy consumption per cycle of CMG local memory. It counts all events caused in measured CMG regardless of measured PE.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SIMD_INST_RETIRED",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8000,
1de8ec
+		.desc = "This event counts architecturally executed SIMD instructions, excluding the Advanced SIMD scalar instructions and the instructions listed in Non-SIMD SVE instructions section of SVE Reference Manual.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_INST_RETIRED",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8002,
1de8ec
+		.desc = "This event counts architecturally executed Advanced SIMD instructions, including the instructions listed in Non-SIMD SVE instructions section of SVE Reference Manual.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "UOP_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8008,
1de8ec
+		.desc = "This event counts all architecturally executed micro-operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_MATH_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x800e,
1de8ec
+		.desc = "This event counts architecturally executed math function operations due to the SVE FTSMUL, FTMAD, FTSSEL, and FEXPA instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8010,
1de8ec
+		.desc = "This event counts architecturally executed operations due to scalar, Advanced SIMD, and SVE instructions listed in Floating-point instructions section of SVE Reference Manual.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_FMA_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8028,
1de8ec
+		.desc = "This event counts architecturally executed floating-point fused multiply-add and multiply-subtract operations.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_RECPE_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8034,
1de8ec
+		.desc = "This event counts architecturally executed floating-point reciprocal estimate operations due to the Advanced SIMD scalar, Advanced SIMD vector, and SVE FRECPE and FRSQRTE instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_CVT_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8038,
1de8ec
+		.desc = "This event counts architecturally executed floating-point convert operations due to the scalar, Advanced SIMD, and SVE floating-point conversion instructions listed in Floating-point conversions section of SVE Reference Manual.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ASE_SVE_INT_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8043,
1de8ec
+		.desc = "This event counts architecturally executed integer arithmetic operations due to Advanced SIMD and SVE data-processing instructions listed in Integer instructions section of SVE Reference Manual.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_PRED_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8074,
1de8ec
+		.desc = "This event counts architecturally executed SIMD data-processing and load/store operations due to SVE instructions with a Governing predicate operand that determines the Active elements.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_MOVPRFX_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x807c,
1de8ec
+		.desc = "This event counts architecturally executed operations due to MOVPRFX instructions, whether or not they are fused with the prefixed instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_MOVPRFX_U_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x807f,
1de8ec
+		.desc = "This event counts architecturally executed operations due to MOVPRFX instructions that are not fused with the prefixed instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ASE_SVE_LD_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8085,
1de8ec
+		.desc = "This event counts architecturally executed operations that read from memory due to SVE and Advanced SIMD load instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ASE_SVE_ST_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8086,
1de8ec
+		.desc = "This event counts architecturally executed operations that write to memory due to SVE and Advanced SIMD store instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "PRF_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8087,
1de8ec
+		.desc = "This event counts architecturally executed prefetch operations due to scalar PRFM and SVE PRF instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BASE_LD_REG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8089,
1de8ec
+		.desc = "This event counts architecturally executed operations that read from memory due to an instruction that loads a general-purpose register.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "BASE_ST_REG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x808a,
1de8ec
+		.desc = "This event counts architecturally executed operations that write to memory due to an instruction that stores a general-purpose register, excluding the 'DC ZVA' instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_LDR_REG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8091,
1de8ec
+		.desc = "This event counts architecturally executed operations that read from memory due to an SVE LDR instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_STR_REG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8092,
1de8ec
+		.desc = "This event counts architecturally executed operations that write to memory due to an SVE STR instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_LDR_PREG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8095,
1de8ec
+		.desc = "This event counts architecturally executed operations that read from memory due to an SVE LDR (predicate) instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_STR_PREG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x8096,
1de8ec
+		.desc = "This event counts architecturally executed operations that write to memory due to an SVE STR (predicate) instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_PRF_CONTIG_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x809f,
1de8ec
+		.desc = "This event counts architecturally executed operations that prefetch memory due to an SVE predicated single contiguous element prefetch instruction.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ASE_SVE_LD_MULTI_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80a5,
1de8ec
+		.desc = "This event counts architecturally executed operations that read from memory due to SVE and Advanced SIMD multiple vector contiguous structure load instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "ASE_SVE_ST_MULTI_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80a6,
1de8ec
+		.desc = "This event counts architecturally executed operations that write to memory due to SVE and Advanced SIMD multiple vector contiguous structure store instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_LD_GATHER_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80ad,
1de8ec
+		.desc = "This event counts architecturally executed operations that read from memory due to SVE noncontiguous gather-load instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_ST_SCATTER_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80ae,
1de8ec
+		.desc = "This event counts architecturally executed operations that write to memory due to SVE noncontiguous scatter-store instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_PRF_GATHER_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80af,
1de8ec
+		.desc = "This event counts architecturally executed operations that prefetch memory due to SVE noncontiguous gather-prefetch instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "SVE_LDFF_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80bc,
1de8ec
+		.desc = "This event counts architecturally executed memory read operations due to SVE First-fault and Non-fault load instructions.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_SCALE_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c0,
1de8ec
+		.desc = "This event counts architecturally executed SVE arithmetic operations. This event counter is incremented by (128 / CSIZE) and by twice that amount for operations that would also be counted by SVE_FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_FIXED_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c1,
1de8ec
+		.desc = "This event counts architecturally executed v8SIMD and FP arithmetic operations. The event counter is incremented by the specified number of elements for Advanced SIMD operations or by 1 for scalar operations, and by twice those amounts for operations that would also be counted by FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_HP_SCALE_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c2,
1de8ec
+		.desc = "This event counts architecturally executed SVE half-precision arithmetic operations. This event counter is incremented by 8, or by 16 for operations that would also be counted by SVE_FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_HP_FIXED_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c3,
1de8ec
+		.desc = "This event counts architecturally executed v8SIMD and FP half-precision arithmetic operations. This event counter is incremented by the number of 16-bit elements for Advanced SIMD operations, or by 1 for scalar operations, and by twice those amounts for operations that would also be counted by FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_SP_SCALE_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c4,
1de8ec
+		.desc = "This event counts architecturally executed SVE single-precision arithmetic operations. This event counter is incremented by 4, or by 8 for operations that would also be counted by SVE_FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_SP_FIXED_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c5,
1de8ec
+		.desc = "This event counts architecturally executed v8SIMD and FP single-precision arithmetic operations. This event counter is incremented by the number of 32-bit elements for Advanced SIMD operations, or by 1 for scalar operations, and by twice those amounts for operations that would also be counted by FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_DP_SCALE_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c6,
1de8ec
+		.desc = "This event counts architecturally executed SVE double-precision arithmetic operations. This event counter is incremented by 2, or by 4 for operations that would also be counted by SVE_FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+	{
1de8ec
+		.name = "FP_DP_FIXED_OPS_SPEC",
1de8ec
+		.modmsk = ARMV8_ATTRS,
1de8ec
+		.code = 0x80c7,
1de8ec
+		.desc = "This event counts architecturally executed v8SIMD and FP double-precision arithmetic operations. This event counter is incremented by 2 for Advanced SIMD operations, or by 1 for scalar operations, and by twice those amounts for operations that would also be counted by FP_FMA_SPEC.",
1de8ec
+	},
1de8ec
+};
1de8ec
diff --git a/lib/pfmlib_arm_armv8.c b/lib/pfmlib_arm_armv8.c
1de8ec
index a252951..26b3f8c 100644
1de8ec
--- a/lib/pfmlib_arm_armv8.c
1de8ec
+++ b/lib/pfmlib_arm_armv8.c
1de8ec
@@ -35,6 +35,7 @@
1de8ec
 #include "events/arm_xgene_events.h"         /* Applied Micro X-Gene tables */
1de8ec
 #include "events/arm_cavium_tx2_events.h"    	/* Marvell ThunderX2 tables */
1de8ec
 #include "events/arm_marvell_tx2_unc_events.h" 	/* Marvell ThunderX2 PMU tables */
1de8ec
+#include "events/arm_fujitsu_a64fx_events.h"	/* Fujitsu A64FX PMU tables */
1de8ec
 
1de8ec
 static int
1de8ec
 pfm_arm_detect_cortex_a57(void *this)
1de8ec
@@ -104,6 +105,22 @@ pfm_arm_detect_thunderx2(void *this)
1de8ec
 	return PFM_ERR_NOTSUPP;
1de8ec
 }
1de8ec
 
1de8ec
+static int
1de8ec
+pfm_arm_detect_a64fx(void *this)
1de8ec
+{
1de8ec
+	int ret;
1de8ec
+
1de8ec
+	ret = pfm_arm_detect(this);
1de8ec
+	if (ret != PFM_SUCCESS)
1de8ec
+		return PFM_ERR_NOTSUPP;
1de8ec
+
1de8ec
+	if ((pfm_arm_cfg.implementer == 0x46) && /* Fujitsu */
1de8ec
+		(pfm_arm_cfg.part == 0x001)) { /* a64fx */
1de8ec
+			return PFM_SUCCESS;
1de8ec
+	}
1de8ec
+	return PFM_ERR_NOTSUPP;
1de8ec
+}
1de8ec
+
1de8ec
 /* ARM Cortex A57 support */
1de8ec
 pfmlib_pmu_t arm_cortex_a57_support={
1de8ec
 	.desc			= "ARM Cortex A57",
1de8ec
@@ -204,6 +221,31 @@ pfmlib_pmu_t arm_thunderx2_support={
1de8ec
 	.get_event_nattrs	= pfm_arm_get_event_nattrs,
1de8ec
 };
1de8ec
 
1de8ec
+/* Fujitsu A64FX support */
1de8ec
+pfmlib_pmu_t arm_fujitsu_a64fx_support={
1de8ec
+	.desc			= "Fujitsu A64FX",
1de8ec
+	.name			= "arm_a64fx",
1de8ec
+	.pmu			= PFM_PMU_ARM_A64FX,
1de8ec
+	.pme_count		= LIBPFM_ARRAY_SIZE(arm_a64fx_pe),
1de8ec
+	.type			= PFM_PMU_TYPE_CORE,
1de8ec
+	.pe			= arm_a64fx_pe,
1de8ec
+
1de8ec
+	.pmu_detect		= pfm_arm_detect_a64fx,
1de8ec
+	.max_encoding		= 1,
1de8ec
+	.num_cntrs		= 6,
1de8ec
+
1de8ec
+	.get_event_encoding[PFM_OS_NONE] = pfm_arm_get_encoding,
1de8ec
+	 PFMLIB_ENCODE_PERF(pfm_arm_get_perf_encoding),
1de8ec
+	.get_event_first	= pfm_arm_get_event_first,
1de8ec
+	.get_event_next		= pfm_arm_get_event_next,
1de8ec
+	.event_is_valid		= pfm_arm_event_is_valid,
1de8ec
+	.validate_table		= pfm_arm_validate_table,
1de8ec
+	.get_event_info		= pfm_arm_get_event_info,
1de8ec
+	.get_event_attr_info	= pfm_arm_get_event_attr_info,
1de8ec
+	 PFMLIB_VALID_PERF_PATTRS(pfm_arm_perf_validate_pattrs),
1de8ec
+	.get_event_nattrs	= pfm_arm_get_event_nattrs,
1de8ec
+};
1de8ec
+
1de8ec
 // For uncore, each socket has a separate perf name, otherwise they are the same, use macro
1de8ec
 
1de8ec
 #define DEFINE_TX2_DMC(n) \
1de8ec
diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c
1de8ec
index 335155e..102db37 100644
1de8ec
--- a/lib/pfmlib_common.c
1de8ec
+++ b/lib/pfmlib_common.c
1de8ec
@@ -494,6 +494,7 @@ static pfmlib_pmu_t *pfmlib_pmus[]=
1de8ec
 	&arm_thunderx2_llc1_support,
1de8ec
 	&arm_thunderx2_ccpi0_support,
1de8ec
 	&arm_thunderx2_ccpi1_support,
1de8ec
+	&arm_fujitsu_a64fx_support,
1de8ec
 #endif
1de8ec
 #ifdef CONFIG_PFMLIB_ARCH_ARM64
1de8ec
 	&arm_cortex_a57_support,
1de8ec
@@ -506,6 +507,7 @@ static pfmlib_pmu_t *pfmlib_pmus[]=
1de8ec
 	&arm_thunderx2_llc1_support,
1de8ec
 	&arm_thunderx2_ccpi0_support,
1de8ec
 	&arm_thunderx2_ccpi1_support,
1de8ec
+	&arm_fujitsu_a64fx_support,
1de8ec
 #endif
1de8ec
 
1de8ec
 #ifdef CONFIG_PFMLIB_ARCH_S390X
1de8ec
diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h
1de8ec
index 845a13e..237e8d6 100644
1de8ec
--- a/lib/pfmlib_priv.h
1de8ec
+++ b/lib/pfmlib_priv.h
1de8ec
@@ -662,6 +662,8 @@ extern pfmlib_pmu_t arm_thunderx2_llc1_support;
1de8ec
 extern pfmlib_pmu_t arm_thunderx2_ccpi0_support;
1de8ec
 extern pfmlib_pmu_t arm_thunderx2_ccpi1_support;
1de8ec
 
1de8ec
+extern pfmlib_pmu_t arm_fujitsu_a64fx_support;
1de8ec
+
1de8ec
 extern pfmlib_pmu_t mips_74k_support;
1de8ec
 extern pfmlib_pmu_t s390x_cpum_cf_support;
1de8ec
 extern pfmlib_pmu_t s390x_cpum_sf_support;
1de8ec
diff --git a/tests/validate_arm64.c b/tests/validate_arm64.c
1de8ec
index 5cb1966..96060bb 100644
1de8ec
--- a/tests/validate_arm64.c
1de8ec
+++ b/tests/validate_arm64.c
1de8ec
@@ -198,6 +198,27 @@ static const test_event_t arm64_test_events[]={
1de8ec
 	  .codes[0] = 0xd,
1de8ec
 	  .fstr = "tx2_llc0::UNC_LLC_READ",
1de8ec
 	},
1de8ec
+	{ SRC_LINE,
1de8ec
+	  .name = "arm_a64fx::CPU_CYCLES",
1de8ec
+	  .ret  = PFM_SUCCESS,
1de8ec
+	  .count = 1,
1de8ec
+	  .codes[0] = 0x8000011,
1de8ec
+	  .fstr = "arm_a64fx::CPU_CYCLES:k=1:u=1:hv=0",
1de8ec
+	},
1de8ec
+	{ SRC_LINE,
1de8ec
+	  .name = "arm_a64fx::CPU_CYCLES:k",
1de8ec
+	  .ret  = PFM_SUCCESS,
1de8ec
+	  .count = 1,
1de8ec
+	  .codes[0] = 0x88000011,
1de8ec
+	  .fstr = "arm_a64fx::CPU_CYCLES:k=1:u=0:hv=0",
1de8ec
+	},
1de8ec
+	{ SRC_LINE,
1de8ec
+	  .name = "arm_a64fx::INST_RETIRED",
1de8ec
+	  .ret  = PFM_SUCCESS,
1de8ec
+	  .count = 1,
1de8ec
+	  .codes[0] = 0x8000008,
1de8ec
+	  .fstr = "arm_a64fx::INST_RETIRED:k=1:u=1:hv=0",
1de8ec
+	},
1de8ec
 };
1de8ec
 #define NUM_TEST_EVENTS (int)(sizeof(arm64_test_events)/sizeof(test_event_t))
1de8ec
 
1de8ec
commit dfe30a72c18dc64ea8e55c469a9adcfec9c09340
1de8ec
Author: Stephane Eranian <eranian@gmail.com>
1de8ec
Date:   Wed Sep 23 16:53:53 2020 -0700
1de8ec
1de8ec
    install Fujitsu A64FX man page in ARM64 mode
1de8ec
    
1de8ec
    This patch corrects the documentation Makefile to install
1de8ec
    the libpfm_a64fx.3 man page when bulding for ARM64. Otherwise
1de8ec
    the man page woul only be installed in ARM (32-bit) mode.
1de8ec
    
1de8ec
    Reported-by: William Cohen <wcohen@redhat.com>
1de8ec
    Signed-off-by: Stephane Eranian <eranian@gmail.com>
1de8ec
1de8ec
diff --git a/docs/Makefile b/docs/Makefile
1de8ec
index f8beebc..f5c0935 100644
1de8ec
--- a/docs/Makefile
1de8ec
+++ b/docs/Makefile
1de8ec
@@ -131,6 +131,7 @@ ifeq ($(CONFIG_PFMLIB_ARCH_ARM64),y)
1de8ec
 ARCH_MAN += libpfm_arm_xgene.3 \
1de8ec
 	    libpfm_arm_ac57.3 \
1de8ec
-	    libpfm_arm_ac53.3
1de8ec
+	    libpfm_arm_ac53.3 \
1de8ec
+	    libpfm_arm_a64fx.3
1de8ec
 endif
1de8ec
 
1de8ec
 ifeq ($(CONFIG_PFMLIB_ARCH_MIPS),y)
1de8ec
commit f6500e77563e606c8510ff26f57d321328bd8157
1de8ec
Author: Masahiko, Yamada <yamada.masahiko@fujitsu.com>
1de8ec
Date:   Wed Jan 27 20:12:59 2021 +0900
1de8ec
1de8ec
    Changing the number of PMU counters and deleting the ARM(32-bit) mode for A64FX
1de8ec
    
1de8ec
    The current libpfm4 implementation treats PMCR_EL0.N = 0x6 like other ARM Reference processors.
1de8ec
    On an A64FX, PMCR_EL0.N = 0x8 (The number of PMU counters is 8.).
1de8ec
    Therefore, only 6 counters are available in the current implementation.
1de8ec
    The A64FX core also supports the AArch64 state and the A64 Instruction set.
1de8ec
    The AArch32 state and the A32, T32 Instruction set are not supported and cannot be transitioned to this Execution state.
1de8ec
    Currently, the libpfm manual(docs/man3/libpfm_arm_a64fx.3) states that A32/A64 can be used, but A32 cannot be used.
1de8ec
    
1de8ec
    I have created a patch with the above fixes, so please review and merge it.
1de8ec
    
1de8ec
    Originally, the specification of the A64FX which Fujitsu published should have described the above two points,
1de8ec
    but the description was omitted.
1de8ec
    A64FX Specification HPC Extension v1.1 will add:.
1de8ec
    - On a A64FX, PMCR_EL0.N = 0x8 (The number of PMU counters is 8.).
1de8ec
    - A64FX does not support the AArch32 state and the A32, T32 Instruction set and cannot transition to this Execution state.
1de8ec
1de8ec
diff --git a/docs/Makefile b/docs/Makefile
1de8ec
index f5c0935..e124747 100644
1de8ec
--- a/docs/Makefile
1de8ec
+++ b/docs/Makefile
1de8ec
@@ -123,8 +123,7 @@ ARCH_MAN += libpfm_arm_xgene.3 \
1de8ec
 	    libpfm_arm_ac15.3 \
1de8ec
 	    libpfm_arm_ac8.3 \
1de8ec
 	    libpfm_arm_ac9.3 \
1de8ec
-	    libpfm_arm_qcom_krait.3 \
1de8ec
-	    libpfm_arm_a64fx.3
1de8ec
+	    libpfm_arm_qcom_krait.3
1de8ec
 endif
1de8ec
 
1de8ec
 ifeq ($(CONFIG_PFMLIB_ARCH_ARM64),y)
1de8ec
diff --git a/docs/man3/libpfm_arm_a64fx.3 b/docs/man3/libpfm_arm_a64fx.3
1de8ec
index 6214eb7..587eea6 100644
1de8ec
--- a/docs/man3/libpfm_arm_a64fx.3
1de8ec
+++ b/docs/man3/libpfm_arm_a64fx.3
1de8ec
@@ -11,8 +11,8 @@ libpfm_arm_a64fx - support for Fujitsu A64FX PMU
1de8ec
 .SH DESCRIPTION
1de8ec
 The library supports the Fujitsu A64FX core PMU.
1de8ec
 
1de8ec
-This PMU supports 6 counters and privilege levels filtering.
1de8ec
-It can operate in both 32 and 64 bit modes.
1de8ec
+This PMU supports 8 counters and privilege levels filtering.
1de8ec
+It can operate in 64 bit mode only.
1de8ec
 
1de8ec
 .SH MODIFIERS
1de8ec
 The following modifiers are supported on Fujitsu A64FX:
1de8ec
diff --git a/lib/Makefile b/lib/Makefile
1de8ec
index 483e0e1..7afe411 100644
1de8ec
--- a/lib/Makefile
1de8ec
+++ b/lib/Makefile
1de8ec
@@ -371,7 +371,8 @@ INC_ARM64=events/arm_cortex_a57_events.h	\
1de8ec
 INC_ARM64=events/arm_cortex_a57_events.h	\
1de8ec
 	events/arm_cortex_a53_events.h	\
1de8ec
 	events/arm_cavium_tx2_events.h	\
1de8ec
-	events/arm_marvell_tx2_unc_events.h
1de8ec
+ 	events/arm_marvell_tx2_unc_events.h	\
1de8ec
+	events/arm_fujitsu_a64fx_events.h	\
1de8ec
 
1de8ec
 INCDEP=$(INC_COMMON) $(INCARCH)
1de8ec
 
1de8ec
diff --git a/lib/pfmlib_arm_armv8.c b/lib/pfmlib_arm_armv8.c
1de8ec
index e147d6c..00e2e3f 100644
1de8ec
--- a/lib/pfmlib_arm_armv8.c
1de8ec
+++ b/lib/pfmlib_arm_armv8.c
1de8ec
@@ -254,7 +254,7 @@ pfmlib_pmu_t arm_fujitsu_a64fx_support={
1de8ec
 
1de8ec
 	.pmu_detect		= pfm_arm_detect_a64fx,
1de8ec
 	.max_encoding		= 1,
1de8ec
-	.num_cntrs		= 6,
1de8ec
+	.num_cntrs		= 8,
1de8ec
 
1de8ec
 	.get_event_encoding[PFM_OS_NONE] = pfm_arm_get_encoding,
1de8ec
 	 PFMLIB_ENCODE_PERF(pfm_arm_get_perf_encoding),