Blame SOURCES/libpfm-tx2.patch

959ff9
commit 6c9e44b95a55b8bf62cbd64009c4c9b30964a66c
959ff9
Author: Steve Walk <steve.walk@cavium.com>
959ff9
Date:   Tue Mar 20 09:37:56 2018 -0700
959ff9
959ff9
    update Cavium ThunderX2 with now public events
959ff9
    
959ff9
    This patch adds new model specific events to the
959ff9
    Cavium Thunder X2 core PMU. The updated list is based
959ff9
    on publicly available documentation from Cavium which
959ff9
    is available at:
959ff9
        https://cavium.com/resources.html
959ff9
    
959ff9
    Signed-off-by: Steve Walk  <steve.walk@cavium.com>
959ff9
959ff9
diff --git a/lib/events/arm_cavium_tx2_events.h b/lib/events/arm_cavium_tx2_events.h
959ff9
index 67de9f8..198d33d 100644
959ff9
--- a/lib/events/arm_cavium_tx2_events.h
959ff9
+++ b/lib/events/arm_cavium_tx2_events.h
959ff9
@@ -23,6 +23,9 @@
959ff9
  *
959ff9
  * ARM Architecture Reference Manual, ARMv8, for ARMv8-A architecture profile,
959ff9
  * ARM DDI 0487B.a (ID033117)
959ff9
+ *
959ff9
+ * Cavium ThunderX2 C99XX PMU Events (Abridged), July 31, 2018
959ff9
+ * https://cavium.com/resources.html
959ff9
  */
959ff9
 
959ff9
 static const arm_entry_t arm_thunderx2_pe[]={
959ff9
@@ -161,6 +164,11 @@ static const arm_entry_t arm_thunderx2_pe[]={
959ff9
 	 .code = 0x1C,
959ff9
 	 .desc = "Instruction architecturally executed (condition check pass)  Write to translation table base"
959ff9
 	},
959ff9
+	{.name = "CHAIN",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x1E,
959ff9
+	 .desc = "For odd-numbered counters, increments the count by one for each overflow of the proceeding even counter"
959ff9
+	},
959ff9
 	{.name = "L1D_CACHE_ALLOCATE",
959ff9
 	 .modmsk = ARMV8_ATTRS,
959ff9
 	 .code = 0x1F,
959ff9
@@ -556,6 +564,274 @@ static const arm_entry_t arm_thunderx2_pe[]={
959ff9
 	 .code = 0x91,
959ff9
 	 .desc = "Release consistency instruction speculatively executed (store-release)"
959ff9
 	},
959ff9
-
959ff9
-	/* END Cavium ThunderX2 specific events */
959ff9
+	{.name = "L1D_LHS_VANOTP",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC1,
959ff9
+	 .desc = "A Load hit store retry"
959ff9
+	},
959ff9
+	{.name = "L1D_LHS_OVRLAP",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC2,
959ff9
+	 .desc = "A Load hit store retry, VA match, PA mismatch"
959ff9
+	},
959ff9
+	{.name = "L1D_LHS_VANOSD",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC3,
959ff9
+	 .desc = "A Load hit store retry, VA match, store data not issued"
959ff9
+	},
959ff9
+	{.name = "L1D_LHS_FWD",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC4,
959ff9
+	 .desc = "A Load hit store forwarding. Load completes"
959ff9
+	},
959ff9
+	{.name = "L1D_BNKCFL",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC6,
959ff9
+	 .desc = "Bank conflict load retry"
959ff9
+	},
959ff9
+	{.name = "L1D_LSMQ_FULL",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC7,
959ff9
+	 .desc = "LSMQ retry"
959ff9
+	},
959ff9
+	{.name = "L1D_LSMQ_HIT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC8,
959ff9
+	 .desc = "LSMQ hit retry"
959ff9
+	},
959ff9
+	{.name = "L1D_EXPB_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xC9,
959ff9
+	 .desc = "An external probe missed the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_L2EV_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xCA,
959ff9
+	 .desc = "An L2 evict operation missed the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_EXPB_HITM",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xCB,
959ff9
+	 .desc = "An external probe hit a modified line in the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_L2EV_HITM",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xCC,
959ff9
+	 .desc = "An L2 evict operation hit a modified line in the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_EXPB_HIT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xCD,
959ff9
+	 .desc = "An external probe hit in the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_L2EV_HIT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xCE,
959ff9
+	 .desc = "An L2 evict operation hit in the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_EXPB_RETRY",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xCF,
959ff9
+	 .desc = "An external probe hit was retried"
959ff9
+	},
959ff9
+	{.name = "L1D_L2EV_RETRY",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD0,
959ff9
+	 .desc = "An L2 evict operation was retried"
959ff9
+	},
959ff9
+	{.name = "L1D_ST_RMW",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD1,
959ff9
+	 .desc = "A read modify write store was drained and updated the L1"
959ff9
+	},
959ff9
+	{.name = "L1D_LSMQ00_LDREQ",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD2,
959ff9
+	 .desc = "A load has allocated LSMQ entry 0"
959ff9
+	},
959ff9
+	{.name = "L1D_LSMQ00_LDVLD",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD3,
959ff9
+	 .desc = "LSMQ entry 0 was initiated by a load"
959ff9
+	},
959ff9
+	{.name = "L1D_LSMQ15_STREQ",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD4,
959ff9
+	 .desc = "A store was allocated LSMQ entry 15"
959ff9
+	},
959ff9
+	{.name = "L1D_LSMQ15_STVLD",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD5,
959ff9
+	 .desc = "LSMQ entry 15 was initiated by a store"
959ff9
+	},
959ff9
+	{.name = "L1D_PB_FLUSH",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xD6,
959ff9
+	 .desc = "LRQ ordering flush"
959ff9
+	},
959ff9
+	{.name = "BR_COND_MIS_PRED_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xE0,
959ff9
+	 .desc = "Conditional branch instruction executed, but mis-predicted"
959ff9
+	},
959ff9
+	{.name = "BR_IND_MIS_PRED_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xE1,
959ff9
+	 .desc = "Indirect branch instruction executed, but mis-predicted"
959ff9
+	},
959ff9
+	{.name = "BR_RETURN_MIS_PRED_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xE2,
959ff9
+	 .desc = "Return branch instruction executed, but mis-predicted"
959ff9
+	},
959ff9
+	{.name = "OP_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xE8,
959ff9
+	 .desc = "Uops executed"
959ff9
+	},
959ff9
+	{.name = "LD_OP_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xE9,
959ff9
+	 .desc = "Load uops executed"
959ff9
+	},
959ff9
+	{.name = "ST_OP_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xEA,
959ff9
+	 .desc = "Store uops executed"
959ff9
+	},
959ff9
+	{.name = "FUSED_OP_RETIRED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xEB,
959ff9
+	 .desc = "Fused uops executed"
959ff9
+	},
959ff9
+	{.name = "IRQ_MASK",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xF8,
959ff9
+	 .desc = "Cumulative duration of a PSTATE.I interrupt mask set to 1"
959ff9
+	},
959ff9
+	{.name = "FIQ_MASK",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xF9,
959ff9
+	 .desc = "Cumulative duration of a PSTATE.F interrupt mask set to 1"
959ff9
+	},
959ff9
+	{.name = "SERROR_MASK",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0xFA,
959ff9
+	 .desc = "Cumulative duration of PSTATE.A interrupt mask set to 1"
959ff9
+	},
959ff9
+	{.name = "WFIWFE_SLEEP",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x108,
959ff9
+	 .desc = "Number of cycles in which CPU is in low power mode due to WFI/WFE instruction"
959ff9
+	},
959ff9
+	{.name = "L2TLB_4K_PAGE_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x127,
959ff9
+	 .desc = "L2 TLB lookup miss using 4K page size"
959ff9
+	},
959ff9
+	{.name = "L2TLB_64K_PAGE_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x128,
959ff9
+	 .desc = "L2 TLB lookup miss using 64K page size"
959ff9
+	},
959ff9
+	{.name = "L2TLB_2M_PAGE_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x129,
959ff9
+	 .desc = "L2 TLB lookup miss using 2M page size"
959ff9
+	},
959ff9
+	{.name = "L2TLB_512M_PAGE_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x12A,
959ff9
+	 .desc = "L2 TLB lookup miss using 512M page size"
959ff9
+	},
959ff9
+	{.name = "ISB_EMPTY",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x150,
959ff9
+	 .desc = "Number of cycles during which micro-op skid-buffer is empty"
959ff9
+	},
959ff9
+	{.name = "ISB_FULL",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x151,
959ff9
+	 .desc = "Number of cycles during which micro-op skid-buffer is back-pressuring decode"
959ff9
+	},
959ff9
+	{.name = "STALL_NOTSELECTED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x152,
959ff9
+	 .desc = "Number of cycles during which thread was available for dispatch but not selected"
959ff9
+	},
959ff9
+	{.name = "ROB_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x153,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to ROB full"
959ff9
+	},
959ff9
+	{.name = "ISSQ_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x154,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to ISSQ full"
959ff9
+	},
959ff9
+	{.name = "GPR_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x155,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to GPR full"
959ff9
+	},
959ff9
+	{.name = "FPR_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x156,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to FPR full"
959ff9
+	},
959ff9
+	{.name = "LRQ_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x158,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to LRQ full"
959ff9
+	},
959ff9
+	{.name = "SRQ_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x159,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to SRQ full"
959ff9
+	},
959ff9
+	{.name = "BSR_RECYCLE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x15B,
959ff9
+	 .desc = "Number of cycles in which one or more valid micro-ops did not dispatch due to BSR full"
959ff9
+	},
959ff9
+	{.name = "UOPSFUSED",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x164,
959ff9
+	 .desc = "Number of fused micro-ops dispatched"
959ff9
+	},
959ff9
+	{.name = "L2D_TLBI_INT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x20B,
959ff9
+	 .desc = "Internal mmu tlbi cacheops"
959ff9
+	},
959ff9
+	{.name = "L2D_TLBI_EXT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x20C,
959ff9
+	 .desc = "External mmu tlbi cacheops"
959ff9
+	},
959ff9
+	{.name = "L2D_HWPF_DMD_HIT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x218,
959ff9
+	 .desc = "Scu ld/st requests that hit cache or msg for lines brought in by the hardware prefetcher"
959ff9
+	},
959ff9
+	{.name = "L2D_HWPF_REQ_VAL",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x219,
959ff9
+	 .desc = "Scu hwpf requests into the pipeline"
959ff9
+	},
959ff9
+	{.name = "L2D_HWPF_REQ_LD",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x21A,
959ff9
+	 .desc = "Scu hwpf ld requests into the pipeline"
959ff9
+	},
959ff9
+	{.name = "L2D_HWPF_REQ_MISS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x21B,
959ff9
+	 .desc = "Scu hwpf ld requests that miss"
959ff9
+	},
959ff9
+	{.name = "L2D_HWPF_NEXT_LINE",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = 0x21C,
959ff9
+	 .desc = "Scu hwpf next line requests generated"
959ff9
+	},
959ff9
 };
959ff9
From 0b050ca9ba2a2bf74f87fa3a8b4ed8aec9d1dfa8 Mon Sep 17 00:00:00 2001
959ff9
From: Shay Gal-On <sgalon@marvell.com>
959ff9
Date: Wed, 23 Oct 2019 18:58:03 -0700
959ff9
Subject: [PATCH 1/4] ThunderX2 uncore support
959ff9
959ff9
This patch adds ThundeX2 uncore PMUs support.
959ff9
959ff9
The following uncore PMUs are added:
959ff9
- tx2_llc0, tx2_llc1 (last level cache)
959ff9
- tx2_dmc0, tx2_dmc1 (memory controller)
959ff9
959ff9
Based on documentation available at:
959ff9
https://www.marvell.com/documents/hrur6mybdvk5uki1w0z7/
959ff9
959ff9
Signed-off-by: Shay Gal-On <sgalon@marvell.com>
959ff9
---
959ff9
 include/perfmon/pfmlib.h           |   5 ++
959ff9
 lib/Makefile                       |   2 +-
959ff9
 lib/events/arm_cavium_tx2_events.h |  61 +++++++++++++
959ff9
 lib/pfmlib_arm_armv8.c             |  55 ++++++++++++
959ff9
 lib/pfmlib_common.c                |   4 +
959ff9
 lib/pfmlib_priv.h                  |   6 ++
959ff9
 lib/pfmlib_tx2_unc_perf_event.c    | 139 +++++++++++++++++++++++++++++
959ff9
 tests/validate_arm64.c             |   6 ++
959ff9
 8 files changed, 277 insertions(+), 1 deletion(-)
959ff9
 create mode 100644 lib/pfmlib_tx2_unc_perf_event.c
959ff9
959ff9
diff --git a/include/perfmon/pfmlib.h b/include/perfmon/pfmlib.h
959ff9
index 09c673d..20d5feb 100644
959ff9
--- a/include/perfmon/pfmlib.h
959ff9
+++ b/include/perfmon/pfmlib.h
959ff9
@@ -546,6 +546,11 @@ typedef enum {
959ff9
 	PFM_PMU_INTEL_KNM_UNC_UBOX,	/* Intel Knights Mill Ubox uncore */
959ff9
 	PFM_PMU_INTEL_KNM_UNC_M2PCIE,	/* Intel Knights Mill M2PCIe uncore */
959ff9
 	PFM_PMU_ARM_THUNDERX2,		/* Cavium ThunderX2 */
959ff9
+
959ff9
+	PFM_PMU_ARM_THUNDERX2_DMC0,	/* Cavium ThunderX2 DMC unit 0 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_DMC1,	/* Cavium ThunderX2 DMC unit 1 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_LLC0,	/* Cavium ThunderX2 LLC unit 0 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_LLC1,	/* Cavium ThunderX2 LLC unit 1 uncore */
959ff9
 	/* MUST ADD NEW PMU MODELS HERE */
959ff9
 
959ff9
 	PFM_PMU_MAX			/* end marker */
959ff9
diff --git a/lib/Makefile b/lib/Makefile
959ff9
index 2eb3ebb..f45515d 100644
959ff9
--- a/lib/Makefile
959ff9
+++ b/lib/Makefile
959ff9
@@ -188,7 +188,7 @@ SRCS += pfmlib_arm_perf_event.c
959ff9
 endif
959ff9
 
959ff9
 INCARCH = $(INC_ARM64)
959ff9
-SRCS   += pfmlib_arm.c pfmlib_arm_armv8.c
959ff9
+SRCS   += pfmlib_arm.c pfmlib_arm_armv8.c pfmlib_tx2_unc_perf_event.c
959ff9
 CFLAGS += -DCONFIG_PFMLIB_ARCH_ARM64
959ff9
 endif
959ff9
 
959ff9
diff --git a/lib/events/arm_cavium_tx2_events.h b/lib/events/arm_cavium_tx2_events.h
959ff9
index 198d33d..18d8931 100644
959ff9
--- a/lib/events/arm_cavium_tx2_events.h
959ff9
+++ b/lib/events/arm_cavium_tx2_events.h
959ff9
@@ -835,3 +835,64 @@ static const arm_entry_t arm_thunderx2_pe[]={
959ff9
 	 .desc = "Scu hwpf next line requests generated"
959ff9
 	},
959ff9
 };
959ff9
+
959ff9
+#define ARM_TX2_CORE_EVENT_COUNT	(sizeof(arm_thunderx2_pe)/sizeof(arm_entry_t))
959ff9
+
959ff9
+/* L3C event IDs */
959ff9
+#define L3_EVENT_READ_REQ               0xD
959ff9
+#define L3_EVENT_WRITEBACK_REQ          0xE
959ff9
+#define L3_EVENT_EVICT_REQ              0x13
959ff9
+#define L3_EVENT_READ_HIT               0x17
959ff9
+#define L3_EVENT_MAX                    0x18
959ff9
+
959ff9
+/* DMC event IDs */
959ff9
+#define DMC_EVENT_COUNT_CYCLES          0x1
959ff9
+#define DMC_EVENT_WRITE_TXNS            0xB
959ff9
+#define DMC_EVENT_DATA_TRANSFERS        0xD
959ff9
+#define DMC_EVENT_READ_TXNS             0xF
959ff9
+#define DMC_EVENT_MAX                   0x10
959ff9
+
959ff9
+static const arm_entry_t arm_thunderx2_unc_dmc_pe[]={
959ff9
+	{.name = "UNC_DMC_READS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = DMC_EVENT_READ_TXNS,
959ff9
+	 .desc = "Memory read transactions"
959ff9
+	},
959ff9
+	{.name = "UNC_DMC_WRITES",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = DMC_EVENT_WRITE_TXNS,
959ff9
+	 .desc = "Memory write transactions"
959ff9
+	},
959ff9
+};
959ff9
+
959ff9
+#define ARM_TX2_CORE_DMC_COUNT	(sizeof(arm_thunderx2_unc_dmc_pe)/sizeof(arm_entry_t))
959ff9
+
959ff9
+static const arm_entry_t arm_thunderx2_unc_llc_pe[]={
959ff9
+	{.name = "UNC_LLC_READ",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_READ_REQ,
959ff9
+	 .desc = "Read requests to LLC"
959ff9
+	},
959ff9
+	{.name = "UNC_LLC_EVICT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_EVICT_REQ,
959ff9
+	 .desc = "Evict requests to LLC"
959ff9
+	},
959ff9
+	{.name = "UNC_LLC_READ_HIT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_READ_HIT,
959ff9
+	 .desc = "Read requests to LLC which hit"
959ff9
+	},
959ff9
+	{.name = "UNC_LLC_WB",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_WRITEBACK_REQ,
959ff9
+	 .desc = "Writeback requests to LLC"
959ff9
+	}
959ff9
+};
959ff9
+
959ff9
+#define ARM_TX2_CORE_LLC_COUNT	(sizeof(arm_thunderx2_unc_llc_pe)/sizeof(arm_entry_t))
959ff9
+//Uncore accessor functions
959ff9
+int
959ff9
+pfm_tx2_unc_get_event_encoding(void *this, pfmlib_event_desc_t *e);
959ff9
+int
959ff9
+pfm_tx2_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e);
959ff9
diff --git a/lib/pfmlib_arm_armv8.c b/lib/pfmlib_arm_armv8.c
959ff9
index 0a3313f..35ff70f 100644
959ff9
--- a/lib/pfmlib_arm_armv8.c
959ff9
+++ b/lib/pfmlib_arm_armv8.c
959ff9
@@ -203,3 +203,58 @@ pfmlib_pmu_t arm_thunderx2_support={
959ff9
 	.get_event_nattrs	= pfm_arm_get_event_nattrs,
959ff9
 };
959ff9
 
959ff9
+// For uncore, each socket has a separate perf name, otherwise they are the same, use macro
959ff9
+
959ff9
+#define DEFINE_TX2_DMC(n) \
959ff9
+pfmlib_pmu_t arm_thunderx2_dmc##n##_support={ \
959ff9
+	.desc			= "Cavium ThunderX2 Node"#n" DMC", \
959ff9
+	.name			= "tx2_dmc"#n, \
959ff9
+	.perf_name		= "uncore_dmc_"#n, \
959ff9
+	.pmu			= PFM_PMU_ARM_THUNDERX2_DMC##n, \
959ff9
+	.pme_count		= LIBPFM_ARRAY_SIZE(arm_thunderx2_unc_dmc_pe), \
959ff9
+	.type			= PFM_PMU_TYPE_UNCORE, \
959ff9
+	.pe			= arm_thunderx2_unc_dmc_pe, \
959ff9
+	.pmu_detect		= pfm_arm_detect_thunderx2, \
959ff9
+	.max_encoding		= 1, \
959ff9
+	.num_cntrs		= 4, \
959ff9
+	.get_event_encoding[PFM_OS_NONE] = pfm_tx2_unc_get_event_encoding, \
959ff9
+	 PFMLIB_ENCODE_PERF(pfm_tx2_unc_get_perf_encoding),		\
959ff9
+	.get_event_first	= pfm_arm_get_event_first, \
959ff9
+	.get_event_next		= pfm_arm_get_event_next,  \
959ff9
+	.event_is_valid		= pfm_arm_event_is_valid,  \
959ff9
+	.validate_table		= pfm_arm_validate_table,  \
959ff9
+	.get_event_info		= pfm_arm_get_event_info,  \
959ff9
+	.get_event_attr_info	= pfm_arm_get_event_attr_info,	\
959ff9
+	 PFMLIB_VALID_PERF_PATTRS(pfm_arm_perf_validate_pattrs),\
959ff9
+	.get_event_nattrs	= pfm_arm_get_event_nattrs, \
959ff9
+};
959ff9
+
959ff9
+DEFINE_TX2_DMC(0);
959ff9
+DEFINE_TX2_DMC(1);
959ff9
+
959ff9
+#define DEFINE_TX2_LLC(n) \
959ff9
+pfmlib_pmu_t arm_thunderx2_llc##n##_support={ \
959ff9
+	.desc			= "Cavium ThunderX2 node "#n" LLC", \
959ff9
+	.name			= "tx2_llc"#n, \
959ff9
+	.perf_name		= "uncore_l3c_"#n, \
959ff9
+	.pmu			= PFM_PMU_ARM_THUNDERX2_LLC##n, \
959ff9
+	.pme_count		= LIBPFM_ARRAY_SIZE(arm_thunderx2_unc_llc_pe), \
959ff9
+	.type			= PFM_PMU_TYPE_UNCORE, \
959ff9
+	.pe			= arm_thunderx2_unc_llc_pe, \
959ff9
+	.pmu_detect		= pfm_arm_detect_thunderx2, \
959ff9
+	.max_encoding		= 1, \
959ff9
+	.num_cntrs		= 4, \
959ff9
+	.get_event_encoding[PFM_OS_NONE] = pfm_tx2_unc_get_event_encoding, \
959ff9
+	 PFMLIB_ENCODE_PERF(pfm_tx2_unc_get_perf_encoding),		\
959ff9
+	.get_event_first	= pfm_arm_get_event_first, \
959ff9
+	.get_event_next		= pfm_arm_get_event_next,  \
959ff9
+	.event_is_valid		= pfm_arm_event_is_valid,  \
959ff9
+	.validate_table		= pfm_arm_validate_table,  \
959ff9
+	.get_event_info		= pfm_arm_get_event_info,  \
959ff9
+	.get_event_attr_info	= pfm_arm_get_event_attr_info,	\
959ff9
+	 PFMLIB_VALID_PERF_PATTRS(pfm_arm_perf_validate_pattrs),\
959ff9
+	.get_event_nattrs	= pfm_arm_get_event_nattrs, \
959ff9
+};
959ff9
+
959ff9
+DEFINE_TX2_LLC(0);
959ff9
+DEFINE_TX2_LLC(1);
959ff9
diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c
959ff9
index 2b6cbb4..8314d4b 100644
959ff9
--- a/lib/pfmlib_common.c
959ff9
+++ b/lib/pfmlib_common.c
959ff9
@@ -490,6 +490,10 @@ static pfmlib_pmu_t *pfmlib_pmus[]=
959ff9
 	&arm_cortex_a53_support,
959ff9
 	&arm_xgene_support,
959ff9
 	&arm_thunderx2_support,
959ff9
+	&arm_thunderx2_dmc0_support,
959ff9
+	&arm_thunderx2_dmc1_support,
959ff9
+	&arm_thunderx2_llc0_support,
959ff9
+	&arm_thunderx2_llc1_support,
959ff9
 #endif
959ff9
 
959ff9
 #ifdef CONFIG_PFMLIB_ARCH_S390X
959ff9
diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h
959ff9
index b0070a6..cb83f43 100644
959ff9
--- a/lib/pfmlib_priv.h
959ff9
+++ b/lib/pfmlib_priv.h
959ff9
@@ -644,7 +644,13 @@ extern pfmlib_pmu_t arm_qcom_krait_support;
959ff9
 extern pfmlib_pmu_t arm_cortex_a57_support;
959ff9
 extern pfmlib_pmu_t arm_cortex_a53_support;
959ff9
 extern pfmlib_pmu_t arm_xgene_support;
959ff9
+
959ff9
 extern pfmlib_pmu_t arm_thunderx2_support;
959ff9
+extern pfmlib_pmu_t arm_thunderx2_dmc0_support;
959ff9
+extern pfmlib_pmu_t arm_thunderx2_dmc1_support;
959ff9
+extern pfmlib_pmu_t arm_thunderx2_llc0_support;
959ff9
+extern pfmlib_pmu_t arm_thunderx2_llc1_support;
959ff9
+
959ff9
 extern pfmlib_pmu_t mips_74k_support;
959ff9
 extern pfmlib_pmu_t s390x_cpum_cf_support;
959ff9
 extern pfmlib_pmu_t s390x_cpum_sf_support;
959ff9
diff --git a/lib/pfmlib_tx2_unc_perf_event.c b/lib/pfmlib_tx2_unc_perf_event.c
959ff9
new file mode 100644
959ff9
index 0000000..1a04e1d
959ff9
--- /dev/null
959ff9
+++ b/lib/pfmlib_tx2_unc_perf_event.c
959ff9
@@ -0,0 +1,139 @@
959ff9
+#include <sys/types.h>
959ff9
+#include <string.h>
959ff9
+#include <stdlib.h>
959ff9
+#include <stdio.h>
959ff9
+#include <stdarg.h>
959ff9
+#include <limits.h>
959ff9
+
959ff9
+/* private headers */
959ff9
+#include "pfmlib_priv.h"
959ff9
+#include "pfmlib_perf_event_priv.h"
959ff9
+#include "pfmlib_arm_priv.h"
959ff9
+
959ff9
+typedef union {
959ff9
+	uint64_t val;
959ff9
+	struct {
959ff9
+		unsigned long unc_event:8;	/* event code */
959ff9
+		unsigned long unc_umask:8;	/* unit mask */
959ff9
+		unsigned long unc_res1:1;	/* reserved */
959ff9
+		unsigned long unc_rst:1;	/* reset */
959ff9
+		unsigned long unc_edge:1;	/* edge detect */
959ff9
+		unsigned long unc_res2:3;	/* reserved */
959ff9
+		unsigned long unc_en:1;		/* enable */
959ff9
+		unsigned long unc_inv:1;	/* invert counter mask */
959ff9
+		unsigned long unc_thres:8;	/* counter mask */
959ff9
+		unsigned long unc_res3:32;	/* reserved */
959ff9
+	} com; /* covers common fields for DMC/L3C */
959ff9
+} tx2_unc_data_t;
959ff9
+
959ff9
+static void
959ff9
+display_reg(void *this, pfmlib_event_desc_t *e, tx2_unc_data_t reg);
959ff9
+static void
959ff9
+display_com(void *this, pfmlib_event_desc_t *e, void *val);
959ff9
+static int
959ff9
+find_pmu_type_by_name(const char *name);
959ff9
+
959ff9
+int
959ff9
+pfm_tx2_unc_get_event_encoding(void *this, pfmlib_event_desc_t *e)
959ff9
+{
959ff9
+	//from pe field in for the uncore, get the array with all the event defs
959ff9
+	const arm_entry_t *event_list = this_pe(this);
959ff9
+	tx2_unc_data_t reg;
959ff9
+	//get code for the event from the table
959ff9
+	reg.val = event_list[e->event].code;
959ff9
+	//pass the data back to the caller
959ff9
+	e->codes[0] = reg.val;
959ff9
+	e->count = 1;
959ff9
+	evt_strcat(e->fstr, "%s", event_list[e->event].name);
959ff9
+	display_reg(this, e, reg);
959ff9
+	return PFM_SUCCESS;
959ff9
+}
959ff9
+
959ff9
+int
959ff9
+pfm_tx2_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e)
959ff9
+{
959ff9
+	pfmlib_pmu_t *pmu = this;
959ff9
+	struct perf_event_attr *attr = e->os_data;
959ff9
+	tx2_unc_data_t reg;
959ff9
+	int ret;
959ff9
+
959ff9
+	if (!pmu->get_event_encoding[PFM_OS_NONE])
959ff9
+		return PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	ret = pmu->get_event_encoding[PFM_OS_NONE](this, e);
959ff9
+	if (ret != PFM_SUCCESS)
959ff9
+		return ret;
959ff9
+	//get pmu type to probe
959ff9
+	ret = find_pmu_type_by_name(pmu->perf_name);
959ff9
+	if (ret < 0)
959ff9
+		return ret;
959ff9
+
959ff9
+	attr->type = ret;
959ff9
+	//get code to provide to the uncore pmu probe
959ff9
+	reg.val = e->codes[0];
959ff9
+	attr->config = reg.val;
959ff9
+
959ff9
+	// if needed, can use attr->config1 or attr->config2 for extra info from event structure defines e->codes[i]
959ff9
+
959ff9
+	// uncore measures at all priv levels
959ff9
+	attr->exclude_hv = 0;
959ff9
+	attr->exclude_kernel = 0;
959ff9
+	attr->exclude_user = 0;
959ff9
+
959ff9
+	return PFM_SUCCESS;
959ff9
+}
959ff9
+
959ff9
+
959ff9
+static void
959ff9
+display_reg(void *this, pfmlib_event_desc_t *e, tx2_unc_data_t reg)
959ff9
+{
959ff9
+	pfmlib_pmu_t *pmu = this;
959ff9
+	if (pmu->display_reg)
959ff9
+		pmu->display_reg(this, e, ®);
959ff9
+	else
959ff9
+		display_com(this, e, ®);
959ff9
+}
959ff9
+
959ff9
+static void
959ff9
+display_com(void *this, pfmlib_event_desc_t *e, void *val)
959ff9
+{
959ff9
+	const arm_entry_t *pe = this_pe(this);
959ff9
+	tx2_unc_data_t *reg = val;
959ff9
+
959ff9
+	__pfm_vbprintf("[UNC=0x%"PRIx64" event=0x%x umask=0x%x en=%d "
959ff9
+		       "inv=%d edge=%d thres=%d] %s\n",
959ff9
+			reg->val,
959ff9
+			reg->com.unc_event,
959ff9
+			reg->com.unc_umask,
959ff9
+			reg->com.unc_en,
959ff9
+			reg->com.unc_inv,
959ff9
+			reg->com.unc_edge,
959ff9
+			reg->com.unc_thres,
959ff9
+			pe[e->event].name);
959ff9
+}
959ff9
+
959ff9
+static int
959ff9
+find_pmu_type_by_name(const char *name)
959ff9
+{
959ff9
+	char filename[PATH_MAX];
959ff9
+	FILE *fp;
959ff9
+	int ret, type;
959ff9
+
959ff9
+	if (!name)
959ff9
+		return PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	sprintf(filename, "/sys/bus/event_source/devices/%s/type", name);
959ff9
+
959ff9
+	fp = fopen(filename, "r");
959ff9
+	if (!fp)
959ff9
+		return PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	ret = fscanf(fp, "%d", &type);
959ff9
+	if (ret != 1)
959ff9
+		type = PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	fclose(fp);
959ff9
+
959ff9
+	return type;
959ff9
+}
959ff9
+
959ff9
diff --git a/tests/validate_arm64.c b/tests/validate_arm64.c
959ff9
index f7f021a..35eb6ef 100644
959ff9
--- a/tests/validate_arm64.c
959ff9
+++ b/tests/validate_arm64.c
959ff9
@@ -177,6 +177,12 @@ static const test_event_t arm64_test_events[]={
959ff9
 	  .codes[0] = 0x8000008,
959ff9
 	  .fstr = "arm_thunderx2::INST_RETIRED:k=1:u=1:hv=0",
959ff9
 	},
959ff9
+	{ SRC_LINE,
959ff9
+	  .name = "tx2_dmc1::UNC_DMC_READS",
959ff9
+	  .ret  = PFM_SUCCESS,
959ff9
+	  .count = 1,
959ff9
+	  .codes[0] = 0xf,
959ff9
+	},
959ff9
 };
959ff9
 #define NUM_TEST_EVENTS (int)(sizeof(arm64_test_events)/sizeof(test_event_t))
959ff9
 
959ff9
-- 
959ff9
2.21.0
959ff9
959ff9
From 6641952170c23c5ab69c1af19197a9d8284c1e53 Mon Sep 17 00:00:00 2001
959ff9
From: Shay Gal-On <sgalon@cavium.com>
959ff9
Date: Thu, 21 Nov 2019 10:41:26 -0800
959ff9
Subject: [PATCH 2/4] Moved TX2 uncore event to separate file
959ff9
959ff9
To make event files cleaner.
959ff9
Also added link to marvell doc publishing the uncore event lists.
959ff9
959ff9
Signed-off-by: Shay Gal-On <sgalon@marvell.com>
959ff9
---
959ff9
 lib/Makefile                            |  8 ++-
959ff9
 lib/events/arm_cavium_tx2_events.h      | 61 -----------------
959ff9
 lib/events/arm_marvell_tx2_unc_events.h | 90 +++++++++++++++++++++++++
959ff9
 lib/pfmlib_arm_armv8.c                  |  3 +-
959ff9
 4 files changed, 97 insertions(+), 65 deletions(-)
959ff9
 create mode 100755 lib/events/arm_marvell_tx2_unc_events.h
959ff9
959ff9
diff --git a/lib/Makefile b/lib/Makefile
959ff9
index f45515d..686264b 100644
959ff9
--- a/lib/Makefile
959ff9
+++ b/lib/Makefile
959ff9
@@ -360,11 +360,13 @@ INC_ARM=pfmlib_arm_priv.h			\
959ff9
 	events/arm_cortex_a15_events.h		\
959ff9
 	events/arm_cortex_a57_events.h		\
959ff9
 	events/arm_cortex_a53_events.h		\
959ff9
-	events/arm_cavium_tx2_events.h
959ff9
+	events/arm_cavium_tx2_events.h		\
959ff9
+	events/arm_marvell_tx2_unc_events.h
959ff9
 
959ff9
 INC_ARM64=events/arm_cortex_a57_events.h	\
959ff9
-	  events/arm_cortex_a53_events.h	\
959ff9
-	  events/arm_cavium_tx2_events.h
959ff9
+	events/arm_cortex_a53_events.h	\
959ff9
+	events/arm_cavium_tx2_events.h	\
959ff9
+	events/arm_marvell_tx2_unc_events.h
959ff9
 
959ff9
 INCDEP=$(INC_COMMON) $(INCARCH)
959ff9
 
959ff9
diff --git a/lib/events/arm_cavium_tx2_events.h b/lib/events/arm_cavium_tx2_events.h
959ff9
index 18d8931..198d33d 100644
959ff9
--- a/lib/events/arm_cavium_tx2_events.h
959ff9
+++ b/lib/events/arm_cavium_tx2_events.h
959ff9
@@ -835,64 +835,3 @@ static const arm_entry_t arm_thunderx2_pe[]={
959ff9
 	 .desc = "Scu hwpf next line requests generated"
959ff9
 	},
959ff9
 };
959ff9
-
959ff9
-#define ARM_TX2_CORE_EVENT_COUNT	(sizeof(arm_thunderx2_pe)/sizeof(arm_entry_t))
959ff9
-
959ff9
-/* L3C event IDs */
959ff9
-#define L3_EVENT_READ_REQ               0xD
959ff9
-#define L3_EVENT_WRITEBACK_REQ          0xE
959ff9
-#define L3_EVENT_EVICT_REQ              0x13
959ff9
-#define L3_EVENT_READ_HIT               0x17
959ff9
-#define L3_EVENT_MAX                    0x18
959ff9
-
959ff9
-/* DMC event IDs */
959ff9
-#define DMC_EVENT_COUNT_CYCLES          0x1
959ff9
-#define DMC_EVENT_WRITE_TXNS            0xB
959ff9
-#define DMC_EVENT_DATA_TRANSFERS        0xD
959ff9
-#define DMC_EVENT_READ_TXNS             0xF
959ff9
-#define DMC_EVENT_MAX                   0x10
959ff9
-
959ff9
-static const arm_entry_t arm_thunderx2_unc_dmc_pe[]={
959ff9
-	{.name = "UNC_DMC_READS",
959ff9
-	 .modmsk = ARMV8_ATTRS,
959ff9
-	 .code = DMC_EVENT_READ_TXNS,
959ff9
-	 .desc = "Memory read transactions"
959ff9
-	},
959ff9
-	{.name = "UNC_DMC_WRITES",
959ff9
-	 .modmsk = ARMV8_ATTRS,
959ff9
-	 .code = DMC_EVENT_WRITE_TXNS,
959ff9
-	 .desc = "Memory write transactions"
959ff9
-	},
959ff9
-};
959ff9
-
959ff9
-#define ARM_TX2_CORE_DMC_COUNT	(sizeof(arm_thunderx2_unc_dmc_pe)/sizeof(arm_entry_t))
959ff9
-
959ff9
-static const arm_entry_t arm_thunderx2_unc_llc_pe[]={
959ff9
-	{.name = "UNC_LLC_READ",
959ff9
-	 .modmsk = ARMV8_ATTRS,
959ff9
-	 .code = L3_EVENT_READ_REQ,
959ff9
-	 .desc = "Read requests to LLC"
959ff9
-	},
959ff9
-	{.name = "UNC_LLC_EVICT",
959ff9
-	 .modmsk = ARMV8_ATTRS,
959ff9
-	 .code = L3_EVENT_EVICT_REQ,
959ff9
-	 .desc = "Evict requests to LLC"
959ff9
-	},
959ff9
-	{.name = "UNC_LLC_READ_HIT",
959ff9
-	 .modmsk = ARMV8_ATTRS,
959ff9
-	 .code = L3_EVENT_READ_HIT,
959ff9
-	 .desc = "Read requests to LLC which hit"
959ff9
-	},
959ff9
-	{.name = "UNC_LLC_WB",
959ff9
-	 .modmsk = ARMV8_ATTRS,
959ff9
-	 .code = L3_EVENT_WRITEBACK_REQ,
959ff9
-	 .desc = "Writeback requests to LLC"
959ff9
-	}
959ff9
-};
959ff9
-
959ff9
-#define ARM_TX2_CORE_LLC_COUNT	(sizeof(arm_thunderx2_unc_llc_pe)/sizeof(arm_entry_t))
959ff9
-//Uncore accessor functions
959ff9
-int
959ff9
-pfm_tx2_unc_get_event_encoding(void *this, pfmlib_event_desc_t *e);
959ff9
-int
959ff9
-pfm_tx2_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e);
959ff9
diff --git a/lib/events/arm_marvell_tx2_unc_events.h b/lib/events/arm_marvell_tx2_unc_events.h
959ff9
new file mode 100755
959ff9
index 0000000..9b0a1b4
959ff9
--- /dev/null
959ff9
+++ b/lib/events/arm_marvell_tx2_unc_events.h
959ff9
@@ -0,0 +1,90 @@
959ff9
+/*
959ff9
+ * Copyright (c) 2019 Marvell Technology Group Ltd
959ff9
+ * Contributed by Shay Gal-On <sgalon@marvell.com>
959ff9
+ *
959ff9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
959ff9
+ * of this software and associated documentation files (the "Software"), to deal
959ff9
+ * in the Software without restriction, including without limitation the rights
959ff9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
959ff9
+ * of the Software, and to permit persons to whom the Software is furnished to do so,
959ff9
+ * subject to the following conditions:
959ff9
+ *
959ff9
+ * The above copyright notice and this permission notice shall be included in all
959ff9
+ * copies or substantial portions of the Software.
959ff9
+ *
959ff9
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
959ff9
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
959ff9
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
959ff9
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
959ff9
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
959ff9
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
959ff9
+ *
959ff9
+ * Marvell ThunderX2
959ff9
+ *
959ff9
+ * ARM Architecture Reference Manual, ARMv8, for ARMv8-A architecture profile,
959ff9
+ * ARM DDI 0487B.a (ID033117)
959ff9
+ *
959ff9
+ * Marvell ThunderX2 C99XX Core and Uncore PMU Events (Abridged) can be found at
959ff9
+ * https://www.marvell.com/documents/hrur6mybdvk5uki1w0z7/
959ff9
+ *
959ff9
+ */
959ff9
+
959ff9
+
959ff9
+/* L3C event IDs */
959ff9
+#define L3_EVENT_READ_REQ               0xD
959ff9
+#define L3_EVENT_WRITEBACK_REQ          0xE
959ff9
+#define L3_EVENT_EVICT_REQ              0x13
959ff9
+#define L3_EVENT_READ_HIT               0x17
959ff9
+#define L3_EVENT_MAX                    0x18
959ff9
+
959ff9
+/* DMC event IDs */
959ff9
+#define DMC_EVENT_COUNT_CYCLES          0x1
959ff9
+#define DMC_EVENT_WRITE_TXNS            0xB
959ff9
+#define DMC_EVENT_DATA_TRANSFERS        0xD
959ff9
+#define DMC_EVENT_READ_TXNS             0xF
959ff9
+#define DMC_EVENT_MAX                   0x10
959ff9
+
959ff9
+static const arm_entry_t arm_thunderx2_unc_dmc_pe[]={
959ff9
+	{.name = "UNC_DMC_READS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = DMC_EVENT_READ_TXNS,
959ff9
+	 .desc = "Memory read transactions"
959ff9
+	},
959ff9
+	{.name = "UNC_DMC_WRITES",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = DMC_EVENT_WRITE_TXNS,
959ff9
+	 .desc = "Memory write transactions"
959ff9
+	},
959ff9
+};
959ff9
+
959ff9
+#define ARM_TX2_CORE_DMC_COUNT	(sizeof(arm_thunderx2_unc_dmc_pe)/sizeof(arm_entry_t))
959ff9
+
959ff9
+static const arm_entry_t arm_thunderx2_unc_llc_pe[]={
959ff9
+	{.name = "UNC_LLC_READ",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_READ_REQ,
959ff9
+	 .desc = "Read requests to LLC"
959ff9
+	},
959ff9
+	{.name = "UNC_LLC_EVICT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_EVICT_REQ,
959ff9
+	 .desc = "Evict requests to LLC"
959ff9
+	},
959ff9
+	{.name = "UNC_LLC_READ_HIT",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_READ_HIT,
959ff9
+	 .desc = "Read requests to LLC which hit"
959ff9
+	},
959ff9
+	{.name = "UNC_LLC_WB",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = L3_EVENT_WRITEBACK_REQ,
959ff9
+	 .desc = "Writeback requests to LLC"
959ff9
+	}
959ff9
+};
959ff9
+
959ff9
+#define ARM_TX2_CORE_LLC_COUNT	(sizeof(arm_thunderx2_unc_llc_pe)/sizeof(arm_entry_t))
959ff9
+//Uncore accessor functions
959ff9
+int
959ff9
+pfm_tx2_unc_get_event_encoding(void *this, pfmlib_event_desc_t *e);
959ff9
+int
959ff9
+pfm_tx2_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e);
959ff9
diff --git a/lib/pfmlib_arm_armv8.c b/lib/pfmlib_arm_armv8.c
959ff9
index 35ff70f..291ac60 100644
959ff9
--- a/lib/pfmlib_arm_armv8.c
959ff9
+++ b/lib/pfmlib_arm_armv8.c
959ff9
@@ -33,7 +33,8 @@
959ff9
 #include "events/arm_cortex_a57_events.h"    /* A57 event tables */
959ff9
 #include "events/arm_cortex_a53_events.h"    /* A53 event tables */
959ff9
 #include "events/arm_xgene_events.h"         /* Applied Micro X-Gene tables */
959ff9
-#include "events/arm_cavium_tx2_events.h"    /* Cavium ThunderX2 tables */
959ff9
+#include "events/arm_cavium_tx2_events.h"    	/* Marvell ThunderX2 tables */
959ff9
+#include "events/arm_marvell_tx2_unc_events.h" 	/* Marvell ThunderX2 PMU tables */
959ff9
 
959ff9
 static int
959ff9
 pfm_arm_detect_cortex_a57(void *this)
959ff9
-- 
959ff9
2.21.0
959ff9
959ff9
From dc1da4573eb8d24bdf64b9bb5e04ed956075d712 Mon Sep 17 00:00:00 2001
959ff9
From: Shay Gal-On <sgalon@cavium.com>
959ff9
Date: Mon, 25 Nov 2019 12:00:15 -0800
959ff9
Subject: [PATCH 3/4] Add ThunderX2 DMC events and CCPI events
959ff9
959ff9
This patch adds missing 2 DMC events for ThunderX2
959ff9
and adds support for the Cross Core Complex Interconnect
959ff9
(CCPI) PMU and events.
959ff9
959ff9
The following PMU models are added:
959ff9
 - tx2_ccpi0, tx2_ccpi1
959ff9
 - tx2_dmc0, tx2_dmc1
959ff9
959ff9
Signed-off-by: Shay Gal-On <sgalon@marvell.com>
959ff9
---
959ff9
 include/perfmon/pfmlib.h                |  12 +--
959ff9
 lib/Makefile                            |   2 +-
959ff9
 lib/events/arm_marvell_tx2_unc_events.h |  42 ++++++++++
959ff9
 lib/pfmlib_arm_armv8.c                  |  33 +++++++-
959ff9
 lib/pfmlib_common.c                     |   8 ++
959ff9
 lib/pfmlib_priv.h                       |   2 +
959ff9
 lib/pfmlib_tx2_unc_perf_event.c         | 101 ++++++++++--------------
959ff9
 tests/validate_arm64.c                  |  15 ++++
959ff9
 8 files changed, 148 insertions(+), 67 deletions(-)
959ff9
959ff9
diff --git a/include/perfmon/pfmlib.h b/include/perfmon/pfmlib.h
959ff9
index 20d5feb..3f1d2f5 100644
959ff9
--- a/include/perfmon/pfmlib.h
959ff9
+++ b/include/perfmon/pfmlib.h
959ff9
@@ -543,12 +543,14 @@ typedef enum {
959ff9
 
959ff9
 	PFM_PMU_INTEL_KNM_UNC_UBOX,	/* Intel Knights Mill Ubox uncore */
959ff9
 	PFM_PMU_INTEL_KNM_UNC_M2PCIE,	/* Intel Knights Mill M2PCIe uncore */
959ff9
-	PFM_PMU_ARM_THUNDERX2,		/* Cavium ThunderX2 */
959ff9
+	PFM_PMU_ARM_THUNDERX2,		/* Marvell ThunderX2 */
959ff9
 
959ff9
-	PFM_PMU_ARM_THUNDERX2_DMC0,	/* Cavium ThunderX2 DMC unit 0 uncore */
959ff9
-	PFM_PMU_ARM_THUNDERX2_DMC1,	/* Cavium ThunderX2 DMC unit 1 uncore */
959ff9
-	PFM_PMU_ARM_THUNDERX2_LLC0,	/* Cavium ThunderX2 LLC unit 0 uncore */
959ff9
-	PFM_PMU_ARM_THUNDERX2_LLC1,	/* Cavium ThunderX2 LLC unit 1 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_DMC0,	/* Marvell ThunderX2 DMC unit 0 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_DMC1,	/* Marvell ThunderX2 DMC unit 1 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_LLC0,	/* Marvell ThunderX2 LLC unit 0 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_LLC1,	/* Marvell ThunderX2 LLC unit 1 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_CCPI0,	/* Marvell ThunderX2 Cross-Socket Interconnect unit 0 uncore */
959ff9
+	PFM_PMU_ARM_THUNDERX2_CCPI1,	/* Marvell ThunderX2 Cross-Socket Interconnect unit 1 uncore */
959ff9
 	/* MUST ADD NEW PMU MODELS HERE */
959ff9
 
959ff9
 	PFM_PMU_MAX			/* end marker */
959ff9
diff --git a/lib/Makefile b/lib/Makefile
959ff9
index 686264b..4a4dc3b 100644
959ff9
--- a/lib/Makefile
959ff9
+++ b/lib/Makefile
959ff9
@@ -177,7 +177,7 @@ SRCS += pfmlib_arm_perf_event.c
959ff9
 endif
959ff9
 
959ff9
 INCARCH = $(INC_ARM)
959ff9
-SRCS   += pfmlib_arm.c pfmlib_arm_armv7_pmuv1.c pfmlib_arm_armv6.c pfmlib_arm_armv8.c
959ff9
+SRCS   += pfmlib_arm.c pfmlib_arm_armv7_pmuv1.c pfmlib_arm_armv6.c pfmlib_arm_armv8.c pfmlib_tx2_unc_perf_event.c
959ff9
 CFLAGS += -DCONFIG_PFMLIB_ARCH_ARM
959ff9
 endif
959ff9
 
959ff9
diff --git a/lib/events/arm_marvell_tx2_unc_events.h b/lib/events/arm_marvell_tx2_unc_events.h
959ff9
index 9b0a1b4..51e6b4d 100755
959ff9
--- a/lib/events/arm_marvell_tx2_unc_events.h
959ff9
+++ b/lib/events/arm_marvell_tx2_unc_events.h
959ff9
@@ -44,6 +44,13 @@
959ff9
 #define DMC_EVENT_READ_TXNS             0xF
959ff9
 #define DMC_EVENT_MAX                   0x10
959ff9
 
959ff9
+/* CCPI event IDs */
959ff9
+#define CCPI2_EVENT_REQ_PKT_SENT	0x3D
959ff9
+#define CCPI2_EVENT_SNOOP_PKT_SENT	0x65
959ff9
+#define CCPI2_EVENT_DATA_PKT_SENT	0x105
959ff9
+#define CCPI2_EVENT_GIC_PKT_SENT	0x12D
959ff9
+
959ff9
+
959ff9
 static const arm_entry_t arm_thunderx2_unc_dmc_pe[]={
959ff9
 	{.name = "UNC_DMC_READS",
959ff9
 	 .modmsk = ARMV8_ATTRS,
959ff9
@@ -55,10 +62,45 @@ static const arm_entry_t arm_thunderx2_unc_dmc_pe[]={
959ff9
 	 .code = DMC_EVENT_WRITE_TXNS,
959ff9
 	 .desc = "Memory write transactions"
959ff9
 	},
959ff9
+	{.name = "UNC_DMC_DATA_TRANSFERS",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = DMC_EVENT_DATA_TRANSFERS,
959ff9
+	 .desc = "Memory data transfers"
959ff9
+	},
959ff9
+	{.name = "UNC_DMC_CYCLES",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = DMC_EVENT_COUNT_CYCLES,
959ff9
+	 .desc = "Clocks at the DMC clock rate"
959ff9
+	}
959ff9
 };
959ff9
 
959ff9
 #define ARM_TX2_CORE_DMC_COUNT	(sizeof(arm_thunderx2_unc_dmc_pe)/sizeof(arm_entry_t))
959ff9
 
959ff9
+static const arm_entry_t arm_thunderx2_unc_ccpi_pe[]={
959ff9
+	{.name = "UNC_CCPI_REQ",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = CCPI2_EVENT_REQ_PKT_SENT,
959ff9
+	 .desc = "Request packets sent from this node"
959ff9
+	},
959ff9
+	{.name = "UNC_CCPI_SNOOP",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = CCPI2_EVENT_SNOOP_PKT_SENT,
959ff9
+	 .desc = "Snoop packets sent from this node"
959ff9
+	},
959ff9
+	{.name = "UNC_CCPI_DATA",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = CCPI2_EVENT_DATA_PKT_SENT ,
959ff9
+	 .desc = "Data packets sent from this node"
959ff9
+	},
959ff9
+	{.name = "UNC_CCPI_GIC",
959ff9
+	 .modmsk = ARMV8_ATTRS,
959ff9
+	 .code = CCPI2_EVENT_GIC_PKT_SENT,
959ff9
+	 .desc = "Interrupt related packets sent from this node"
959ff9
+	}
959ff9
+};
959ff9
+
959ff9
+#define ARM_TX2_CORE_CCPI_COUNT	(sizeof(arm_thunderx2_unc_ccpi_pe)/sizeof(arm_entry_t))
959ff9
+
959ff9
 static const arm_entry_t arm_thunderx2_unc_llc_pe[]={
959ff9
 	{.name = "UNC_LLC_READ",
959ff9
 	 .modmsk = ARMV8_ATTRS,
959ff9
diff --git a/lib/pfmlib_arm_armv8.c b/lib/pfmlib_arm_armv8.c
959ff9
index 291ac60..a252951 100644
959ff9
--- a/lib/pfmlib_arm_armv8.c
959ff9
+++ b/lib/pfmlib_arm_armv8.c
959ff9
@@ -179,7 +179,7 @@ pfmlib_pmu_t arm_xgene_support={
959ff9
 	.get_event_nattrs	= pfm_arm_get_event_nattrs,
959ff9
 };
959ff9
 
959ff9
-/* Cavium ThunderX2 support */
959ff9
+/* Marvell ThunderX2 support */
959ff9
 pfmlib_pmu_t arm_thunderx2_support={
959ff9
 	.desc			= "Cavium ThunderX2",
959ff9
 	.name			= "arm_thunderx2",
959ff9
@@ -208,7 +208,7 @@ pfmlib_pmu_t arm_thunderx2_support={
959ff9
 
959ff9
 #define DEFINE_TX2_DMC(n) \
959ff9
 pfmlib_pmu_t arm_thunderx2_dmc##n##_support={ \
959ff9
-	.desc			= "Cavium ThunderX2 Node"#n" DMC", \
959ff9
+	.desc			= "Marvell ThunderX2 Node"#n" DMC", \
959ff9
 	.name			= "tx2_dmc"#n, \
959ff9
 	.perf_name		= "uncore_dmc_"#n, \
959ff9
 	.pmu			= PFM_PMU_ARM_THUNDERX2_DMC##n, \
959ff9
@@ -235,7 +235,7 @@ DEFINE_TX2_DMC(1);
959ff9
 
959ff9
 #define DEFINE_TX2_LLC(n) \
959ff9
 pfmlib_pmu_t arm_thunderx2_llc##n##_support={ \
959ff9
-	.desc			= "Cavium ThunderX2 node "#n" LLC", \
959ff9
+	.desc			= "Marvell ThunderX2 node "#n" LLC", \
959ff9
 	.name			= "tx2_llc"#n, \
959ff9
 	.perf_name		= "uncore_l3c_"#n, \
959ff9
 	.pmu			= PFM_PMU_ARM_THUNDERX2_LLC##n, \
959ff9
@@ -259,3 +259,30 @@ pfmlib_pmu_t arm_thunderx2_llc##n##_support={ \
959ff9
 
959ff9
 DEFINE_TX2_LLC(0);
959ff9
 DEFINE_TX2_LLC(1);
959ff9
+
959ff9
+#define DEFINE_TX2_CCPI(n) \
959ff9
+pfmlib_pmu_t arm_thunderx2_ccpi##n##_support={ \
959ff9
+	.desc			= "Marvell ThunderX2 node "#n" Cross-Socket Interconnect", \
959ff9
+	.name			= "tx2_ccpi"#n, \
959ff9
+	.perf_name		= "uncore_ccpi_"#n, \
959ff9
+	.pmu			= PFM_PMU_ARM_THUNDERX2_CCPI##n, \
959ff9
+	.pme_count		= LIBPFM_ARRAY_SIZE(arm_thunderx2_unc_ccpi_pe), \
959ff9
+	.type			= PFM_PMU_TYPE_UNCORE, \
959ff9
+	.pe			= arm_thunderx2_unc_ccpi_pe, \
959ff9
+	.pmu_detect		= pfm_arm_detect_thunderx2, \
959ff9
+	.max_encoding		= 1, \
959ff9
+	.num_cntrs		= 4, \
959ff9
+	.get_event_encoding[PFM_OS_NONE] = pfm_tx2_unc_get_event_encoding, \
959ff9
+	 PFMLIB_ENCODE_PERF(pfm_tx2_unc_get_perf_encoding),		\
959ff9
+	.get_event_first	= pfm_arm_get_event_first, \
959ff9
+	.get_event_next		= pfm_arm_get_event_next,  \
959ff9
+	.event_is_valid		= pfm_arm_event_is_valid,  \
959ff9
+	.validate_table		= pfm_arm_validate_table,  \
959ff9
+	.get_event_info		= pfm_arm_get_event_info,  \
959ff9
+	.get_event_attr_info	= pfm_arm_get_event_attr_info,	\
959ff9
+	 PFMLIB_VALID_PERF_PATTRS(pfm_arm_perf_validate_pattrs),\
959ff9
+	.get_event_nattrs	= pfm_arm_get_event_nattrs, \
959ff9
+};
959ff9
+
959ff9
+DEFINE_TX2_CCPI(0);
959ff9
+DEFINE_TX2_CCPI(1);
959ff9
diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c
959ff9
index 8314d4b..8cb8998 100644
959ff9
--- a/lib/pfmlib_common.c
959ff9
+++ b/lib/pfmlib_common.c
959ff9
@@ -484,6 +484,12 @@ static pfmlib_pmu_t *pfmlib_pmus[]=
959ff9
 	&arm_cortex_a53_support,
959ff9
 	&arm_xgene_support,
959ff9
 	&arm_thunderx2_support,
959ff9
+	&arm_thunderx2_dmc0_support,
959ff9
+	&arm_thunderx2_dmc1_support,
959ff9
+	&arm_thunderx2_llc0_support,
959ff9
+	&arm_thunderx2_llc1_support,
959ff9
+	&arm_thunderx2_ccpi0_support,
959ff9
+	&arm_thunderx2_ccpi1_support,
959ff9
 #endif
959ff9
 #ifdef CONFIG_PFMLIB_ARCH_ARM64
959ff9
 	&arm_cortex_a57_support,
959ff9
@@ -494,6 +500,8 @@ static pfmlib_pmu_t *pfmlib_pmus[]=
959ff9
 	&arm_thunderx2_dmc1_support,
959ff9
 	&arm_thunderx2_llc0_support,
959ff9
 	&arm_thunderx2_llc1_support,
959ff9
+	&arm_thunderx2_ccpi0_support,
959ff9
+	&arm_thunderx2_ccpi1_support,
959ff9
 #endif
959ff9
 
959ff9
 #ifdef CONFIG_PFMLIB_ARCH_S390X
959ff9
diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h
959ff9
index cb83f43..1340a6b 100644
959ff9
--- a/lib/pfmlib_priv.h
959ff9
+++ b/lib/pfmlib_priv.h
959ff9
@@ -650,6 +650,8 @@ extern pfmlib_pmu_t arm_thunderx2_dmc0_support;
959ff9
 extern pfmlib_pmu_t arm_thunderx2_dmc1_support;
959ff9
 extern pfmlib_pmu_t arm_thunderx2_llc0_support;
959ff9
 extern pfmlib_pmu_t arm_thunderx2_llc1_support;
959ff9
+extern pfmlib_pmu_t arm_thunderx2_ccpi0_support;
959ff9
+extern pfmlib_pmu_t arm_thunderx2_ccpi1_support;
959ff9
 
959ff9
 extern pfmlib_pmu_t mips_74k_support;
959ff9
 extern pfmlib_pmu_t s390x_cpum_cf_support;
959ff9
diff --git a/lib/pfmlib_tx2_unc_perf_event.c b/lib/pfmlib_tx2_unc_perf_event.c
959ff9
index 1a04e1d..7dc2372 100644
959ff9
--- a/lib/pfmlib_tx2_unc_perf_event.c
959ff9
+++ b/lib/pfmlib_tx2_unc_perf_event.c
959ff9
@@ -27,11 +27,51 @@ typedef union {
959ff9
 } tx2_unc_data_t;
959ff9
 
959ff9
 static void
959ff9
-display_reg(void *this, pfmlib_event_desc_t *e, tx2_unc_data_t reg);
959ff9
+display_com(void *this, pfmlib_event_desc_t *e, void *val)
959ff9
+{
959ff9
+	const arm_entry_t *pe = this_pe(this);
959ff9
+	tx2_unc_data_t *reg = val;
959ff9
+
959ff9
+	__pfm_vbprintf("[UNC=0x%"PRIx64"] %s\n",
959ff9
+			reg->val,
959ff9
+			pe[e->event].name);
959ff9
+}
959ff9
+
959ff9
 static void
959ff9
-display_com(void *this, pfmlib_event_desc_t *e, void *val);
959ff9
+display_reg(void *this, pfmlib_event_desc_t *e, tx2_unc_data_t reg)
959ff9
+{
959ff9
+	pfmlib_pmu_t *pmu = this;
959ff9
+	if (pmu->display_reg)
959ff9
+		pmu->display_reg(this, e, ®);
959ff9
+	else
959ff9
+		display_com(this, e, ®);
959ff9
+}
959ff9
+
959ff9
+
959ff9
 static int
959ff9
-find_pmu_type_by_name(const char *name);
959ff9
+find_pmu_type_by_name(const char *name)
959ff9
+{
959ff9
+	char filename[PATH_MAX];
959ff9
+	FILE *fp;
959ff9
+	int ret, type;
959ff9
+
959ff9
+	if (!name)
959ff9
+		return PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	sprintf(filename, "/sys/bus/event_source/devices/%s/type", name);
959ff9
+
959ff9
+	fp = fopen(filename, "r");
959ff9
+	if (!fp)
959ff9
+		return PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	ret = fscanf(fp, "%d", &type);
959ff9
+	if (ret != 1)
959ff9
+		type = PFM_ERR_NOTSUPP;
959ff9
+
959ff9
+	fclose(fp);
959ff9
+
959ff9
+	return type;
959ff9
+}
959ff9
 
959ff9
 int
959ff9
 pfm_tx2_unc_get_event_encoding(void *this, pfmlib_event_desc_t *e)
959ff9
@@ -82,58 +122,3 @@ pfm_tx2_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e)
959ff9
 
959ff9
 	return PFM_SUCCESS;
959ff9
 }
959ff9
-
959ff9
-
959ff9
-static void
959ff9
-display_reg(void *this, pfmlib_event_desc_t *e, tx2_unc_data_t reg)
959ff9
-{
959ff9
-	pfmlib_pmu_t *pmu = this;
959ff9
-	if (pmu->display_reg)
959ff9
-		pmu->display_reg(this, e, ®);
959ff9
-	else
959ff9
-		display_com(this, e, ®);
959ff9
-}
959ff9
-
959ff9
-static void
959ff9
-display_com(void *this, pfmlib_event_desc_t *e, void *val)
959ff9
-{
959ff9
-	const arm_entry_t *pe = this_pe(this);
959ff9
-	tx2_unc_data_t *reg = val;
959ff9
-
959ff9
-	__pfm_vbprintf("[UNC=0x%"PRIx64" event=0x%x umask=0x%x en=%d "
959ff9
-		       "inv=%d edge=%d thres=%d] %s\n",
959ff9
-			reg->val,
959ff9
-			reg->com.unc_event,
959ff9
-			reg->com.unc_umask,
959ff9
-			reg->com.unc_en,
959ff9
-			reg->com.unc_inv,
959ff9
-			reg->com.unc_edge,
959ff9
-			reg->com.unc_thres,
959ff9
-			pe[e->event].name);
959ff9
-}
959ff9
-
959ff9
-static int
959ff9
-find_pmu_type_by_name(const char *name)
959ff9
-{
959ff9
-	char filename[PATH_MAX];
959ff9
-	FILE *fp;
959ff9
-	int ret, type;
959ff9
-
959ff9
-	if (!name)
959ff9
-		return PFM_ERR_NOTSUPP;
959ff9
-
959ff9
-	sprintf(filename, "/sys/bus/event_source/devices/%s/type", name);
959ff9
-
959ff9
-	fp = fopen(filename, "r");
959ff9
-	if (!fp)
959ff9
-		return PFM_ERR_NOTSUPP;
959ff9
-
959ff9
-	ret = fscanf(fp, "%d", &type);
959ff9
-	if (ret != 1)
959ff9
-		type = PFM_ERR_NOTSUPP;
959ff9
-
959ff9
-	fclose(fp);
959ff9
-
959ff9
-	return type;
959ff9
-}
959ff9
-
959ff9
diff --git a/tests/validate_arm64.c b/tests/validate_arm64.c
959ff9
index 35eb6ef..5cb1966 100644
959ff9
--- a/tests/validate_arm64.c
959ff9
+++ b/tests/validate_arm64.c
959ff9
@@ -182,6 +182,21 @@ static const test_event_t arm64_test_events[]={
959ff9
 	  .ret  = PFM_SUCCESS,
959ff9
 	  .count = 1,
959ff9
 	  .codes[0] = 0xf,
959ff9
+	  .fstr = "tx2_dmc1::UNC_DMC_READS",
959ff9
+	},
959ff9
+	{ SRC_LINE,
959ff9
+	  .name = "tx2_ccpi0::UNC_CCPI_GIC",
959ff9
+	  .ret  = PFM_SUCCESS,
959ff9
+	  .count = 1,
959ff9
+	  .codes[0] = 0x12d,
959ff9
+	  .fstr = "tx2_ccpi0::UNC_CCPI_GIC",
959ff9
+	},
959ff9
+	{ SRC_LINE,
959ff9
+	  .name = "tx2_llc0::UNC_LLC_READ",
959ff9
+	  .ret  = PFM_SUCCESS,
959ff9
+	  .count = 1,
959ff9
+	  .codes[0] = 0xd,
959ff9
+	  .fstr = "tx2_llc0::UNC_LLC_READ",
959ff9
 	},
959ff9
 };
959ff9
 #define NUM_TEST_EVENTS (int)(sizeof(arm64_test_events)/sizeof(test_event_t))
959ff9
-- 
959ff9
2.21.0
959ff9
959ff9
From e401d29e89b92e999615e11ea17808e90eda93fd Mon Sep 17 00:00:00 2001
959ff9
From: Shay Gal-On <sgalon@cavium.com>
959ff9
Date: Tue, 3 Dec 2019 09:54:37 -0800
959ff9
Subject: [PATCH 4/4] Removed extra fields from tx2_unc_data_t
959ff9
959ff9
Removed useless fields from tx2_unc_data_t.
959ff9
959ff9
Signed-off-by: Shay Gal-On <sgalon@marvell.com>
959ff9
---
959ff9
 lib/events/arm_marvell_tx2_unc_events.h |  0
959ff9
 lib/pfmlib_tx2_unc_perf_event.c         | 13 ++-----------
959ff9
 2 files changed, 2 insertions(+), 11 deletions(-)
959ff9
 mode change 100755 => 100644 lib/events/arm_marvell_tx2_unc_events.h
959ff9
959ff9
diff --git a/lib/events/arm_marvell_tx2_unc_events.h b/lib/events/arm_marvell_tx2_unc_events.h
959ff9
old mode 100755
959ff9
new mode 100644
959ff9
diff --git a/lib/pfmlib_tx2_unc_perf_event.c b/lib/pfmlib_tx2_unc_perf_event.c
959ff9
index 7dc2372..154cb0a 100644
959ff9
--- a/lib/pfmlib_tx2_unc_perf_event.c
959ff9
+++ b/lib/pfmlib_tx2_unc_perf_event.c
959ff9
@@ -13,17 +13,8 @@
959ff9
 typedef union {
959ff9
 	uint64_t val;
959ff9
 	struct {
959ff9
-		unsigned long unc_event:8;	/* event code */
959ff9
-		unsigned long unc_umask:8;	/* unit mask */
959ff9
-		unsigned long unc_res1:1;	/* reserved */
959ff9
-		unsigned long unc_rst:1;	/* reset */
959ff9
-		unsigned long unc_edge:1;	/* edge detect */
959ff9
-		unsigned long unc_res2:3;	/* reserved */
959ff9
-		unsigned long unc_en:1;		/* enable */
959ff9
-		unsigned long unc_inv:1;	/* invert counter mask */
959ff9
-		unsigned long unc_thres:8;	/* counter mask */
959ff9
-		unsigned long unc_res3:32;	/* reserved */
959ff9
-	} com; /* covers common fields for DMC/L3C */
959ff9
+		unsigned long unc_res1:32;	/* reserved */
959ff9
+	} com; /* reserved space for future extensions */
959ff9
 } tx2_unc_data_t;
959ff9
 
959ff9
 static void
959ff9
-- 
959ff9
2.21.0
959ff9