18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright 2009 Paul Mackerras, IBM Corporation.
48c2ecf20Sopenharmony_ci * Copyright 2013 Michael Ellerman, IBM Corporation.
58c2ecf20Sopenharmony_ci * Copyright 2016 Madhavan Srinivasan, IBM Corporation.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifndef _LINUX_POWERPC_PERF_ISA207_COMMON_H_
98c2ecf20Sopenharmony_ci#define _LINUX_POWERPC_PERF_ISA207_COMMON_H_
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/kernel.h>
128c2ecf20Sopenharmony_ci#include <linux/perf_event.h>
138c2ecf20Sopenharmony_ci#include <asm/firmware.h>
148c2ecf20Sopenharmony_ci#include <asm/cputable.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include "internal.h"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define EVENT_EBB_MASK		1ull
198c2ecf20Sopenharmony_ci#define EVENT_EBB_SHIFT		PERF_EVENT_CONFIG_EBB_SHIFT
208c2ecf20Sopenharmony_ci#define EVENT_BHRB_MASK		1ull
218c2ecf20Sopenharmony_ci#define EVENT_BHRB_SHIFT	62
228c2ecf20Sopenharmony_ci#define EVENT_WANTS_BHRB	(EVENT_BHRB_MASK << EVENT_BHRB_SHIFT)
238c2ecf20Sopenharmony_ci#define EVENT_IFM_MASK		3ull
248c2ecf20Sopenharmony_ci#define EVENT_IFM_SHIFT		60
258c2ecf20Sopenharmony_ci#define EVENT_THR_CMP_SHIFT	40	/* Threshold CMP value */
268c2ecf20Sopenharmony_ci#define EVENT_THR_CMP_MASK	0x3ff
278c2ecf20Sopenharmony_ci#define EVENT_THR_CTL_SHIFT	32	/* Threshold control value (start/stop) */
288c2ecf20Sopenharmony_ci#define EVENT_THR_CTL_MASK	0xffull
298c2ecf20Sopenharmony_ci#define EVENT_THR_SEL_SHIFT	29	/* Threshold select value */
308c2ecf20Sopenharmony_ci#define EVENT_THR_SEL_MASK	0x7
318c2ecf20Sopenharmony_ci#define EVENT_THRESH_SHIFT	29	/* All threshold bits */
328c2ecf20Sopenharmony_ci#define EVENT_THRESH_MASK	0x1fffffull
338c2ecf20Sopenharmony_ci#define EVENT_SAMPLE_SHIFT	24	/* Sampling mode & eligibility */
348c2ecf20Sopenharmony_ci#define EVENT_SAMPLE_MASK	0x1f
358c2ecf20Sopenharmony_ci#define EVENT_CACHE_SEL_SHIFT	20	/* L2/L3 cache select */
368c2ecf20Sopenharmony_ci#define EVENT_CACHE_SEL_MASK	0xf
378c2ecf20Sopenharmony_ci#define EVENT_IS_L1		(4 << EVENT_CACHE_SEL_SHIFT)
388c2ecf20Sopenharmony_ci#define EVENT_PMC_SHIFT		16	/* PMC number (1-based) */
398c2ecf20Sopenharmony_ci#define EVENT_PMC_MASK		0xf
408c2ecf20Sopenharmony_ci#define EVENT_UNIT_SHIFT	12	/* Unit */
418c2ecf20Sopenharmony_ci#define EVENT_UNIT_MASK		0xf
428c2ecf20Sopenharmony_ci#define EVENT_COMBINE_SHIFT	11	/* Combine bit */
438c2ecf20Sopenharmony_ci#define EVENT_COMBINE_MASK	0x1
448c2ecf20Sopenharmony_ci#define EVENT_COMBINE(v)	(((v) >> EVENT_COMBINE_SHIFT) & EVENT_COMBINE_MASK)
458c2ecf20Sopenharmony_ci#define EVENT_MARKED_SHIFT	8	/* Marked bit */
468c2ecf20Sopenharmony_ci#define EVENT_MARKED_MASK	0x1
478c2ecf20Sopenharmony_ci#define EVENT_IS_MARKED		(EVENT_MARKED_MASK << EVENT_MARKED_SHIFT)
488c2ecf20Sopenharmony_ci#define EVENT_PSEL_MASK		0xff	/* PMCxSEL value */
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci/* Bits defined by Linux */
518c2ecf20Sopenharmony_ci#define EVENT_LINUX_MASK	\
528c2ecf20Sopenharmony_ci	((EVENT_EBB_MASK  << EVENT_EBB_SHIFT)			|	\
538c2ecf20Sopenharmony_ci	 (EVENT_BHRB_MASK << EVENT_BHRB_SHIFT)			|	\
548c2ecf20Sopenharmony_ci	 (EVENT_IFM_MASK  << EVENT_IFM_SHIFT))
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#define EVENT_VALID_MASK	\
578c2ecf20Sopenharmony_ci	((EVENT_THRESH_MASK    << EVENT_THRESH_SHIFT)		|	\
588c2ecf20Sopenharmony_ci	 (EVENT_SAMPLE_MASK    << EVENT_SAMPLE_SHIFT)		|	\
598c2ecf20Sopenharmony_ci	 (EVENT_CACHE_SEL_MASK << EVENT_CACHE_SEL_SHIFT)	|	\
608c2ecf20Sopenharmony_ci	 (EVENT_PMC_MASK       << EVENT_PMC_SHIFT)		|	\
618c2ecf20Sopenharmony_ci	 (EVENT_UNIT_MASK      << EVENT_UNIT_SHIFT)		|	\
628c2ecf20Sopenharmony_ci	 (EVENT_COMBINE_MASK   << EVENT_COMBINE_SHIFT)		|	\
638c2ecf20Sopenharmony_ci	 (EVENT_MARKED_MASK    << EVENT_MARKED_SHIFT)		|	\
648c2ecf20Sopenharmony_ci	  EVENT_LINUX_MASK					|	\
658c2ecf20Sopenharmony_ci	  EVENT_PSEL_MASK)
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci#define ONLY_PLM \
688c2ecf20Sopenharmony_ci	(PERF_SAMPLE_BRANCH_USER        |\
698c2ecf20Sopenharmony_ci	 PERF_SAMPLE_BRANCH_KERNEL      |\
708c2ecf20Sopenharmony_ci	 PERF_SAMPLE_BRANCH_HV)
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci/* Contants to support power9 raw encoding format */
738c2ecf20Sopenharmony_ci#define p9_EVENT_COMBINE_SHIFT	10	/* Combine bit */
748c2ecf20Sopenharmony_ci#define p9_EVENT_COMBINE_MASK	0x3ull
758c2ecf20Sopenharmony_ci#define p9_EVENT_COMBINE(v)	(((v) >> p9_EVENT_COMBINE_SHIFT) & p9_EVENT_COMBINE_MASK)
768c2ecf20Sopenharmony_ci#define p9_SDAR_MODE_SHIFT	50
778c2ecf20Sopenharmony_ci#define p9_SDAR_MODE_MASK	0x3ull
788c2ecf20Sopenharmony_ci#define p9_SDAR_MODE(v)		(((v) >> p9_SDAR_MODE_SHIFT) & p9_SDAR_MODE_MASK)
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci#define p9_EVENT_VALID_MASK		\
818c2ecf20Sopenharmony_ci	((p9_SDAR_MODE_MASK   << p9_SDAR_MODE_SHIFT		|	\
828c2ecf20Sopenharmony_ci	(EVENT_THRESH_MASK    << EVENT_THRESH_SHIFT)		|	\
838c2ecf20Sopenharmony_ci	(EVENT_SAMPLE_MASK    << EVENT_SAMPLE_SHIFT)		|	\
848c2ecf20Sopenharmony_ci	(EVENT_CACHE_SEL_MASK << EVENT_CACHE_SEL_SHIFT)		|	\
858c2ecf20Sopenharmony_ci	(EVENT_PMC_MASK       << EVENT_PMC_SHIFT)		|	\
868c2ecf20Sopenharmony_ci	(EVENT_UNIT_MASK      << EVENT_UNIT_SHIFT)		|	\
878c2ecf20Sopenharmony_ci	(p9_EVENT_COMBINE_MASK << p9_EVENT_COMBINE_SHIFT)	|	\
888c2ecf20Sopenharmony_ci	(EVENT_MARKED_MASK    << EVENT_MARKED_SHIFT)		|	\
898c2ecf20Sopenharmony_ci	 EVENT_LINUX_MASK					|	\
908c2ecf20Sopenharmony_ci	 EVENT_PSEL_MASK))
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci/* Contants to support power10 raw encoding format */
938c2ecf20Sopenharmony_ci#define p10_SDAR_MODE_SHIFT		22
948c2ecf20Sopenharmony_ci#define p10_SDAR_MODE_MASK		0x3ull
958c2ecf20Sopenharmony_ci#define p10_SDAR_MODE(v)		(((v) >> p10_SDAR_MODE_SHIFT) & \
968c2ecf20Sopenharmony_ci					p10_SDAR_MODE_MASK)
978c2ecf20Sopenharmony_ci#define p10_EVENT_L2L3_SEL_MASK		0x1f
988c2ecf20Sopenharmony_ci#define p10_L2L3_SEL_SHIFT		3
998c2ecf20Sopenharmony_ci#define p10_L2L3_EVENT_SHIFT		40
1008c2ecf20Sopenharmony_ci#define p10_EVENT_THRESH_MASK		0xffffull
1018c2ecf20Sopenharmony_ci#define p10_EVENT_CACHE_SEL_MASK	0x3ull
1028c2ecf20Sopenharmony_ci#define p10_EVENT_MMCR3_MASK		0x7fffull
1038c2ecf20Sopenharmony_ci#define p10_EVENT_MMCR3_SHIFT		45
1048c2ecf20Sopenharmony_ci#define p10_EVENT_RADIX_SCOPE_QUAL_SHIFT	9
1058c2ecf20Sopenharmony_ci#define p10_EVENT_RADIX_SCOPE_QUAL_MASK	0x1
1068c2ecf20Sopenharmony_ci#define p10_MMCR1_RADIX_SCOPE_QUAL_SHIFT	45
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci#define p10_EVENT_VALID_MASK		\
1098c2ecf20Sopenharmony_ci	((p10_SDAR_MODE_MASK   << p10_SDAR_MODE_SHIFT		|	\
1108c2ecf20Sopenharmony_ci	(p10_EVENT_THRESH_MASK  << EVENT_THRESH_SHIFT)		|	\
1118c2ecf20Sopenharmony_ci	(EVENT_SAMPLE_MASK     << EVENT_SAMPLE_SHIFT)		|	\
1128c2ecf20Sopenharmony_ci	(p10_EVENT_CACHE_SEL_MASK  << EVENT_CACHE_SEL_SHIFT)	|	\
1138c2ecf20Sopenharmony_ci	(EVENT_PMC_MASK        << EVENT_PMC_SHIFT)		|	\
1148c2ecf20Sopenharmony_ci	(EVENT_UNIT_MASK       << EVENT_UNIT_SHIFT)		|	\
1158c2ecf20Sopenharmony_ci	(p9_EVENT_COMBINE_MASK << p9_EVENT_COMBINE_SHIFT)	|	\
1168c2ecf20Sopenharmony_ci	(p10_EVENT_MMCR3_MASK  << p10_EVENT_MMCR3_SHIFT)	|	\
1178c2ecf20Sopenharmony_ci	(EVENT_MARKED_MASK     << EVENT_MARKED_SHIFT)		|	\
1188c2ecf20Sopenharmony_ci	(p10_EVENT_RADIX_SCOPE_QUAL_MASK << p10_EVENT_RADIX_SCOPE_QUAL_SHIFT)	|	\
1198c2ecf20Sopenharmony_ci	 EVENT_LINUX_MASK					|	\
1208c2ecf20Sopenharmony_ci	EVENT_PSEL_MASK))
1218c2ecf20Sopenharmony_ci/*
1228c2ecf20Sopenharmony_ci * Layout of constraint bits:
1238c2ecf20Sopenharmony_ci *
1248c2ecf20Sopenharmony_ci *        60        56        52        48        44        40        36        32
1258c2ecf20Sopenharmony_ci * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - |
1268c2ecf20Sopenharmony_ci *   [   fab_match   ]         [       thresh_cmp      ] [   thresh_ctl    ] [   ]
1278c2ecf20Sopenharmony_ci *                                                                             |
1288c2ecf20Sopenharmony_ci *                                                                 thresh_sel -*
1298c2ecf20Sopenharmony_ci *
1308c2ecf20Sopenharmony_ci *        28        24        20        16        12         8         4         0
1318c2ecf20Sopenharmony_ci * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - |
1328c2ecf20Sopenharmony_ci *               [ ] |   [ ] |  [  sample ]   [     ]   [6] [5]   [4] [3]   [2] [1]
1338c2ecf20Sopenharmony_ci *                |  |    |  |                  |
1348c2ecf20Sopenharmony_ci *      BHRB IFM -*  |    |  |*radix_scope      |      Count of events for each PMC.
1358c2ecf20Sopenharmony_ci *              EBB -*    |                     |        p1, p2, p3, p4, p5, p6.
1368c2ecf20Sopenharmony_ci *      L1 I/D qualifier -*                     |
1378c2ecf20Sopenharmony_ci *                     nc - number of counters -*
1388c2ecf20Sopenharmony_ci *
1398c2ecf20Sopenharmony_ci * The PMC fields P1..P6, and NC, are adder fields. As we accumulate constraints
1408c2ecf20Sopenharmony_ci * we want the low bit of each field to be added to any existing value.
1418c2ecf20Sopenharmony_ci *
1428c2ecf20Sopenharmony_ci * Everything else is a value field.
1438c2ecf20Sopenharmony_ci */
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci#define CNST_FAB_MATCH_VAL(v)	(((v) & EVENT_THR_CTL_MASK) << 56)
1468c2ecf20Sopenharmony_ci#define CNST_FAB_MATCH_MASK	CNST_FAB_MATCH_VAL(EVENT_THR_CTL_MASK)
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci/* We just throw all the threshold bits into the constraint */
1498c2ecf20Sopenharmony_ci#define CNST_THRESH_VAL(v)	(((v) & EVENT_THRESH_MASK) << 32)
1508c2ecf20Sopenharmony_ci#define CNST_THRESH_MASK	CNST_THRESH_VAL(EVENT_THRESH_MASK)
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci#define CNST_THRESH_CTL_SEL_VAL(v)	(((v) & 0x7ffull) << 32)
1538c2ecf20Sopenharmony_ci#define CNST_THRESH_CTL_SEL_MASK	CNST_THRESH_CTL_SEL_VAL(0x7ff)
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci#define CNST_EBB_VAL(v)		(((v) & EVENT_EBB_MASK) << 24)
1568c2ecf20Sopenharmony_ci#define CNST_EBB_MASK		CNST_EBB_VAL(EVENT_EBB_MASK)
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci#define CNST_IFM_VAL(v)		(((v) & EVENT_IFM_MASK) << 25)
1598c2ecf20Sopenharmony_ci#define CNST_IFM_MASK		CNST_IFM_VAL(EVENT_IFM_MASK)
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci#define CNST_L1_QUAL_VAL(v)	(((v) & 3) << 22)
1628c2ecf20Sopenharmony_ci#define CNST_L1_QUAL_MASK	CNST_L1_QUAL_VAL(3)
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci#define CNST_SAMPLE_VAL(v)	(((v) & EVENT_SAMPLE_MASK) << 16)
1658c2ecf20Sopenharmony_ci#define CNST_SAMPLE_MASK	CNST_SAMPLE_VAL(EVENT_SAMPLE_MASK)
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci#define CNST_CACHE_GROUP_VAL(v)	(((v) & 0xffull) << 55)
1688c2ecf20Sopenharmony_ci#define CNST_CACHE_GROUP_MASK	CNST_CACHE_GROUP_VAL(0xff)
1698c2ecf20Sopenharmony_ci#define CNST_CACHE_PMC4_VAL	(1ull << 54)
1708c2ecf20Sopenharmony_ci#define CNST_CACHE_PMC4_MASK	CNST_CACHE_PMC4_VAL
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci#define CNST_L2L3_GROUP_VAL(v)	(((v) & 0x1full) << 55)
1738c2ecf20Sopenharmony_ci#define CNST_L2L3_GROUP_MASK	CNST_L2L3_GROUP_VAL(0x1f)
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci#define CNST_RADIX_SCOPE_GROUP_VAL(v)	(((v) & 0x1ull) << 21)
1768c2ecf20Sopenharmony_ci#define CNST_RADIX_SCOPE_GROUP_MASK	CNST_RADIX_SCOPE_GROUP_VAL(1)
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci/*
1798c2ecf20Sopenharmony_ci * For NC we are counting up to 4 events. This requires three bits, and we need
1808c2ecf20Sopenharmony_ci * the fifth event to overflow and set the 4th bit. To achieve that we bias the
1818c2ecf20Sopenharmony_ci * fields by 3 in test_adder.
1828c2ecf20Sopenharmony_ci */
1838c2ecf20Sopenharmony_ci#define CNST_NC_SHIFT		12
1848c2ecf20Sopenharmony_ci#define CNST_NC_VAL		(1 << CNST_NC_SHIFT)
1858c2ecf20Sopenharmony_ci#define CNST_NC_MASK		(8 << CNST_NC_SHIFT)
1868c2ecf20Sopenharmony_ci#define ISA207_TEST_ADDER	(3 << CNST_NC_SHIFT)
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci/*
1898c2ecf20Sopenharmony_ci * For the per-PMC fields we have two bits. The low bit is added, so if two
1908c2ecf20Sopenharmony_ci * events ask for the same PMC the sum will overflow, setting the high bit,
1918c2ecf20Sopenharmony_ci * indicating an error. So our mask sets the high bit.
1928c2ecf20Sopenharmony_ci */
1938c2ecf20Sopenharmony_ci#define CNST_PMC_SHIFT(pmc)	((pmc - 1) * 2)
1948c2ecf20Sopenharmony_ci#define CNST_PMC_VAL(pmc)	(1 << CNST_PMC_SHIFT(pmc))
1958c2ecf20Sopenharmony_ci#define CNST_PMC_MASK(pmc)	(2 << CNST_PMC_SHIFT(pmc))
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci/* Our add_fields is defined as: */
1988c2ecf20Sopenharmony_ci#define ISA207_ADD_FIELDS	\
1998c2ecf20Sopenharmony_ci	CNST_PMC_VAL(1) | CNST_PMC_VAL(2) | CNST_PMC_VAL(3) | \
2008c2ecf20Sopenharmony_ci	CNST_PMC_VAL(4) | CNST_PMC_VAL(5) | CNST_PMC_VAL(6) | CNST_NC_VAL
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci/* Bits in MMCR1 for PowerISA v2.07 */
2038c2ecf20Sopenharmony_ci#define MMCR1_UNIT_SHIFT(pmc)		(60 - (4 * ((pmc) - 1)))
2048c2ecf20Sopenharmony_ci#define MMCR1_COMBINE_SHIFT(pmc)	(35 - ((pmc) - 1))
2058c2ecf20Sopenharmony_ci#define MMCR1_PMCSEL_SHIFT(pmc)		(24 - (((pmc) - 1)) * 8)
2068c2ecf20Sopenharmony_ci#define MMCR1_FAB_SHIFT			36
2078c2ecf20Sopenharmony_ci#define MMCR1_DC_IC_QUAL_MASK		0x3
2088c2ecf20Sopenharmony_ci#define MMCR1_DC_IC_QUAL_SHIFT		46
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci/* MMCR1 Combine bits macro for power9 */
2118c2ecf20Sopenharmony_ci#define p9_MMCR1_COMBINE_SHIFT(pmc)	(38 - ((pmc - 1) * 2))
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci/* Bits in MMCRA for PowerISA v2.07 */
2148c2ecf20Sopenharmony_ci#define MMCRA_SAMP_MODE_SHIFT		1
2158c2ecf20Sopenharmony_ci#define MMCRA_SAMP_ELIG_SHIFT		4
2168c2ecf20Sopenharmony_ci#define MMCRA_THR_CTL_SHIFT		8
2178c2ecf20Sopenharmony_ci#define MMCRA_THR_SEL_SHIFT		16
2188c2ecf20Sopenharmony_ci#define MMCRA_THR_CMP_SHIFT		32
2198c2ecf20Sopenharmony_ci#define MMCRA_SDAR_MODE_SHIFT		42
2208c2ecf20Sopenharmony_ci#define MMCRA_SDAR_MODE_TLB		(1ull << MMCRA_SDAR_MODE_SHIFT)
2218c2ecf20Sopenharmony_ci#define MMCRA_SDAR_MODE_NO_UPDATES	~(0x3ull << MMCRA_SDAR_MODE_SHIFT)
2228c2ecf20Sopenharmony_ci#define MMCRA_SDAR_MODE_DCACHE		(2ull << MMCRA_SDAR_MODE_SHIFT)
2238c2ecf20Sopenharmony_ci#define MMCRA_IFM_SHIFT			30
2248c2ecf20Sopenharmony_ci#define MMCRA_THR_CTR_MANT_SHIFT	19
2258c2ecf20Sopenharmony_ci#define MMCRA_THR_CTR_MANT_MASK		0x7Ful
2268c2ecf20Sopenharmony_ci#define MMCRA_THR_CTR_MANT(v)		(((v) >> MMCRA_THR_CTR_MANT_SHIFT) &\
2278c2ecf20Sopenharmony_ci						MMCRA_THR_CTR_MANT_MASK)
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci#define MMCRA_THR_CTR_EXP_SHIFT		27
2308c2ecf20Sopenharmony_ci#define MMCRA_THR_CTR_EXP_MASK		0x7ul
2318c2ecf20Sopenharmony_ci#define MMCRA_THR_CTR_EXP(v)		(((v) >> MMCRA_THR_CTR_EXP_SHIFT) &\
2328c2ecf20Sopenharmony_ci						MMCRA_THR_CTR_EXP_MASK)
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci#define P10_MMCRA_THR_CTR_MANT_MASK	0xFFul
2358c2ecf20Sopenharmony_ci#define P10_MMCRA_THR_CTR_MANT(v)	(((v) >> MMCRA_THR_CTR_MANT_SHIFT) &\
2368c2ecf20Sopenharmony_ci						P10_MMCRA_THR_CTR_MANT_MASK)
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci/* MMCRA Threshold Compare bit constant for power9 */
2398c2ecf20Sopenharmony_ci#define p9_MMCRA_THR_CMP_SHIFT	45
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci/* Bits in MMCR2 for PowerISA v2.07 */
2428c2ecf20Sopenharmony_ci#define MMCR2_FCS(pmc)			(1ull << (63 - (((pmc) - 1) * 9)))
2438c2ecf20Sopenharmony_ci#define MMCR2_FCP(pmc)			(1ull << (62 - (((pmc) - 1) * 9)))
2448c2ecf20Sopenharmony_ci#define MMCR2_FCH(pmc)			(1ull << (57 - (((pmc) - 1) * 9)))
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci#define MAX_ALT				2
2478c2ecf20Sopenharmony_ci#define MAX_PMU_COUNTERS		6
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci/* Bits in MMCR3 for PowerISA v3.10 */
2508c2ecf20Sopenharmony_ci#define MMCR3_SHIFT(pmc)		(49 - (15 * ((pmc) - 1)))
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci#define ISA207_SIER_TYPE_SHIFT		15
2538c2ecf20Sopenharmony_ci#define ISA207_SIER_TYPE_MASK		(0x7ull << ISA207_SIER_TYPE_SHIFT)
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci#define ISA207_SIER_LDST_SHIFT		1
2568c2ecf20Sopenharmony_ci#define ISA207_SIER_LDST_MASK		(0x7ull << ISA207_SIER_LDST_SHIFT)
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci#define ISA207_SIER_DATA_SRC_SHIFT	53
2598c2ecf20Sopenharmony_ci#define ISA207_SIER_DATA_SRC_MASK	(0x7ull << ISA207_SIER_DATA_SRC_SHIFT)
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci#define P(a, b)				PERF_MEM_S(a, b)
2628c2ecf20Sopenharmony_ci#define PH(a, b)			(P(LVL, HIT) | P(a, b))
2638c2ecf20Sopenharmony_ci#define PM(a, b)			(P(LVL, MISS) | P(a, b))
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ciint isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp);
2668c2ecf20Sopenharmony_ciint isa207_compute_mmcr(u64 event[], int n_ev,
2678c2ecf20Sopenharmony_ci				unsigned int hwc[], struct mmcr_regs *mmcr,
2688c2ecf20Sopenharmony_ci				struct perf_event *pevents[]);
2698c2ecf20Sopenharmony_civoid isa207_disable_pmc(unsigned int pmc, struct mmcr_regs *mmcr);
2708c2ecf20Sopenharmony_ciint isa207_get_alternatives(u64 event, u64 alt[], int size, unsigned int flags,
2718c2ecf20Sopenharmony_ci					const unsigned int ev_alt[][MAX_ALT]);
2728c2ecf20Sopenharmony_civoid isa207_get_mem_data_src(union perf_mem_data_src *dsrc, u32 flags,
2738c2ecf20Sopenharmony_ci							struct pt_regs *regs);
2748c2ecf20Sopenharmony_civoid isa207_get_mem_weight(u64 *weight);
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci#endif
277