master
  1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2008 Joseph Koshy
  5 * All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 *
 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 26 * SUCH DAMAGE.
 27 */
 28
 29#ifndef _DEV_HWPMC_CORE_H_
 30#define	_DEV_HWPMC_CORE_H_ 1
 31
 32#define	IA32_PERF_CAPABILITIES		0x345
 33#define	PERFCAP_LBR_FORMAT		0x003f
 34#define	PERFCAP_PEBS_TRAP		0x0040
 35#define	PERFCAP_PEBS_SAVEARCH		0x0080
 36#define	PERFCAP_PEBS_RECFORMAT		0x0f00
 37#define	PERFCAP_SMM_FREEZE		0x1000
 38#define	PERFCAP_FW_WRITE		0x2000	/* full width write aliases */
 39
 40#define	IAF_OS		0x1
 41#define	IAF_USR		0x2
 42#define	IAF_ANY		0x4
 43#define	IAF_PMI		0x8
 44
 45/*
 46 * Programmable PMCs.
 47 */
 48struct pmc_md_iap_op_pmcallocate {
 49	uint64_t	pm_iap_config;
 50	uint64_t	pm_iap_rsp;
 51};
 52
 53#define	IAP_EVSEL(C)	((C) & 0xFF)
 54#define	IAP_UMASK(C)	(((C) & 0xFF) << 8)
 55#define	IAP_USR		(1 << 16)
 56#define	IAP_OS		(1 << 17)
 57#define	IAP_EDGE	(1 << 18)
 58#define	IAP_INT		(1 << 20)
 59#define	IAP_ANY		(1 << 21)
 60#define	IAP_EN		(1 << 22)
 61#define	IAP_INV		(1 << 23)
 62#define	IAP_CMASK(C)	(((C) & 0xFF) << 24)
 63
 64#define	IAP_EVSEL_GET(C)	((C) & 0xFF)
 65#define	IAP_UMASK_GET(C)	(((C) & 0xFF00) >> 8)
 66
 67#define	IA_OFFCORE_RSP_MASK_I7WM	0x000000F7FF
 68#define	IA_OFFCORE_RSP_MASK_SBIB	0x3F807F8FFF
 69
 70#ifdef	_KERNEL
 71
 72/*
 73 * Fixed-function counters.
 74 */
 75
 76#define	IAF_MASK				0x000000010000000f
 77
 78#define	IAF_CTR0				0x309
 79#define	IAF_CTR1				0x30A
 80#define	IAF_CTR2				0x30B
 81
 82/*
 83 * The IAF_CTRL MSR is laid out in the following way.
 84 *
 85 * Bit Position    Use
 86 * 63 - 45         Reserved (do not touch)
 87 * 44              Ctr 3 Adaptive Record (v5)
 88 * 43 - 41         Reserved (do not touch)
 89 * 40              Ctr 2 Adaptive Record (v5)
 90 * 39 - 37         Reserved (do not touch)
 91 * 36              Ctr 1 Adaptive Record (v5)
 92 * 35 - 33         Reserved (do not touch)
 93 * 32              Ctr 0 Adaptive Record (v5)
 94 * 15              Ctr 3 PMI
 95 * 14              Ctr 3 Any Thread (v3)
 96 * 13-12           Ctr 3 Enable
 97 * 11              Ctr 2 PMI
 98 * 10              Ctr 2 Any Thread (v3)
 99 * 9-8             Ctr 2 Enable
100 * 7               Ctr 1 PMI
101 * 6               Ctr 1 Any Thread (v3)
102 * 5-4             Ctr 1 Enable
103 * 3               Ctr 0 PMI
104 * 2               Ctr 0 Any Thread (v3)
105 * 1-0             Ctr 0 Enable (3: All Levels, 2: User, 1: OS, 0: Disable)
106 */
107
108#define	IAF_OFFSET				32
109#define	IAF_CTRL				0x38D
110
111/*
112 * Programmable counters.
113 */
114
115#define	IAP_PMC0				0x0C1
116#define	IAP_A_PMC0				0x4C1
117
118/*
119 * IAP_EVSEL(n) is laid out in the following way.
120 *
121 * Bit Position    Use
122 * 63-35           Reserved (do not touch)
123 * 34              Adaptive Record (v5)
124 * 33              IN_TX (v3)
125 * 32              IN_TXCP (v3)
126 * 31-24           Counter Mask
127 * 23              Invert
128 * 22              Enable
129 * 21              Any Thread (v3)
130 * 20              APIC Interrupt Enable
131 * 19              Pin Control
132 * 18              Edge Detect
133 * 17              OS
134 * 16              User
135 * 15-8            Unit Mask
136 * 7-0             Event Select
137 */
138
139#define	IAP_EVSEL0				0x186
140
141/*
142 * Simplified programming interface in Intel Performance Architecture
143 * v2 and later.
144 */
145
146#define	IA_GLOBAL_STATUS			0x38E
147#define	IA_GLOBAL_CTRL				0x38F
148
149/*
150 * IA_GLOBAL_CTRL is laid out in the following way.
151 * 
152 * Bit Position    Use
153 * 63-49           Reserved (do not touch)
154 * 48              Perf Metrics Enable (v5)
155 * 47-36           Reserved (do not touch)
156 * 35              IAF Counter 3 Enable
157 * 34              IAF Counter 2 Enable
158 * 33              IAF Counter 1 Enable
159 * 32              IAF Counter 0 Enable
160 * 31-0            Depends on programmable counters
161 */
162
163#define	IA_GLOBAL_OVF_CTRL			0x390
164#define	IA_GLOBAL_STATUS_RESET			0x390
165#define	IA_GLOBAL_STATUS_SET			0x391		/* v4 */
166
167#define	IA_GLOBAL_STATUS_FLAG_CONDCHG		(1ULL << 63)
168#define	IA_GLOBAL_STATUS_FLAG_OVFBUF		(1ULL << 62)
169#define	IA_GLOBAL_STATUS_FLAG_OVFUNCORE		(1ULL << 61)	/* v3 */
170#define	IA_GLOBAL_STATUS_FLAG_ASCI		(1ULL << 60)	/* v4 */
171#define	IA_GLOBAL_STATUS_FLAG_CTR_FRZ		(1ULL << 59)	/* v4 */
172#define	IA_GLOBAL_STATUS_FLAG_LBP_FRZ		(1ULL << 58)	/* v4 */
173#define	IA_GLOBAL_STATUS_FLAG_TRACETOPAPMI	(1ULL << 55)	/* v4 */
174
175#define	IA_GLOBAL_INUSE				0x392		/* v4 */
176
177/*
178 * Offcore response configuration.
179 */
180#define	IA_OFFCORE_RSP0				0x1A6
181#define	IA_OFFCORE_RSP1				0x1A7
182
183struct pmc_md_iaf_pmc {
184	uint64_t	pm_iaf_ctrl;
185};
186
187struct pmc_md_iap_pmc {
188	uint64_t	pm_iap_evsel;
189	uint64_t	pm_iap_rsp;
190};
191
192/*
193 * Prototypes.
194 */
195
196int	pmc_core_initialize(struct pmc_mdep *_md, int _maxcpu,
197	    int _version_override);
198void	pmc_core_finalize(struct pmc_mdep *_md);
199
200int	pmc_iaf_initialize(struct pmc_mdep *_md, int _maxcpu, int _npmc, int _width);
201void	pmc_iaf_finalize(struct pmc_mdep *_md);
202
203int	pmc_iap_initialize(struct pmc_mdep *_md, int _maxcpu, int _npmc, int _width,
204	    int _flags);
205void	pmc_iap_finalize(struct pmc_mdep *_md);
206
207#endif	/* _KERNEL */
208#endif	/* _DEV_HWPMC_CORE_H */