The IBM Torrent chip is a network hub chip used in the P7IH machine (a.k.a. IBM Blue Waters machine). The chip has several PMUs on it for measuring various events on the networks to which it is attached.
Signed-off-by: Corey Ashford <cjash...@linux.vnet.ibm.com> --- include/perfmon/pfmlib.h | 2 + lib/Makefile | 5 +- lib/events/torrent_events.h | 1077 +++++++++++++++++++++++++++++++++++++++++++ lib/pfmlib_common.c | 1 + lib/pfmlib_power_priv.h | 26 + lib/pfmlib_priv.h | 1 + lib/pfmlib_torrent.c | 229 +++++++++ 7 files changed, 1339 insertions(+), 2 deletions(-) create mode 100644 lib/events/torrent_events.h create mode 100644 lib/pfmlib_torrent.c diff --git a/include/perfmon/pfmlib.h b/include/perfmon/pfmlib.h index 02047c9..8677cf7 100644 --- a/include/perfmon/pfmlib.h +++ b/include/perfmon/pfmlib.h @@ -131,6 +131,8 @@ typedef enum { PFM_PMU_ARM_CORTEX_A8, /* ARM Cortex A8 */ PFM_PMU_ARM_CORTEX_A9, /* ARM Cortex A9 */ + PFM_PMU_TORRENT, /* IBM Torrent hub chip */ + /* MUST ADD NEW PMU MODELS HERE */ PFM_PMU_MAX /* end marker */ diff --git a/lib/Makefile b/lib/Makefile index 5639a64..bf5f5f3 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -70,7 +70,7 @@ endif ifeq ($(CONFIG_PFMLIB_ARCH_POWERPC),y) INCARCH = $(INC_POWERPC) -SRCS += pfmlib_powerpc.c pfmlib_power4.c pfmlib_ppc970.c pfmlib_power5.c pfmlib_power6.c pfmlib_power7.c +SRCS += pfmlib_powerpc.c pfmlib_power4.c pfmlib_ppc970.c pfmlib_power5.c pfmlib_power6.c pfmlib_power7.c pfmlib_torrent.c CFLAGS += -DCONFIG_PFMLIB_ARCH_POWERPC endif @@ -148,7 +148,8 @@ INC_POWERPC=events/ppc970_events.h \ events/power5_events.h \ events/power5+_events.h \ events/power6_events.h \ - events/power7_events.h + events/power7_events.h \ + events/torrent_events.h INC_SPARC=events/ultra12_events.h \ events/ultra3_events.h \ diff --git a/lib/events/torrent_events.h b/lib/events/torrent_events.h new file mode 100644 index 0000000..703b7ad --- /dev/null +++ b/lib/events/torrent_events.h @@ -0,0 +1,1077 @@ +/****************************/ +/* THIS IS OPEN SOURCE CODE */ +/****************************/ + +#ifndef __TORRENT_EVENTS_H__ +#define __TORRENT_EVENTS_H__ + +/* + * File: torrent_events.h, event definitions for the IBM Torrent chip + * Author: Corey Ashford + * cjash...@us.ibm.com + * Mods: <your name here> + * <your email address> + * + * (C) Copyright IBM Corporation, 2010. All Rights Reserved. + * Contributed by Corey Ashford <cjashfor.ibm.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Note: This code was automatically generated and should not be modified by + * hand. + */ + +/* IBM Torrent PMU event codes */ + +/* 0x0000_0000 - 0x00FF_FFFF = PowerPC core events + * 0x0100_0000 - 0x01FF_FFFF = Torrent events + * 0x0200_0000 - 0xFFFF_FFFF = reserved + * For Torrent events: + * Reserve encodings 0x0..0x00FF_FFFF for core PowerPC events. + * For Torrent events + * 0x00F0_0000 = Torrent PMU id + * 0x000F_0000 = PMU unit number (e.g. 0 for MCD0, 1 for MCD1) + * 0x0000_FF00 = virtual counter number (unused on MCD) + * 0x0000_00FF = PMC mux value (unused on Util, MMU, CAU) + * (Note that some of these fields are wider than necessary) + * + * The upper bits 0xFFFF_FFFF_0000_0000 are reserved for attribute + * fields. + */ + +#define PMU_SPACE_MASK 0xFF000000 +#define POWERPC_CORE_SPACE 0x00000000 +#define TORRENT_SPACE 0x01000000 +#define IS_CORE_EVENT(x) ((x & PMU_SPACE_MASK) == POWERPC_CORE_SPACE) +#define IS_TORRENT_EVENT(x) ((x & PMU_SPACE_MASK) == TORRENT_SPACE) +#define TORRENT_PMU_SHIFT 20 +#define TORRENT_PMU_MASK (0xF << TORRENT_PMU_SHIFT) +#define TORRENT_PMU_GET(x) ((x & TORRENT_PMU_MASK) >> TORRENT_PMU_SHIFT) +#define TORRENT_UNIT_SHIFT 16 +#define TORRENT_UNIT_MASK (0xF << TORRENT_UNIT_SHIFT) +#define TORRENT_UNIT_GET(x) ((x & TORRENT_UNIT_MASK) >> TORRENT_UNIT_SHIFT) +#define TORRENT_VIRT_CTR_SHIFT 8 +#define TORRENT_VIRT_CTR_MASK (0xFF << TORRENT_VIRT_CTR_SHIFT) +#define TORRENT_VIRT_CTR_GET(x) ((x & TORRENT_VIRT_CTR_MASK) >> TORRENT_VIRT_CTR_SHIFT) +#define TORRENT_MUX_SHIFT 0 +#define TORRENT_MUX_MASK 0xFF +#define TORRENT_MUX_GET(x) ((x & TORRENT_MUX_MASK) >> TORRENT_MUX_SHIFT) + +#define TORRENT_PBUS_WXYZ_ID 0x0 +#define TORRENT_PBUS_LL_ID 0x1 +#define TORRENT_PBUS_MCD_ID 0x2 +#define TORRENT_PBUS_UTIL_ID 0x3 +#define TORRENT_MMU_ID 0x4 +#define TORRENT_CAU_ID 0x5 +#define TORRENT_LAST_ID (TORRENT_CAU_ID) +#define TORRENT_NUM_PMU_TYPES (TORRENT_LAST_ID + 1) + +#define TORRENT_PMU(pmu) (TORRENT_SPACE | \ + TORRENT_##pmu##_ID << TORRENT_PMU_SHIFT) + +#define TORRENT_PBUS_WXYZ TORRENT_PMU(PBUS_WXYZ) +#define TORRENT_PBUS_LL TORRENT_PMU(PBUS_LL) +#define TORRENT_PBUS_MCD TORRENT_PMU(PBUS_MCD) +#define TORRENT_PBUS_UTIL TORRENT_PMU(PBUS_UTIL) +#define TORRENT_MMU TORRENT_PMU(MMU) +#define TORRENT_CAU TORRENT_PMU(CAU) + +#define COUNTER_W (0 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_X (1 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_Y (2 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_Z (3 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL0 (0 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL1 (1 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL2 (2 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL3 (3 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL4 (4 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL5 (5 << TORRENT_VIRT_CTR_SHIFT) +#define COUNTER_LL6 (6 << TORRENT_VIRT_CTR_SHIFT) + +/* Attributes */ + +#define TORRENT_ATTR_MCD_TYPE_SHIFT 32 +#define TORRENT_ATTR_MCD_TYPE_MASK (0x3ULL << TORRENT_ATTR_MCD_TYPE_SHIFT) +#define TORRENT_ATTR_UTIL_SEL_SHIFT 32 +#define TORRENT_ATTR_UTIL_SEL_MASK (0x3ULL << TORRENT_ATTR_UTIL_SEL_SHIFT) +#define TORRENT_ATTR_UTIL_CMP_SHIFT 34 +#define TORRENT_ATTR_UTIL_CMP_MASK (0x1FULL << TORRENT_ATTR_UTIL_CMP_SHIFT) + +static const pme_torrent_entry_t torrent_pe[] = { + { + .pme_name = "PM_PBUS_W_DISABLED", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_W_IN_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_W_IN_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_W_IN_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_W_OUT_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_W_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_W_OUT_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_W | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_DISABLED", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_IN_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_IN_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_IN_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_OUT_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_X_OUT_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_X | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_DISABLED", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_IN_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_IN_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_IN_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_OUT_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Y_OUT_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Y | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_DISABLED", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_IN_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_IN_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_IN_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_OUT_IDLE", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_Z_OUT_DATA", + .pme_code = TORRENT_PBUS_WXYZ | COUNTER_Z | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL0_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL0 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL1_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL1 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL2_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL2 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL3_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL3 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL4_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL4 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL5_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL5 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_DISABLED", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x0, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_IN_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x1, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_IN_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x2, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_IN_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x3, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_OUT_IDLE", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x5, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_OUT_CMDRSP", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x6, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_OUT_DATA", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x7, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_IN_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0x9, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_LL6_OUT_ISR", + .pme_code = TORRENT_PBUS_LL | COUNTER_LL6 | 0xd, + .pme_desc = "" + }, + { + .pme_name = "PM_PBUS_MCD0_PROBE_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x00, + .pme_desc = "cl_probe command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_PROBE_CRESP_GOOD", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x01, + .pme_desc = "cResp for a cl_probe was addr_ack_done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_PROBE_CRESP_RETRY", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x02, + .pme_desc = "cResp for a cl_probe was rty_sp or addr_error or unexpected cResp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_FLUSH1_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x03, + .pme_desc = "dcbfk command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_FLUSH0_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x04, + .pme_desc = "dcbf command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_BKILL_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x05, + .pme_desc = "bkill command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_FLUSH1_GOOD_COMP", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x06, + .pme_desc = "cResp for a dcbfk was addr_ack_done and no collision", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_FLUSH1_COLLISION", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x07, + .pme_desc = "dcbfk had a collision", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_FLUSH1_BAD_CRESP", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x08, + .pme_desc = "cResp for a dcbfk was rty_sp or fl_addr_ack_bk_sp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_FLUSH0_CRESP_RETRY", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x09, + .pme_desc = "cResp for a dcbf was rty_sp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_BKILL_CRESP_RETRY", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x0A, + .pme_desc = "cResp for a bkill was rty_sp or fl_addr_ack_bk_sp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_HIT", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x0B, + .pme_desc = "a reflected command got a hit", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_MISS", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x0C, + .pme_desc = "a reflected command got a miss", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_HIT_MD", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x0D, + .pme_desc = "a reflected command got a hit in the main directory", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_HIT_NE", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x0E, + .pme_desc = "a reflected command got a hit in the new entry buffer", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_HIT_CO", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x0F, + .pme_desc = "a reflected command got a hit in the castout buffer", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_MISS_CREATE", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x10, + .pme_desc = "a reflected command with a miss should create an entry", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RCMD_MISS_CREATED", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x11, + .pme_desc = "a new entry was created", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RTY_DINC", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x12, + .pme_desc = "MCD responded rty_dinc", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_RTY_FULL", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x13, + .pme_desc = "MCD responded rty_lpc", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_BK_RTY", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x14, + .pme_desc = "MCD responded with a master retry (rty_other or rty_lost_claim)", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_NE_FULL", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x15, + .pme_desc = "The new entry buffer is full", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_DEMAND_CASTOUT", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x16, + .pme_desc = "A demand castout was done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_OTHER_CASTOUT", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x17, + .pme_desc = "A non-demand castout was done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_CASTOUT", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x18, + .pme_desc = "A castout was done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_CO_MOVE", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x19, + .pme_desc = "A castout entry was moved to the main directory", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_NE_MOVE", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x1A, + .pme_desc = "A new entry movement was processed", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_PAGE_CREATE", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x1B, + .pme_desc = "A new entry movement created a page (got a miss)", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_NE_MOVE_MERGE", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x1C, + .pme_desc = "A new entry movement merged with an existing page (got a hit)", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_NE_MOVE_ABORT_FLUSH", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x1D, + .pme_desc = "A new entry movement was aborted due to flush in progress", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_NE_MOVE_ABORT_COQ", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x1E, + .pme_desc = "A new entry movement was aborted due to castout buffer full", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_EM_HOLDOFF", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x1F, + .pme_desc = "An entry movement was held off", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD0_EMQ_NOT_MT", + .pme_code = TORRENT_PBUS_MCD | 0 << TORRENT_UNIT_SHIFT | 0x21, + .pme_desc = "The entry movement queue is not empty", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_PROBE_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x00, + .pme_desc = "cl_probe command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_PROBE_CRESP_GOOD", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x01, + .pme_desc = "cResp for a cl_probe was addr_ack_done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_PROBE_CRESP_RETRY", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x02, + .pme_desc = "cResp for a cl_probe was rty_sp or addr_error or unexpected cResp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_FLUSH1_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x03, + .pme_desc = "dcbfk command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_FLUSH0_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x04, + .pme_desc = "dcbf command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_BKILL_ISSUED", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x05, + .pme_desc = "bkill command issued", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_FLUSH1_GOOD_COMP", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x06, + .pme_desc = "cResp for a dcbfk was addr_ack_done and no collision", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_FLUSH1_COLLISION", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x07, + .pme_desc = "dcbfk had a collision", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_FLUSH1_BAD_CRESP", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x08, + .pme_desc = "cResp for a dcbfk was rty_sp or fl_addr_ack_bk_sp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_FLUSH0_CRESP_RETRY", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x09, + .pme_desc = "cResp for a dcbf was rty_sp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_BKILL_CRESP_RETRY", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x0A, + .pme_desc = "cResp for a bkill was rty_sp or fl_addr_ack_bk_sp", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_HIT", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x0B, + .pme_desc = "a reflected command got a hit", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_MISS", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x0C, + .pme_desc = "a reflected command got a miss", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_HIT_MD", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x0D, + .pme_desc = "a reflected command got a hit in the main directory", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_HIT_NE", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x0E, + .pme_desc = "a reflected command got a hit in the new entry buffer", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_HIT_CO", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x0F, + .pme_desc = "a reflected command got a hit in the castout buffer", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_MISS_CREATE", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x10, + .pme_desc = "a reflected command with a miss should create an entry", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RCMD_MISS_CREATED", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x11, + .pme_desc = "a new entry was created", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RTY_DINC", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x12, + .pme_desc = "MCD responded rty_dinc", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_RTY_FULL", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x13, + .pme_desc = "MCD responded rty_lpc", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_BK_RTY", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x14, + .pme_desc = "MCD responded with a master retry (rty_other or rty_lost_claim)", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_NE_FULL", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x15, + .pme_desc = "The new entry buffer is full", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_DEMAND_CASTOUT", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x16, + .pme_desc = "A demand castout was done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_OTHER_CASTOUT", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x17, + .pme_desc = "A non-demand castout was done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_CASTOUT", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x18, + .pme_desc = "A castout was done", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_CO_MOVE", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x19, + .pme_desc = "A castout entry was moved to the main directory", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_NE_MOVE", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x1A, + .pme_desc = "A new entry movement was processed", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_PAGE_CREATE", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x1B, + .pme_desc = "A new entry movement created a page (got a miss)", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_NE_MOVE_MERGE", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x1C, + .pme_desc = "A new entry movement merged with an existing page (got a hit)", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_NE_MOVE_ABORT_FLUSH", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x1D, + .pme_desc = "A new entry movement was aborted due to flush in progress", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_NE_MOVE_ABORT_COQ", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x1E, + .pme_desc = "A new entry movement was aborted due to castout buffer full", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_EM_HOLDOFF", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x1F, + .pme_desc = "An entry movement was held off", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_MCD1_EMQ_NOT_MT", + .pme_code = TORRENT_PBUS_MCD | 1 << TORRENT_UNIT_SHIFT | 0x21, + .pme_desc = "The entry movement queue is not empty", + .pme_modmsk = _TORRENT_ATTR_MCD + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_NM_HI_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x0 << TORRENT_VIRT_CTR_SHIFT | 0x0, + .pme_desc = "Node Master High Threshold Counter", + .pme_modmsk = _TORRENT_ATTR_UTIL_HI + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_NM_LO_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x1 << TORRENT_VIRT_CTR_SHIFT | 0x0, + .pme_desc = "Node Master Low Threshold Counter", + .pme_modmsk = _TORRENT_ATTR_UTIL_LO + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_LM_HI_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x2 << TORRENT_VIRT_CTR_SHIFT | 0x0, + .pme_desc = "Local Master High Threshold Counter", + .pme_modmsk = _TORRENT_ATTR_UTIL_HI + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_LM_LO_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x3 << TORRENT_VIRT_CTR_SHIFT | 0x0, + .pme_desc = "Local Master Low Threshold Counter", + .pme_modmsk = _TORRENT_ATTR_UTIL_LO + }, + { + .pme_name = "PM_PBUS_UTIL_NODE_MASTER_PUMPS", + .pme_code = TORRENT_PBUS_UTIL | 0x0 << TORRENT_VIRT_CTR_SHIFT | 0x1, + .pme_desc = "Node Master Pumps" + }, + { + .pme_name = "PM_PBUS_UTIL_LOCAL_MASTER_PUMPS", + .pme_code = TORRENT_PBUS_UTIL | 0x1 << TORRENT_VIRT_CTR_SHIFT | 0x1, + .pme_desc = "Local Master Pumps" + }, + { + .pme_name = "PM_PBUS_UTIL_RETRY_NODE_MASTER_PUMPS", + .pme_code = TORRENT_PBUS_UTIL | 0x2 << TORRENT_VIRT_CTR_SHIFT | 0x1, + .pme_desc = "Retry Node Master Pumps" + }, + { + .pme_name = "PM_PBUS_UTIL_RETRY_LOCAL_MASTER_PUMPS", + .pme_code = TORRENT_PBUS_UTIL | 0x3 << TORRENT_VIRT_CTR_SHIFT | 0x1, + .pme_desc = "Retry Local Master Pumps" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_RCMD_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x4 << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "rCmd Activity Counter" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_INTDATA_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x5 << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "Internal Data Counter" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_EXTDATSND_W_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x6 << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "External Data Send Activity Counter for WXYZ links" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_EXTDATRCV_W_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x7 << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "External Data Receive Activity Counter for WXYZ links" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_EXTDATSND_LL_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x8 << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "External Data Send Activity Counter for LL links" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_EXTDATRCV_LL_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0x9 << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "External Data Receive Activity Counter for LL links" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_EXTDAT_W_LL_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0xA << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "External Data Activity Counter from WXYZ to LL links" + }, + { + .pme_name = "PM_PBUS_UTIL_PB_APM_EXTDAT_LL_W_CNT", + .pme_code = TORRENT_PBUS_UTIL | 0xB << TORRENT_VIRT_CTR_SHIFT, + .pme_desc = "External Data Activity Counter from LL to WXYZ links" + }, + { + .pme_name = "PM_MMU_G_MMCHIT", + .pme_code = TORRENT_MMU | (0 << TORRENT_VIRT_CTR_SHIFT), + .pme_desc = "Memory Management Cache Hit Counter Register" + }, + { + .pme_name = "PM_MMU_G_MMCMIS", + .pme_code = TORRENT_MMU | (1 << TORRENT_VIRT_CTR_SHIFT), + .pme_desc = "Memory Management Cache Miss Counter Register" + }, + { + .pme_name = "PM_MMU_G_MMATHIT", + .pme_code = TORRENT_MMU | (2 << TORRENT_VIRT_CTR_SHIFT), + .pme_desc = "Memory Management AT Cache Hit Counter Register" + }, + { + .pme_name = "PM_MMU_G_MMATMIS", + .pme_code = TORRENT_MMU | (3 << TORRENT_VIRT_CTR_SHIFT), + .pme_desc = "Memory Management AT Cache Miss Counter Register" + }, + { + .pme_name = "PM_CAU_CYCLES_WAITING_ON_A_CREDIT", + .pme_code = TORRENT_CAU | 0, + .pme_desc = "Count of cycles spent waiting on a credit. Increments whenever any index has a packet to send, but nothing (from any index) can be sent." + }, +}; +#endif diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c index 48d33d7..17a3ed5 100644 --- a/lib/pfmlib_common.c +++ b/lib/pfmlib_common.c @@ -96,6 +96,7 @@ static pfmlib_pmu_t *pfmlib_pmus[]= &power5p_support, &power6_support, &power7_support, + &torrent_support, #endif #ifdef CONFIG_PFMLIB_ARCH_SPARC diff --git a/lib/pfmlib_power_priv.h b/lib/pfmlib_power_priv.h index 7b9b889..d047f8b 100644 --- a/lib/pfmlib_power_priv.h +++ b/lib/pfmlib_power_priv.h @@ -24,6 +24,32 @@ typedef struct { char *pme_long_desc; } pme_power_entry_t; +typedef struct { + char *pme_name; + unsigned pme_code; + char *pme_desc; + uint64_t pme_modmsk; +} pme_torrent_entry_t; + +/* Attribute "type "for PowerBus MCD events */ +#define TORRENT_ATTR_MCD_TYPE 0 +/* Attribute "sel" for PowerBus bus utilization events */ +#define TORRENT_ATTR_UTIL_SEL 1 +/* Attribute "lo_cmp" for PowerBus utilization events */ +#define TORRENT_ATTR_UTIL_LO_CMP 2 +/* Attribute "hi_cmp" for PowerBus utilization events */ +#define TORRENT_ATTR_UTIL_HI_CMP 3 + +#define _TORRENT_ATTR_MCD_TYPE (1 << TORRENT_ATTR_MCD_TYPE) +#define _TORRENT_ATTR_MCD (_TORRENT_ATTR_MCD_TYPE) +#define _TORRENT_ATTR_UTIL_SEL (1 << TORRENT_ATTR_UTIL_SEL) +#define _TORRENT_ATTR_UTIL_LO_CMP (1 << TORRENT_ATTR_UTIL_LO_CMP) +#define _TORRENT_ATTR_UTIL_HI_CMP (1 << TORRENT_ATTR_UTIL_HI_CMP) +#define _TORRENT_ATTR_UTIL_LO (_TORRENT_ATTR_UTIL_SEL | \ + _TORRENT_ATTR_UTIL_LO_CMP) +#define _TORRENT_ATTR_UTIL_HI (_TORRENT_ATTR_UTIL_SEL | \ + _TORRENT_ATTR_UTIL_HI_CMP) + /* * These definitions were taken from the reg.h file which, until Linux * 2.6.18, resided in /usr/include/asm-ppc64. Most of the unneeded diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h index 48cd7e2..c9a1e8f 100644 --- a/lib/pfmlib_priv.h +++ b/lib/pfmlib_priv.h @@ -187,6 +187,7 @@ extern pfmlib_pmu_t power5_support; extern pfmlib_pmu_t power5p_support; extern pfmlib_pmu_t power6_support; extern pfmlib_pmu_t power7_support; +extern pfmlib_pmu_t torrent_support; extern pfmlib_pmu_t sparc_support; extern pfmlib_pmu_t cell_support; extern pfmlib_pmu_t perf_event_support; diff --git a/lib/pfmlib_torrent.c b/lib/pfmlib_torrent.c new file mode 100644 index 0000000..80d9a8d --- /dev/null +++ b/lib/pfmlib_torrent.c @@ -0,0 +1,229 @@ +/* + * pfmlib_torrent.c : IBM Torrent support + * + * Copyright (C) IBM Corporation, 2010. All rights reserved. + * Contributed by Corey Ashford (cjash...@us.ibm.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/* private headers */ +#include "pfmlib_priv.h" +#include "pfmlib_power_priv.h" +#include "events/torrent_events.h" +#include <sys/types.h> +#include <dirent.h> +#include <string.h> + +const pfmlib_attr_desc_t torrent_modifiers[] = { + PFM_ATTR_I("type", "Counter type: 0 = 2x64-bit counters w/32-bit prescale, 1 = 4x32-bit counters w/16-bit prescale, 2 = 2x32-bit counters w/no prescale, 3 = 4x16-bit counters w/no prescale"), + PFM_ATTR_I("sel", "Sample period / Cmd Increment select: 0 = 256 cycles/ +16, 1 = 512 cycles / +8, 2 = 1024 cycles / +4, 3 = 2048 cycles / +2"), + PFM_ATTR_I("lo_cmp", "Low threshold compare: 0..31"), + PFM_ATTR_I("hi_cmp", "High threshold compare: 0..31"), + PFM_ATTR_NULL +}; + +static inline int pfm_torrent_attr2mod(void *this, int pidx, int attr_idx) +{ + const pme_torrent_entry_t *pe = this_pe(this); + int x, n; + + n = attr_idx; + + pfmlib_for_each_bit(x, pe[pidx].pme_modmsk) { + if (n == 0) + break; + n--; + } + return x; +} + +/** + * torrent_pmu_detect + * + * Determine if this machine has a Torrent chip + * + **/ +static int pfm_torrent_detect(void* this) +{ + DIR *dir; + struct dirent *de; + + /* If /proc/device-tree/hfi-iohub@<torrent_chip_id> exists, + * this machine has an accessible Torrent chip */ + dir = opendir("/proc/device-tree"); + if (dir == NULL) { + return PFM_ERR_NOTSUPP; + } + while ((de = readdir(dir)) != NULL) { + if (strncmp(de->d_name, "hfi-iohub@", 10) == 0) { + return PFM_SUCCESS; + } + } + return PFM_ERR_NOTSUPP; +} + +static int +pfm_torrent_get_event_info(void *this, int pidx, pfm_event_info_t *info) +{ + const pme_torrent_entry_t *pe = this_pe(this); + + info->code = pe[pidx].pme_code; + info->desc = pe[pidx].pme_desc; + info->dtype = PFM_DTYPE_UINT64; + info->equiv = NULL; + info->name = pe[pidx].pme_name; + /* unit masks + modifiers */ + info->nattrs = pfmlib_popcnt((unsigned long)pe[pidx].pme_modmsk); + return PFM_SUCCESS; +} + +static int +pfm_torrent_get_event_attr_info(void *this, int idx, int attr_idx, + pfm_event_attr_info_t *info) +{ + int m; + + m = pfm_torrent_attr2mod(this, idx, attr_idx); + info->name = modx(torrent_modifiers, m, name); + info->desc = modx(torrent_modifiers, m, desc); + info->equiv = NULL; + info->code = m; + info->type = modx(torrent_modifiers, m, type); + info->is_dfl = 0; + info->idx = attr_idx; + info->dfl_val64 = 0; + + return PFM_SUCCESS; +} + +static int +pfm_torrent_validate_table(void *this, FILE *fp) +{ + pfmlib_pmu_t *pmu = this; + const pme_torrent_entry_t *pe = this_pe(this); + int i; + int ret = PFM_ERR_INVAL; + + for(i = 0; i < pmu->pme_count; i++) { + if (!pe[i].pme_name) { + fprintf(fp, "pmu: %s event%d: :: no name\n", pmu->name, i); + goto error; + } + if (!pe[i].pme_desc) { + fprintf(fp, "pmu: %s event%d: %s :: no description\n", pmu->name, i, pe[i].pme_name); + goto error; + } + if (pe[i].pme_code == 0) { + fprintf(fp, "pmu: %s event%d: %s :: event code is 0\n", pmu->name, i, pe[i].pme_name); + goto error; + } + } + ret = PFM_SUCCESS; +error: + return ret; +} + +static int +pfm_torrent_get_encoding(void *this, pfmlib_event_desc_t *e, uint64_t *codes, int *count, pfmlib_perf_attr_t *attrs) +{ + const pme_torrent_entry_t *pe = this_pe(this); + int i; + + e->fstr[0] = '\0'; /* initialize the fully-qualified event string */ + + codes[0] = 0; + + if (e->event < (e->pmu)->pme_count) { + *count = 1; + codes[0] = (uint64_t)pe[e->event].pme_code; + for (i = 0; i < e->nattrs; i++) { + int mod = pfm_torrent_attr2mod(this, e->event, + e->attrs[i].id); + uint32_t torrent_pmu = pe[e->event].pme_code & (TORRENT_SPACE | TORRENT_PMU_MASK); + switch (torrent_pmu) { + case TORRENT_PBUS_MCD: + switch (mod) { + case TORRENT_ATTR_MCD_TYPE: + if (e->attrs[i].ival <= 3) { + codes[0] |= e->attrs[i].ival << TORRENT_ATTR_MCD_TYPE_SHIFT; + } else { + DPRINT("value of attribute \'type\' - %" PRIu64 " - is not in the range 0..3.\n", e->attrs[i].ival); + return PFM_ERR_ATTR_VAL; + } + break; + default: + DPRINT("unknown attribute for TORRENT_POWERBUS_MCD - %d\n", mod); + return PFM_ERR_ATTR; + } + break; + case TORRENT_PBUS_UTIL: + switch (mod) { + case TORRENT_ATTR_UTIL_SEL: + if (e->attrs[i].ival <= 3) { + codes[0] |= e->attrs[i].ival << TORRENT_ATTR_UTIL_SEL_SHIFT; + } else { + DPRINT("value of attribute \'sel\' - %" PRIu64 " - is not in the range 0..3.\n", e->attrs[i].ival); + return PFM_ERR_ATTR_VAL; + } + break; + case TORRENT_ATTR_UTIL_LO_CMP: + case TORRENT_ATTR_UTIL_HI_CMP: + if (e->attrs[i].ival <= 31) { + codes[0] |= e->attrs[i].ival << TORRENT_ATTR_UTIL_CMP_SHIFT; + } else { + if (mod == TORRENT_ATTR_UTIL_LO_CMP) + DPRINT("value of attribute \'lo_cmp\' - %" PRIu64 " - is not in the range 0..31.\n", e->attrs[i].ival); + else + DPRINT("value of attribute \'hi_cmp\' - %" PRIu64 " - is not in the range 0..31.\n", e->attrs[i].ival); + return PFM_ERR_ATTR_VAL; + } + } + break; + default: + DPRINT("attributes are unsupported for this Torrent PMU - code = %" PRIx32 "\n", torrent_pmu); + return PFM_ERR_ATTR; + } + } + return PFM_SUCCESS; + } else { + return PFM_ERR_INVAL; + } +} + +pfmlib_pmu_t torrent_support = { + /* the next 4 fields are initialized in pfm_gen_powerpc_pmu_detect */ + .pmu = PFM_PMU_TORRENT, + .name = "Power Torrent", + .desc = "IBM Power Torrent PMU", + + .pme_count = sizeof(torrent_pe) / + sizeof(pme_torrent_entry_t), + + .pe = torrent_pe, + .pmu_detect = pfm_torrent_detect, + .max_encoding = 1, + .get_event_first = pfm_gen_powerpc_get_event_first, + .get_event_next = pfm_gen_powerpc_get_event_next, + .event_is_valid = pfm_gen_powerpc_event_is_valid, + .get_event_perf_type = pfm_gen_powerpc_get_event_perf_type, + .get_event_encoding = pfm_torrent_get_encoding, + .validate_table = pfm_torrent_validate_table, + .get_event_info = pfm_torrent_get_event_info, + .get_event_attr_info = pfm_torrent_get_event_attr_info, +}; + -- 1.7.0.4 ------------------------------------------------------------------------------ Nokia and AT&T present the 2010 Calling All Innovators-North America contest Create new apps & games for the Nokia N8 for consumers in U.S. and Canada $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store http://p.sf.net/sfu/nokia-dev2dev _______________________________________________ perfmon2-devel mailing list perfmon2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perfmon2-devel