1 // SPDX-License-Identifier: GPL-2.0
2 /* SandyBridge-EP/IvyTown uncore support */
3 #include "uncore.h"
4 #include "uncore_discovery.h"
5 
6 /* SNB-EP pci bus to socket mapping */
7 #define SNBEP_CPUNODEID			0x40
8 #define SNBEP_GIDNIDMAP			0x54
9 
10 /* SNB-EP Box level control */
11 #define SNBEP_PMON_BOX_CTL_RST_CTRL	(1 << 0)
12 #define SNBEP_PMON_BOX_CTL_RST_CTRS	(1 << 1)
13 #define SNBEP_PMON_BOX_CTL_FRZ		(1 << 8)
14 #define SNBEP_PMON_BOX_CTL_FRZ_EN	(1 << 16)
15 #define SNBEP_PMON_BOX_CTL_INT		(SNBEP_PMON_BOX_CTL_RST_CTRL | \
16 					 SNBEP_PMON_BOX_CTL_RST_CTRS | \
17 					 SNBEP_PMON_BOX_CTL_FRZ_EN)
18 /* SNB-EP event control */
19 #define SNBEP_PMON_CTL_EV_SEL_MASK	0x000000ff
20 #define SNBEP_PMON_CTL_UMASK_MASK	0x0000ff00
21 #define SNBEP_PMON_CTL_RST		(1 << 17)
22 #define SNBEP_PMON_CTL_EDGE_DET		(1 << 18)
23 #define SNBEP_PMON_CTL_EV_SEL_EXT	(1 << 21)
24 #define SNBEP_PMON_CTL_EN		(1 << 22)
25 #define SNBEP_PMON_CTL_INVERT		(1 << 23)
26 #define SNBEP_PMON_CTL_TRESH_MASK	0xff000000
27 #define SNBEP_PMON_RAW_EVENT_MASK	(SNBEP_PMON_CTL_EV_SEL_MASK | \
28 					 SNBEP_PMON_CTL_UMASK_MASK | \
29 					 SNBEP_PMON_CTL_EDGE_DET | \
30 					 SNBEP_PMON_CTL_INVERT | \
31 					 SNBEP_PMON_CTL_TRESH_MASK)
32 
33 /* SNB-EP Ubox event control */
34 #define SNBEP_U_MSR_PMON_CTL_TRESH_MASK		0x1f000000
35 #define SNBEP_U_MSR_PMON_RAW_EVENT_MASK		\
36 				(SNBEP_PMON_CTL_EV_SEL_MASK | \
37 				 SNBEP_PMON_CTL_UMASK_MASK | \
38 				 SNBEP_PMON_CTL_EDGE_DET | \
39 				 SNBEP_PMON_CTL_INVERT | \
40 				 SNBEP_U_MSR_PMON_CTL_TRESH_MASK)
41 
42 #define SNBEP_CBO_PMON_CTL_TID_EN		(1 << 19)
43 #define SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK	(SNBEP_PMON_RAW_EVENT_MASK | \
44 						 SNBEP_CBO_PMON_CTL_TID_EN)
45 
46 /* SNB-EP PCU event control */
47 #define SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK	0x0000c000
48 #define SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK	0x1f000000
49 #define SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT	(1 << 30)
50 #define SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET	(1 << 31)
51 #define SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK	\
52 				(SNBEP_PMON_CTL_EV_SEL_MASK | \
53 				 SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
54 				 SNBEP_PMON_CTL_EDGE_DET | \
55 				 SNBEP_PMON_CTL_INVERT | \
56 				 SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK | \
57 				 SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
58 				 SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET)
59 
60 #define SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK	\
61 				(SNBEP_PMON_RAW_EVENT_MASK | \
62 				 SNBEP_PMON_CTL_EV_SEL_EXT)
63 
64 /* SNB-EP pci control register */
65 #define SNBEP_PCI_PMON_BOX_CTL			0xf4
66 #define SNBEP_PCI_PMON_CTL0			0xd8
67 /* SNB-EP pci counter register */
68 #define SNBEP_PCI_PMON_CTR0			0xa0
69 
70 /* SNB-EP home agent register */
71 #define SNBEP_HA_PCI_PMON_BOX_ADDRMATCH0	0x40
72 #define SNBEP_HA_PCI_PMON_BOX_ADDRMATCH1	0x44
73 #define SNBEP_HA_PCI_PMON_BOX_OPCODEMATCH	0x48
74 /* SNB-EP memory controller register */
75 #define SNBEP_MC_CHy_PCI_PMON_FIXED_CTL		0xf0
76 #define SNBEP_MC_CHy_PCI_PMON_FIXED_CTR		0xd0
77 /* SNB-EP QPI register */
78 #define SNBEP_Q_Py_PCI_PMON_PKT_MATCH0		0x228
79 #define SNBEP_Q_Py_PCI_PMON_PKT_MATCH1		0x22c
80 #define SNBEP_Q_Py_PCI_PMON_PKT_MASK0		0x238
81 #define SNBEP_Q_Py_PCI_PMON_PKT_MASK1		0x23c
82 
83 /* SNB-EP Ubox register */
84 #define SNBEP_U_MSR_PMON_CTR0			0xc16
85 #define SNBEP_U_MSR_PMON_CTL0			0xc10
86 
87 #define SNBEP_U_MSR_PMON_UCLK_FIXED_CTL		0xc08
88 #define SNBEP_U_MSR_PMON_UCLK_FIXED_CTR		0xc09
89 
90 /* SNB-EP Cbo register */
91 #define SNBEP_C0_MSR_PMON_CTR0			0xd16
92 #define SNBEP_C0_MSR_PMON_CTL0			0xd10
93 #define SNBEP_C0_MSR_PMON_BOX_CTL		0xd04
94 #define SNBEP_C0_MSR_PMON_BOX_FILTER		0xd14
95 #define SNBEP_CBO_MSR_OFFSET			0x20
96 
97 #define SNBEP_CB0_MSR_PMON_BOX_FILTER_TID	0x1f
98 #define SNBEP_CB0_MSR_PMON_BOX_FILTER_NID	0x3fc00
99 #define SNBEP_CB0_MSR_PMON_BOX_FILTER_STATE	0x7c0000
100 #define SNBEP_CB0_MSR_PMON_BOX_FILTER_OPC	0xff800000
101 
102 #define SNBEP_CBO_EVENT_EXTRA_REG(e, m, i) {	\
103 	.event = (e),				\
104 	.msr = SNBEP_C0_MSR_PMON_BOX_FILTER,	\
105 	.config_mask = (m),			\
106 	.idx = (i)				\
107 }
108 
109 /* SNB-EP PCU register */
110 #define SNBEP_PCU_MSR_PMON_CTR0			0xc36
111 #define SNBEP_PCU_MSR_PMON_CTL0			0xc30
112 #define SNBEP_PCU_MSR_PMON_BOX_CTL		0xc24
113 #define SNBEP_PCU_MSR_PMON_BOX_FILTER		0xc34
114 #define SNBEP_PCU_MSR_PMON_BOX_FILTER_MASK	0xffffffff
115 #define SNBEP_PCU_MSR_CORE_C3_CTR		0x3fc
116 #define SNBEP_PCU_MSR_CORE_C6_CTR		0x3fd
117 
118 /* IVBEP event control */
119 #define IVBEP_PMON_BOX_CTL_INT		(SNBEP_PMON_BOX_CTL_RST_CTRL | \
120 					 SNBEP_PMON_BOX_CTL_RST_CTRS)
121 #define IVBEP_PMON_RAW_EVENT_MASK		(SNBEP_PMON_CTL_EV_SEL_MASK | \
122 					 SNBEP_PMON_CTL_UMASK_MASK | \
123 					 SNBEP_PMON_CTL_EDGE_DET | \
124 					 SNBEP_PMON_CTL_TRESH_MASK)
125 /* IVBEP Ubox */
126 #define IVBEP_U_MSR_PMON_GLOBAL_CTL		0xc00
127 #define IVBEP_U_PMON_GLOBAL_FRZ_ALL		(1 << 31)
128 #define IVBEP_U_PMON_GLOBAL_UNFRZ_ALL		(1 << 29)
129 
130 #define IVBEP_U_MSR_PMON_RAW_EVENT_MASK	\
131 				(SNBEP_PMON_CTL_EV_SEL_MASK | \
132 				 SNBEP_PMON_CTL_UMASK_MASK | \
133 				 SNBEP_PMON_CTL_EDGE_DET | \
134 				 SNBEP_U_MSR_PMON_CTL_TRESH_MASK)
135 /* IVBEP Cbo */
136 #define IVBEP_CBO_MSR_PMON_RAW_EVENT_MASK		(IVBEP_PMON_RAW_EVENT_MASK | \
137 						 SNBEP_CBO_PMON_CTL_TID_EN)
138 
139 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_TID		(0x1fULL << 0)
140 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_LINK	(0xfULL << 5)
141 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_STATE	(0x3fULL << 17)
142 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_NID		(0xffffULL << 32)
143 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_OPC		(0x1ffULL << 52)
144 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_C6		(0x1ULL << 61)
145 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_NC		(0x1ULL << 62)
146 #define IVBEP_CB0_MSR_PMON_BOX_FILTER_ISOC	(0x1ULL << 63)
147 
148 /* IVBEP home agent */
149 #define IVBEP_HA_PCI_PMON_CTL_Q_OCC_RST		(1 << 16)
150 #define IVBEP_HA_PCI_PMON_RAW_EVENT_MASK		\
151 				(IVBEP_PMON_RAW_EVENT_MASK | \
152 				 IVBEP_HA_PCI_PMON_CTL_Q_OCC_RST)
153 /* IVBEP PCU */
154 #define IVBEP_PCU_MSR_PMON_RAW_EVENT_MASK	\
155 				(SNBEP_PMON_CTL_EV_SEL_MASK | \
156 				 SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
157 				 SNBEP_PMON_CTL_EDGE_DET | \
158 				 SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK | \
159 				 SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
160 				 SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET)
161 /* IVBEP QPI */
162 #define IVBEP_QPI_PCI_PMON_RAW_EVENT_MASK	\
163 				(IVBEP_PMON_RAW_EVENT_MASK | \
164 				 SNBEP_PMON_CTL_EV_SEL_EXT)
165 
166 #define __BITS_VALUE(x, i, n)  ((typeof(x))(((x) >> ((i) * (n))) & \
167 				((1ULL << (n)) - 1)))
168 
169 /* Haswell-EP Ubox */
170 #define HSWEP_U_MSR_PMON_CTR0			0x709
171 #define HSWEP_U_MSR_PMON_CTL0			0x705
172 #define HSWEP_U_MSR_PMON_FILTER			0x707
173 
174 #define HSWEP_U_MSR_PMON_UCLK_FIXED_CTL		0x703
175 #define HSWEP_U_MSR_PMON_UCLK_FIXED_CTR		0x704
176 
177 #define HSWEP_U_MSR_PMON_BOX_FILTER_TID		(0x1 << 0)
178 #define HSWEP_U_MSR_PMON_BOX_FILTER_CID		(0x1fULL << 1)
179 #define HSWEP_U_MSR_PMON_BOX_FILTER_MASK \
180 					(HSWEP_U_MSR_PMON_BOX_FILTER_TID | \
181 					 HSWEP_U_MSR_PMON_BOX_FILTER_CID)
182 
183 /* Haswell-EP CBo */
184 #define HSWEP_C0_MSR_PMON_CTR0			0xe08
185 #define HSWEP_C0_MSR_PMON_CTL0			0xe01
186 #define HSWEP_C0_MSR_PMON_BOX_CTL			0xe00
187 #define HSWEP_C0_MSR_PMON_BOX_FILTER0		0xe05
188 #define HSWEP_CBO_MSR_OFFSET			0x10
189 
190 
191 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_TID		(0x3fULL << 0)
192 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_LINK	(0xfULL << 6)
193 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_STATE	(0x7fULL << 17)
194 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_NID		(0xffffULL << 32)
195 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_OPC		(0x1ffULL << 52)
196 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_C6		(0x1ULL << 61)
197 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_NC		(0x1ULL << 62)
198 #define HSWEP_CB0_MSR_PMON_BOX_FILTER_ISOC	(0x1ULL << 63)
199 
200 
201 /* Haswell-EP Sbox */
202 #define HSWEP_S0_MSR_PMON_CTR0			0x726
203 #define HSWEP_S0_MSR_PMON_CTL0			0x721
204 #define HSWEP_S0_MSR_PMON_BOX_CTL			0x720
205 #define HSWEP_SBOX_MSR_OFFSET			0xa
206 #define HSWEP_S_MSR_PMON_RAW_EVENT_MASK		(SNBEP_PMON_RAW_EVENT_MASK | \
207 						 SNBEP_CBO_PMON_CTL_TID_EN)
208 
209 /* Haswell-EP PCU */
210 #define HSWEP_PCU_MSR_PMON_CTR0			0x717
211 #define HSWEP_PCU_MSR_PMON_CTL0			0x711
212 #define HSWEP_PCU_MSR_PMON_BOX_CTL		0x710
213 #define HSWEP_PCU_MSR_PMON_BOX_FILTER		0x715
214 
215 /* KNL Ubox */
216 #define KNL_U_MSR_PMON_RAW_EVENT_MASK \
217 					(SNBEP_U_MSR_PMON_RAW_EVENT_MASK | \
218 						SNBEP_CBO_PMON_CTL_TID_EN)
219 /* KNL CHA */
220 #define KNL_CHA_MSR_OFFSET			0xc
221 #define KNL_CHA_MSR_PMON_CTL_QOR		(1 << 16)
222 #define KNL_CHA_MSR_PMON_RAW_EVENT_MASK \
223 					(SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK | \
224 					 KNL_CHA_MSR_PMON_CTL_QOR)
225 #define KNL_CHA_MSR_PMON_BOX_FILTER_TID		0x1ff
226 #define KNL_CHA_MSR_PMON_BOX_FILTER_STATE	(7 << 18)
227 #define KNL_CHA_MSR_PMON_BOX_FILTER_OP		(0xfffffe2aULL << 32)
228 #define KNL_CHA_MSR_PMON_BOX_FILTER_REMOTE_NODE	(0x1ULL << 32)
229 #define KNL_CHA_MSR_PMON_BOX_FILTER_LOCAL_NODE	(0x1ULL << 33)
230 #define KNL_CHA_MSR_PMON_BOX_FILTER_NNC		(0x1ULL << 37)
231 
232 /* KNL EDC/MC UCLK */
233 #define KNL_UCLK_MSR_PMON_CTR0_LOW		0x400
234 #define KNL_UCLK_MSR_PMON_CTL0			0x420
235 #define KNL_UCLK_MSR_PMON_BOX_CTL		0x430
236 #define KNL_UCLK_MSR_PMON_UCLK_FIXED_LOW	0x44c
237 #define KNL_UCLK_MSR_PMON_UCLK_FIXED_CTL	0x454
238 #define KNL_PMON_FIXED_CTL_EN			0x1
239 
240 /* KNL EDC */
241 #define KNL_EDC0_ECLK_MSR_PMON_CTR0_LOW		0xa00
242 #define KNL_EDC0_ECLK_MSR_PMON_CTL0		0xa20
243 #define KNL_EDC0_ECLK_MSR_PMON_BOX_CTL		0xa30
244 #define KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_LOW	0xa3c
245 #define KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_CTL	0xa44
246 
247 /* KNL MC */
248 #define KNL_MC0_CH0_MSR_PMON_CTR0_LOW		0xb00
249 #define KNL_MC0_CH0_MSR_PMON_CTL0		0xb20
250 #define KNL_MC0_CH0_MSR_PMON_BOX_CTL		0xb30
251 #define KNL_MC0_CH0_MSR_PMON_FIXED_LOW		0xb3c
252 #define KNL_MC0_CH0_MSR_PMON_FIXED_CTL		0xb44
253 
254 /* KNL IRP */
255 #define KNL_IRP_PCI_PMON_BOX_CTL		0xf0
256 #define KNL_IRP_PCI_PMON_RAW_EVENT_MASK		(SNBEP_PMON_RAW_EVENT_MASK | \
257 						 KNL_CHA_MSR_PMON_CTL_QOR)
258 /* KNL PCU */
259 #define KNL_PCU_PMON_CTL_EV_SEL_MASK		0x0000007f
260 #define KNL_PCU_PMON_CTL_USE_OCC_CTR		(1 << 7)
261 #define KNL_PCU_MSR_PMON_CTL_TRESH_MASK		0x3f000000
262 #define KNL_PCU_MSR_PMON_RAW_EVENT_MASK	\
263 				(KNL_PCU_PMON_CTL_EV_SEL_MASK | \
264 				 KNL_PCU_PMON_CTL_USE_OCC_CTR | \
265 				 SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
266 				 SNBEP_PMON_CTL_EDGE_DET | \
267 				 SNBEP_CBO_PMON_CTL_TID_EN | \
268 				 SNBEP_PMON_CTL_INVERT | \
269 				 KNL_PCU_MSR_PMON_CTL_TRESH_MASK | \
270 				 SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
271 				 SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET)
272 
273 /* SKX pci bus to socket mapping */
274 #define SKX_CPUNODEID			0xc0
275 #define SKX_GIDNIDMAP			0xd4
276 
277 /*
278  * The CPU_BUS_NUMBER MSR returns the values of the respective CPUBUSNO CSR
279  * that BIOS programmed. MSR has package scope.
280  * |  Bit  |  Default  |  Description
281  * | [63]  |    00h    | VALID - When set, indicates the CPU bus
282  *                       numbers have been initialized. (RO)
283  * |[62:48]|    ---    | Reserved
284  * |[47:40]|    00h    | BUS_NUM_5 - Return the bus number BIOS assigned
285  *                       CPUBUSNO(5). (RO)
286  * |[39:32]|    00h    | BUS_NUM_4 - Return the bus number BIOS assigned
287  *                       CPUBUSNO(4). (RO)
288  * |[31:24]|    00h    | BUS_NUM_3 - Return the bus number BIOS assigned
289  *                       CPUBUSNO(3). (RO)
290  * |[23:16]|    00h    | BUS_NUM_2 - Return the bus number BIOS assigned
291  *                       CPUBUSNO(2). (RO)
292  * |[15:8] |    00h    | BUS_NUM_1 - Return the bus number BIOS assigned
293  *                       CPUBUSNO(1). (RO)
294  * | [7:0] |    00h    | BUS_NUM_0 - Return the bus number BIOS assigned
295  *                       CPUBUSNO(0). (RO)
296  */
297 #define SKX_MSR_CPU_BUS_NUMBER		0x300
298 #define SKX_MSR_CPU_BUS_VALID_BIT	(1ULL << 63)
299 #define BUS_NUM_STRIDE			8
300 
301 /* SKX CHA */
302 #define SKX_CHA_MSR_PMON_BOX_FILTER_TID		(0x1ffULL << 0)
303 #define SKX_CHA_MSR_PMON_BOX_FILTER_LINK	(0xfULL << 9)
304 #define SKX_CHA_MSR_PMON_BOX_FILTER_STATE	(0x3ffULL << 17)
305 #define SKX_CHA_MSR_PMON_BOX_FILTER_REM		(0x1ULL << 32)
306 #define SKX_CHA_MSR_PMON_BOX_FILTER_LOC		(0x1ULL << 33)
307 #define SKX_CHA_MSR_PMON_BOX_FILTER_ALL_OPC	(0x1ULL << 35)
308 #define SKX_CHA_MSR_PMON_BOX_FILTER_NM		(0x1ULL << 36)
309 #define SKX_CHA_MSR_PMON_BOX_FILTER_NOT_NM	(0x1ULL << 37)
310 #define SKX_CHA_MSR_PMON_BOX_FILTER_OPC0	(0x3ffULL << 41)
311 #define SKX_CHA_MSR_PMON_BOX_FILTER_OPC1	(0x3ffULL << 51)
312 #define SKX_CHA_MSR_PMON_BOX_FILTER_C6		(0x1ULL << 61)
313 #define SKX_CHA_MSR_PMON_BOX_FILTER_NC		(0x1ULL << 62)
314 #define SKX_CHA_MSR_PMON_BOX_FILTER_ISOC	(0x1ULL << 63)
315 
316 /* SKX IIO */
317 #define SKX_IIO0_MSR_PMON_CTL0		0xa48
318 #define SKX_IIO0_MSR_PMON_CTR0		0xa41
319 #define SKX_IIO0_MSR_PMON_BOX_CTL	0xa40
320 #define SKX_IIO_MSR_OFFSET		0x20
321 
322 #define SKX_PMON_CTL_TRESH_MASK		(0xff << 24)
323 #define SKX_PMON_CTL_TRESH_MASK_EXT	(0xf)
324 #define SKX_PMON_CTL_CH_MASK		(0xff << 4)
325 #define SKX_PMON_CTL_FC_MASK		(0x7 << 12)
326 #define SKX_IIO_PMON_RAW_EVENT_MASK	(SNBEP_PMON_CTL_EV_SEL_MASK | \
327 					 SNBEP_PMON_CTL_UMASK_MASK | \
328 					 SNBEP_PMON_CTL_EDGE_DET | \
329 					 SNBEP_PMON_CTL_INVERT | \
330 					 SKX_PMON_CTL_TRESH_MASK)
331 #define SKX_IIO_PMON_RAW_EVENT_MASK_EXT	(SKX_PMON_CTL_TRESH_MASK_EXT | \
332 					 SKX_PMON_CTL_CH_MASK | \
333 					 SKX_PMON_CTL_FC_MASK)
334 
335 /* SKX IRP */
336 #define SKX_IRP0_MSR_PMON_CTL0		0xa5b
337 #define SKX_IRP0_MSR_PMON_CTR0		0xa59
338 #define SKX_IRP0_MSR_PMON_BOX_CTL	0xa58
339 #define SKX_IRP_MSR_OFFSET		0x20
340 
341 /* SKX UPI */
342 #define SKX_UPI_PCI_PMON_CTL0		0x350
343 #define SKX_UPI_PCI_PMON_CTR0		0x318
344 #define SKX_UPI_PCI_PMON_BOX_CTL	0x378
345 #define SKX_UPI_CTL_UMASK_EXT		0xffefff
346 
347 /* SKX M2M */
348 #define SKX_M2M_PCI_PMON_CTL0		0x228
349 #define SKX_M2M_PCI_PMON_CTR0		0x200
350 #define SKX_M2M_PCI_PMON_BOX_CTL	0x258
351 
352 /* Memory Map registers device ID */
353 #define SNR_ICX_MESH2IIO_MMAP_DID		0x9a2
354 #define SNR_ICX_SAD_CONTROL_CFG		0x3f4
355 
356 /* Getting I/O stack id in SAD_COTROL_CFG notation */
357 #define SAD_CONTROL_STACK_ID(data)		(((data) >> 4) & 0x7)
358 
359 /* SNR Ubox */
360 #define SNR_U_MSR_PMON_CTR0			0x1f98
361 #define SNR_U_MSR_PMON_CTL0			0x1f91
362 #define SNR_U_MSR_PMON_UCLK_FIXED_CTL		0x1f93
363 #define SNR_U_MSR_PMON_UCLK_FIXED_CTR		0x1f94
364 
365 /* SNR CHA */
366 #define SNR_CHA_RAW_EVENT_MASK_EXT		0x3ffffff
367 #define SNR_CHA_MSR_PMON_CTL0			0x1c01
368 #define SNR_CHA_MSR_PMON_CTR0			0x1c08
369 #define SNR_CHA_MSR_PMON_BOX_CTL		0x1c00
370 #define SNR_C0_MSR_PMON_BOX_FILTER0		0x1c05
371 
372 
373 /* SNR IIO */
374 #define SNR_IIO_MSR_PMON_CTL0			0x1e08
375 #define SNR_IIO_MSR_PMON_CTR0			0x1e01
376 #define SNR_IIO_MSR_PMON_BOX_CTL		0x1e00
377 #define SNR_IIO_MSR_OFFSET			0x10
378 #define SNR_IIO_PMON_RAW_EVENT_MASK_EXT		0x7ffff
379 
380 /* SNR IRP */
381 #define SNR_IRP0_MSR_PMON_CTL0			0x1ea8
382 #define SNR_IRP0_MSR_PMON_CTR0			0x1ea1
383 #define SNR_IRP0_MSR_PMON_BOX_CTL		0x1ea0
384 #define SNR_IRP_MSR_OFFSET			0x10
385 
386 /* SNR M2PCIE */
387 #define SNR_M2PCIE_MSR_PMON_CTL0		0x1e58
388 #define SNR_M2PCIE_MSR_PMON_CTR0		0x1e51
389 #define SNR_M2PCIE_MSR_PMON_BOX_CTL		0x1e50
390 #define SNR_M2PCIE_MSR_OFFSET			0x10
391 
392 /* SNR PCU */
393 #define SNR_PCU_MSR_PMON_CTL0			0x1ef1
394 #define SNR_PCU_MSR_PMON_CTR0			0x1ef8
395 #define SNR_PCU_MSR_PMON_BOX_CTL		0x1ef0
396 #define SNR_PCU_MSR_PMON_BOX_FILTER		0x1efc
397 
398 /* SNR M2M */
399 #define SNR_M2M_PCI_PMON_CTL0			0x468
400 #define SNR_M2M_PCI_PMON_CTR0			0x440
401 #define SNR_M2M_PCI_PMON_BOX_CTL		0x438
402 #define SNR_M2M_PCI_PMON_UMASK_EXT		0xff
403 
404 /* SNR PCIE3 */
405 #define SNR_PCIE3_PCI_PMON_CTL0			0x508
406 #define SNR_PCIE3_PCI_PMON_CTR0			0x4e8
407 #define SNR_PCIE3_PCI_PMON_BOX_CTL		0x4e0
408 
409 /* SNR IMC */
410 #define SNR_IMC_MMIO_PMON_FIXED_CTL		0x54
411 #define SNR_IMC_MMIO_PMON_FIXED_CTR		0x38
412 #define SNR_IMC_MMIO_PMON_CTL0			0x40
413 #define SNR_IMC_MMIO_PMON_CTR0			0x8
414 #define SNR_IMC_MMIO_PMON_BOX_CTL		0x22800
415 #define SNR_IMC_MMIO_OFFSET			0x4000
416 #define SNR_IMC_MMIO_SIZE			0x4000
417 #define SNR_IMC_MMIO_BASE_OFFSET		0xd0
418 #define SNR_IMC_MMIO_BASE_MASK			0x1FFFFFFF
419 #define SNR_IMC_MMIO_MEM0_OFFSET		0xd8
420 #define SNR_IMC_MMIO_MEM0_MASK			0x7FF
421 
422 /* ICX CHA */
423 #define ICX_C34_MSR_PMON_CTR0			0xb68
424 #define ICX_C34_MSR_PMON_CTL0			0xb61
425 #define ICX_C34_MSR_PMON_BOX_CTL		0xb60
426 #define ICX_C34_MSR_PMON_BOX_FILTER0		0xb65
427 
428 /* ICX IIO */
429 #define ICX_IIO_MSR_PMON_CTL0			0xa58
430 #define ICX_IIO_MSR_PMON_CTR0			0xa51
431 #define ICX_IIO_MSR_PMON_BOX_CTL		0xa50
432 
433 /* ICX IRP */
434 #define ICX_IRP0_MSR_PMON_CTL0			0xa4d
435 #define ICX_IRP0_MSR_PMON_CTR0			0xa4b
436 #define ICX_IRP0_MSR_PMON_BOX_CTL		0xa4a
437 
438 /* ICX M2PCIE */
439 #define ICX_M2PCIE_MSR_PMON_CTL0		0xa46
440 #define ICX_M2PCIE_MSR_PMON_CTR0		0xa41
441 #define ICX_M2PCIE_MSR_PMON_BOX_CTL		0xa40
442 
443 /* ICX UPI */
444 #define ICX_UPI_PCI_PMON_CTL0			0x350
445 #define ICX_UPI_PCI_PMON_CTR0			0x320
446 #define ICX_UPI_PCI_PMON_BOX_CTL		0x318
447 #define ICX_UPI_CTL_UMASK_EXT			0xffffff
448 #define ICX_UBOX_DID				0x3450
449 
450 /* ICX M3UPI*/
451 #define ICX_M3UPI_PCI_PMON_CTL0			0xd8
452 #define ICX_M3UPI_PCI_PMON_CTR0			0xa8
453 #define ICX_M3UPI_PCI_PMON_BOX_CTL		0xa0
454 
455 /* ICX IMC */
456 #define ICX_NUMBER_IMC_CHN			3
457 #define ICX_IMC_MEM_STRIDE			0x4
458 
459 /* SPR */
460 #define SPR_RAW_EVENT_MASK_EXT			0xffffff
461 #define SPR_UBOX_DID				0x3250
462 
463 /* SPR CHA */
464 #define SPR_CHA_PMON_CTL_TID_EN			(1 << 16)
465 #define SPR_CHA_PMON_EVENT_MASK			(SNBEP_PMON_RAW_EVENT_MASK | \
466 						 SPR_CHA_PMON_CTL_TID_EN)
467 #define SPR_CHA_PMON_BOX_FILTER_TID		0x3ff
468 
469 #define SPR_C0_MSR_PMON_BOX_FILTER0		0x200e
470 
471 DEFINE_UNCORE_FORMAT_ATTR(event, event, "config:0-7");
472 DEFINE_UNCORE_FORMAT_ATTR(event2, event, "config:0-6");
473 DEFINE_UNCORE_FORMAT_ATTR(event_ext, event, "config:0-7,21");
474 DEFINE_UNCORE_FORMAT_ATTR(use_occ_ctr, use_occ_ctr, "config:7");
475 DEFINE_UNCORE_FORMAT_ATTR(umask, umask, "config:8-15");
476 DEFINE_UNCORE_FORMAT_ATTR(umask_ext, umask, "config:8-15,32-43,45-55");
477 DEFINE_UNCORE_FORMAT_ATTR(umask_ext2, umask, "config:8-15,32-57");
478 DEFINE_UNCORE_FORMAT_ATTR(umask_ext3, umask, "config:8-15,32-39");
479 DEFINE_UNCORE_FORMAT_ATTR(umask_ext4, umask, "config:8-15,32-55");
480 DEFINE_UNCORE_FORMAT_ATTR(qor, qor, "config:16");
481 DEFINE_UNCORE_FORMAT_ATTR(edge, edge, "config:18");
482 DEFINE_UNCORE_FORMAT_ATTR(tid_en, tid_en, "config:19");
483 DEFINE_UNCORE_FORMAT_ATTR(tid_en2, tid_en, "config:16");
484 DEFINE_UNCORE_FORMAT_ATTR(inv, inv, "config:23");
485 DEFINE_UNCORE_FORMAT_ATTR(thresh9, thresh, "config:24-35");
486 DEFINE_UNCORE_FORMAT_ATTR(thresh8, thresh, "config:24-31");
487 DEFINE_UNCORE_FORMAT_ATTR(thresh6, thresh, "config:24-29");
488 DEFINE_UNCORE_FORMAT_ATTR(thresh5, thresh, "config:24-28");
489 DEFINE_UNCORE_FORMAT_ATTR(occ_sel, occ_sel, "config:14-15");
490 DEFINE_UNCORE_FORMAT_ATTR(occ_invert, occ_invert, "config:30");
491 DEFINE_UNCORE_FORMAT_ATTR(occ_edge, occ_edge, "config:14-51");
492 DEFINE_UNCORE_FORMAT_ATTR(occ_edge_det, occ_edge_det, "config:31");
493 DEFINE_UNCORE_FORMAT_ATTR(ch_mask, ch_mask, "config:36-43");
494 DEFINE_UNCORE_FORMAT_ATTR(ch_mask2, ch_mask, "config:36-47");
495 DEFINE_UNCORE_FORMAT_ATTR(fc_mask, fc_mask, "config:44-46");
496 DEFINE_UNCORE_FORMAT_ATTR(fc_mask2, fc_mask, "config:48-50");
497 DEFINE_UNCORE_FORMAT_ATTR(filter_tid, filter_tid, "config1:0-4");
498 DEFINE_UNCORE_FORMAT_ATTR(filter_tid2, filter_tid, "config1:0");
499 DEFINE_UNCORE_FORMAT_ATTR(filter_tid3, filter_tid, "config1:0-5");
500 DEFINE_UNCORE_FORMAT_ATTR(filter_tid4, filter_tid, "config1:0-8");
501 DEFINE_UNCORE_FORMAT_ATTR(filter_tid5, filter_tid, "config1:0-9");
502 DEFINE_UNCORE_FORMAT_ATTR(filter_cid, filter_cid, "config1:5");
503 DEFINE_UNCORE_FORMAT_ATTR(filter_link, filter_link, "config1:5-8");
504 DEFINE_UNCORE_FORMAT_ATTR(filter_link2, filter_link, "config1:6-8");
505 DEFINE_UNCORE_FORMAT_ATTR(filter_link3, filter_link, "config1:12");
506 DEFINE_UNCORE_FORMAT_ATTR(filter_nid, filter_nid, "config1:10-17");
507 DEFINE_UNCORE_FORMAT_ATTR(filter_nid2, filter_nid, "config1:32-47");
508 DEFINE_UNCORE_FORMAT_ATTR(filter_state, filter_state, "config1:18-22");
509 DEFINE_UNCORE_FORMAT_ATTR(filter_state2, filter_state, "config1:17-22");
510 DEFINE_UNCORE_FORMAT_ATTR(filter_state3, filter_state, "config1:17-23");
511 DEFINE_UNCORE_FORMAT_ATTR(filter_state4, filter_state, "config1:18-20");
512 DEFINE_UNCORE_FORMAT_ATTR(filter_state5, filter_state, "config1:17-26");
513 DEFINE_UNCORE_FORMAT_ATTR(filter_rem, filter_rem, "config1:32");
514 DEFINE_UNCORE_FORMAT_ATTR(filter_loc, filter_loc, "config1:33");
515 DEFINE_UNCORE_FORMAT_ATTR(filter_nm, filter_nm, "config1:36");
516 DEFINE_UNCORE_FORMAT_ATTR(filter_not_nm, filter_not_nm, "config1:37");
517 DEFINE_UNCORE_FORMAT_ATTR(filter_local, filter_local, "config1:33");
518 DEFINE_UNCORE_FORMAT_ATTR(filter_all_op, filter_all_op, "config1:35");
519 DEFINE_UNCORE_FORMAT_ATTR(filter_nnm, filter_nnm, "config1:37");
520 DEFINE_UNCORE_FORMAT_ATTR(filter_opc, filter_opc, "config1:23-31");
521 DEFINE_UNCORE_FORMAT_ATTR(filter_opc2, filter_opc, "config1:52-60");
522 DEFINE_UNCORE_FORMAT_ATTR(filter_opc3, filter_opc, "config1:41-60");
523 DEFINE_UNCORE_FORMAT_ATTR(filter_opc_0, filter_opc0, "config1:41-50");
524 DEFINE_UNCORE_FORMAT_ATTR(filter_opc_1, filter_opc1, "config1:51-60");
525 DEFINE_UNCORE_FORMAT_ATTR(filter_nc, filter_nc, "config1:62");
526 DEFINE_UNCORE_FORMAT_ATTR(filter_c6, filter_c6, "config1:61");
527 DEFINE_UNCORE_FORMAT_ATTR(filter_isoc, filter_isoc, "config1:63");
528 DEFINE_UNCORE_FORMAT_ATTR(filter_band0, filter_band0, "config1:0-7");
529 DEFINE_UNCORE_FORMAT_ATTR(filter_band1, filter_band1, "config1:8-15");
530 DEFINE_UNCORE_FORMAT_ATTR(filter_band2, filter_band2, "config1:16-23");
531 DEFINE_UNCORE_FORMAT_ATTR(filter_band3, filter_band3, "config1:24-31");
532 DEFINE_UNCORE_FORMAT_ATTR(match_rds, match_rds, "config1:48-51");
533 DEFINE_UNCORE_FORMAT_ATTR(match_rnid30, match_rnid30, "config1:32-35");
534 DEFINE_UNCORE_FORMAT_ATTR(match_rnid4, match_rnid4, "config1:31");
535 DEFINE_UNCORE_FORMAT_ATTR(match_dnid, match_dnid, "config1:13-17");
536 DEFINE_UNCORE_FORMAT_ATTR(match_mc, match_mc, "config1:9-12");
537 DEFINE_UNCORE_FORMAT_ATTR(match_opc, match_opc, "config1:5-8");
538 DEFINE_UNCORE_FORMAT_ATTR(match_vnw, match_vnw, "config1:3-4");
539 DEFINE_UNCORE_FORMAT_ATTR(match0, match0, "config1:0-31");
540 DEFINE_UNCORE_FORMAT_ATTR(match1, match1, "config1:32-63");
541 DEFINE_UNCORE_FORMAT_ATTR(mask_rds, mask_rds, "config2:48-51");
542 DEFINE_UNCORE_FORMAT_ATTR(mask_rnid30, mask_rnid30, "config2:32-35");
543 DEFINE_UNCORE_FORMAT_ATTR(mask_rnid4, mask_rnid4, "config2:31");
544 DEFINE_UNCORE_FORMAT_ATTR(mask_dnid, mask_dnid, "config2:13-17");
545 DEFINE_UNCORE_FORMAT_ATTR(mask_mc, mask_mc, "config2:9-12");
546 DEFINE_UNCORE_FORMAT_ATTR(mask_opc, mask_opc, "config2:5-8");
547 DEFINE_UNCORE_FORMAT_ATTR(mask_vnw, mask_vnw, "config2:3-4");
548 DEFINE_UNCORE_FORMAT_ATTR(mask0, mask0, "config2:0-31");
549 DEFINE_UNCORE_FORMAT_ATTR(mask1, mask1, "config2:32-63");
550 
snbep_uncore_pci_disable_box(struct intel_uncore_box * box)551 static void snbep_uncore_pci_disable_box(struct intel_uncore_box *box)
552 {
553 	struct pci_dev *pdev = box->pci_dev;
554 	int box_ctl = uncore_pci_box_ctl(box);
555 	u32 config = 0;
556 
557 	if (!pci_read_config_dword(pdev, box_ctl, &config)) {
558 		config |= SNBEP_PMON_BOX_CTL_FRZ;
559 		pci_write_config_dword(pdev, box_ctl, config);
560 	}
561 }
562 
snbep_uncore_pci_enable_box(struct intel_uncore_box * box)563 static void snbep_uncore_pci_enable_box(struct intel_uncore_box *box)
564 {
565 	struct pci_dev *pdev = box->pci_dev;
566 	int box_ctl = uncore_pci_box_ctl(box);
567 	u32 config = 0;
568 
569 	if (!pci_read_config_dword(pdev, box_ctl, &config)) {
570 		config &= ~SNBEP_PMON_BOX_CTL_FRZ;
571 		pci_write_config_dword(pdev, box_ctl, config);
572 	}
573 }
574 
snbep_uncore_pci_enable_event(struct intel_uncore_box * box,struct perf_event * event)575 static void snbep_uncore_pci_enable_event(struct intel_uncore_box *box, struct perf_event *event)
576 {
577 	struct pci_dev *pdev = box->pci_dev;
578 	struct hw_perf_event *hwc = &event->hw;
579 
580 	pci_write_config_dword(pdev, hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
581 }
582 
snbep_uncore_pci_disable_event(struct intel_uncore_box * box,struct perf_event * event)583 static void snbep_uncore_pci_disable_event(struct intel_uncore_box *box, struct perf_event *event)
584 {
585 	struct pci_dev *pdev = box->pci_dev;
586 	struct hw_perf_event *hwc = &event->hw;
587 
588 	pci_write_config_dword(pdev, hwc->config_base, hwc->config);
589 }
590 
snbep_uncore_pci_read_counter(struct intel_uncore_box * box,struct perf_event * event)591 static u64 snbep_uncore_pci_read_counter(struct intel_uncore_box *box, struct perf_event *event)
592 {
593 	struct pci_dev *pdev = box->pci_dev;
594 	struct hw_perf_event *hwc = &event->hw;
595 	u64 count = 0;
596 
597 	pci_read_config_dword(pdev, hwc->event_base, (u32 *)&count);
598 	pci_read_config_dword(pdev, hwc->event_base + 4, (u32 *)&count + 1);
599 
600 	return count;
601 }
602 
snbep_uncore_pci_init_box(struct intel_uncore_box * box)603 static void snbep_uncore_pci_init_box(struct intel_uncore_box *box)
604 {
605 	struct pci_dev *pdev = box->pci_dev;
606 	int box_ctl = uncore_pci_box_ctl(box);
607 
608 	pci_write_config_dword(pdev, box_ctl, SNBEP_PMON_BOX_CTL_INT);
609 }
610 
snbep_uncore_msr_disable_box(struct intel_uncore_box * box)611 static void snbep_uncore_msr_disable_box(struct intel_uncore_box *box)
612 {
613 	u64 config;
614 	unsigned msr;
615 
616 	msr = uncore_msr_box_ctl(box);
617 	if (msr) {
618 		rdmsrl(msr, config);
619 		config |= SNBEP_PMON_BOX_CTL_FRZ;
620 		wrmsrl(msr, config);
621 	}
622 }
623 
snbep_uncore_msr_enable_box(struct intel_uncore_box * box)624 static void snbep_uncore_msr_enable_box(struct intel_uncore_box *box)
625 {
626 	u64 config;
627 	unsigned msr;
628 
629 	msr = uncore_msr_box_ctl(box);
630 	if (msr) {
631 		rdmsrl(msr, config);
632 		config &= ~SNBEP_PMON_BOX_CTL_FRZ;
633 		wrmsrl(msr, config);
634 	}
635 }
636 
snbep_uncore_msr_enable_event(struct intel_uncore_box * box,struct perf_event * event)637 static void snbep_uncore_msr_enable_event(struct intel_uncore_box *box, struct perf_event *event)
638 {
639 	struct hw_perf_event *hwc = &event->hw;
640 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
641 
642 	if (reg1->idx != EXTRA_REG_NONE)
643 		wrmsrl(reg1->reg, uncore_shared_reg_config(box, 0));
644 
645 	wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
646 }
647 
snbep_uncore_msr_disable_event(struct intel_uncore_box * box,struct perf_event * event)648 static void snbep_uncore_msr_disable_event(struct intel_uncore_box *box,
649 					struct perf_event *event)
650 {
651 	struct hw_perf_event *hwc = &event->hw;
652 
653 	wrmsrl(hwc->config_base, hwc->config);
654 }
655 
snbep_uncore_msr_init_box(struct intel_uncore_box * box)656 static void snbep_uncore_msr_init_box(struct intel_uncore_box *box)
657 {
658 	unsigned msr = uncore_msr_box_ctl(box);
659 
660 	if (msr)
661 		wrmsrl(msr, SNBEP_PMON_BOX_CTL_INT);
662 }
663 
664 static struct attribute *snbep_uncore_formats_attr[] = {
665 	&format_attr_event.attr,
666 	&format_attr_umask.attr,
667 	&format_attr_edge.attr,
668 	&format_attr_inv.attr,
669 	&format_attr_thresh8.attr,
670 	NULL,
671 };
672 
673 static struct attribute *snbep_uncore_ubox_formats_attr[] = {
674 	&format_attr_event.attr,
675 	&format_attr_umask.attr,
676 	&format_attr_edge.attr,
677 	&format_attr_inv.attr,
678 	&format_attr_thresh5.attr,
679 	NULL,
680 };
681 
682 static struct attribute *snbep_uncore_cbox_formats_attr[] = {
683 	&format_attr_event.attr,
684 	&format_attr_umask.attr,
685 	&format_attr_edge.attr,
686 	&format_attr_tid_en.attr,
687 	&format_attr_inv.attr,
688 	&format_attr_thresh8.attr,
689 	&format_attr_filter_tid.attr,
690 	&format_attr_filter_nid.attr,
691 	&format_attr_filter_state.attr,
692 	&format_attr_filter_opc.attr,
693 	NULL,
694 };
695 
696 static struct attribute *snbep_uncore_pcu_formats_attr[] = {
697 	&format_attr_event.attr,
698 	&format_attr_occ_sel.attr,
699 	&format_attr_edge.attr,
700 	&format_attr_inv.attr,
701 	&format_attr_thresh5.attr,
702 	&format_attr_occ_invert.attr,
703 	&format_attr_occ_edge.attr,
704 	&format_attr_filter_band0.attr,
705 	&format_attr_filter_band1.attr,
706 	&format_attr_filter_band2.attr,
707 	&format_attr_filter_band3.attr,
708 	NULL,
709 };
710 
711 static struct attribute *snbep_uncore_qpi_formats_attr[] = {
712 	&format_attr_event_ext.attr,
713 	&format_attr_umask.attr,
714 	&format_attr_edge.attr,
715 	&format_attr_inv.attr,
716 	&format_attr_thresh8.attr,
717 	&format_attr_match_rds.attr,
718 	&format_attr_match_rnid30.attr,
719 	&format_attr_match_rnid4.attr,
720 	&format_attr_match_dnid.attr,
721 	&format_attr_match_mc.attr,
722 	&format_attr_match_opc.attr,
723 	&format_attr_match_vnw.attr,
724 	&format_attr_match0.attr,
725 	&format_attr_match1.attr,
726 	&format_attr_mask_rds.attr,
727 	&format_attr_mask_rnid30.attr,
728 	&format_attr_mask_rnid4.attr,
729 	&format_attr_mask_dnid.attr,
730 	&format_attr_mask_mc.attr,
731 	&format_attr_mask_opc.attr,
732 	&format_attr_mask_vnw.attr,
733 	&format_attr_mask0.attr,
734 	&format_attr_mask1.attr,
735 	NULL,
736 };
737 
738 static struct uncore_event_desc snbep_uncore_imc_events[] = {
739 	INTEL_UNCORE_EVENT_DESC(clockticks,      "event=0xff,umask=0x00"),
740 	INTEL_UNCORE_EVENT_DESC(cas_count_read,  "event=0x04,umask=0x03"),
741 	INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
742 	INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
743 	INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x0c"),
744 	INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
745 	INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
746 	{ /* end: all zeroes */ },
747 };
748 
749 static struct uncore_event_desc snbep_uncore_qpi_events[] = {
750 	INTEL_UNCORE_EVENT_DESC(clockticks,       "event=0x14"),
751 	INTEL_UNCORE_EVENT_DESC(txl_flits_active, "event=0x00,umask=0x06"),
752 	INTEL_UNCORE_EVENT_DESC(drs_data,         "event=0x102,umask=0x08"),
753 	INTEL_UNCORE_EVENT_DESC(ncb_data,         "event=0x103,umask=0x04"),
754 	{ /* end: all zeroes */ },
755 };
756 
757 static const struct attribute_group snbep_uncore_format_group = {
758 	.name = "format",
759 	.attrs = snbep_uncore_formats_attr,
760 };
761 
762 static const struct attribute_group snbep_uncore_ubox_format_group = {
763 	.name = "format",
764 	.attrs = snbep_uncore_ubox_formats_attr,
765 };
766 
767 static const struct attribute_group snbep_uncore_cbox_format_group = {
768 	.name = "format",
769 	.attrs = snbep_uncore_cbox_formats_attr,
770 };
771 
772 static const struct attribute_group snbep_uncore_pcu_format_group = {
773 	.name = "format",
774 	.attrs = snbep_uncore_pcu_formats_attr,
775 };
776 
777 static const struct attribute_group snbep_uncore_qpi_format_group = {
778 	.name = "format",
779 	.attrs = snbep_uncore_qpi_formats_attr,
780 };
781 
782 #define __SNBEP_UNCORE_MSR_OPS_COMMON_INIT()			\
783 	.disable_box	= snbep_uncore_msr_disable_box,		\
784 	.enable_box	= snbep_uncore_msr_enable_box,		\
785 	.disable_event	= snbep_uncore_msr_disable_event,	\
786 	.enable_event	= snbep_uncore_msr_enable_event,	\
787 	.read_counter	= uncore_msr_read_counter
788 
789 #define SNBEP_UNCORE_MSR_OPS_COMMON_INIT()			\
790 	__SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),			\
791 	.init_box	= snbep_uncore_msr_init_box		\
792 
793 static struct intel_uncore_ops snbep_uncore_msr_ops = {
794 	SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
795 };
796 
797 #define SNBEP_UNCORE_PCI_OPS_COMMON_INIT()			\
798 	.init_box	= snbep_uncore_pci_init_box,		\
799 	.disable_box	= snbep_uncore_pci_disable_box,		\
800 	.enable_box	= snbep_uncore_pci_enable_box,		\
801 	.disable_event	= snbep_uncore_pci_disable_event,	\
802 	.read_counter	= snbep_uncore_pci_read_counter
803 
804 static struct intel_uncore_ops snbep_uncore_pci_ops = {
805 	SNBEP_UNCORE_PCI_OPS_COMMON_INIT(),
806 	.enable_event	= snbep_uncore_pci_enable_event,	\
807 };
808 
809 static struct event_constraint snbep_uncore_cbox_constraints[] = {
810 	UNCORE_EVENT_CONSTRAINT(0x01, 0x1),
811 	UNCORE_EVENT_CONSTRAINT(0x02, 0x3),
812 	UNCORE_EVENT_CONSTRAINT(0x04, 0x3),
813 	UNCORE_EVENT_CONSTRAINT(0x05, 0x3),
814 	UNCORE_EVENT_CONSTRAINT(0x07, 0x3),
815 	UNCORE_EVENT_CONSTRAINT(0x09, 0x3),
816 	UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
817 	UNCORE_EVENT_CONSTRAINT(0x12, 0x3),
818 	UNCORE_EVENT_CONSTRAINT(0x13, 0x3),
819 	UNCORE_EVENT_CONSTRAINT(0x1b, 0xc),
820 	UNCORE_EVENT_CONSTRAINT(0x1c, 0xc),
821 	UNCORE_EVENT_CONSTRAINT(0x1d, 0xc),
822 	UNCORE_EVENT_CONSTRAINT(0x1e, 0xc),
823 	UNCORE_EVENT_CONSTRAINT(0x1f, 0xe),
824 	UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
825 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
826 	UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
827 	UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
828 	UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
829 	UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
830 	UNCORE_EVENT_CONSTRAINT(0x35, 0x3),
831 	UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
832 	UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
833 	UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
834 	UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
835 	UNCORE_EVENT_CONSTRAINT(0x3b, 0x1),
836 	EVENT_CONSTRAINT_END
837 };
838 
839 static struct event_constraint snbep_uncore_r2pcie_constraints[] = {
840 	UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
841 	UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
842 	UNCORE_EVENT_CONSTRAINT(0x12, 0x1),
843 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
844 	UNCORE_EVENT_CONSTRAINT(0x24, 0x3),
845 	UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
846 	UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
847 	UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
848 	UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
849 	UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
850 	EVENT_CONSTRAINT_END
851 };
852 
853 static struct event_constraint snbep_uncore_r3qpi_constraints[] = {
854 	UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
855 	UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
856 	UNCORE_EVENT_CONSTRAINT(0x12, 0x3),
857 	UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
858 	UNCORE_EVENT_CONSTRAINT(0x20, 0x3),
859 	UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
860 	UNCORE_EVENT_CONSTRAINT(0x22, 0x3),
861 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
862 	UNCORE_EVENT_CONSTRAINT(0x24, 0x3),
863 	UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
864 	UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
865 	UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
866 	UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
867 	UNCORE_EVENT_CONSTRAINT(0x2a, 0x3),
868 	UNCORE_EVENT_CONSTRAINT(0x2b, 0x3),
869 	UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
870 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
871 	UNCORE_EVENT_CONSTRAINT(0x2e, 0x3),
872 	UNCORE_EVENT_CONSTRAINT(0x2f, 0x3),
873 	UNCORE_EVENT_CONSTRAINT(0x30, 0x3),
874 	UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
875 	UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
876 	UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
877 	UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
878 	UNCORE_EVENT_CONSTRAINT(0x36, 0x3),
879 	UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
880 	UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
881 	UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
882 	EVENT_CONSTRAINT_END
883 };
884 
885 static struct intel_uncore_type snbep_uncore_ubox = {
886 	.name		= "ubox",
887 	.num_counters   = 2,
888 	.num_boxes	= 1,
889 	.perf_ctr_bits	= 44,
890 	.fixed_ctr_bits	= 48,
891 	.perf_ctr	= SNBEP_U_MSR_PMON_CTR0,
892 	.event_ctl	= SNBEP_U_MSR_PMON_CTL0,
893 	.event_mask	= SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
894 	.fixed_ctr	= SNBEP_U_MSR_PMON_UCLK_FIXED_CTR,
895 	.fixed_ctl	= SNBEP_U_MSR_PMON_UCLK_FIXED_CTL,
896 	.ops		= &snbep_uncore_msr_ops,
897 	.format_group	= &snbep_uncore_ubox_format_group,
898 };
899 
900 static struct extra_reg snbep_uncore_cbox_extra_regs[] = {
901 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
902 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
903 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
904 	SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0x6),
905 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
906 	SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0x6),
907 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
908 	SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0x6),
909 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6),
910 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8),
911 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8),
912 	SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0xa),
913 	SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0xa),
914 	SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x2),
915 	SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x2),
916 	SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x2),
917 	SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x2),
918 	SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x8),
919 	SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x8),
920 	SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0xa),
921 	SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0xa),
922 	SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x2),
923 	SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x2),
924 	SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x2),
925 	SNBEP_CBO_EVENT_EXTRA_REG(0x4037, 0x40ff, 0x2),
926 	EVENT_EXTRA_END
927 };
928 
snbep_cbox_put_constraint(struct intel_uncore_box * box,struct perf_event * event)929 static void snbep_cbox_put_constraint(struct intel_uncore_box *box, struct perf_event *event)
930 {
931 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
932 	struct intel_uncore_extra_reg *er = &box->shared_regs[0];
933 	int i;
934 
935 	if (uncore_box_is_fake(box))
936 		return;
937 
938 	for (i = 0; i < 5; i++) {
939 		if (reg1->alloc & (0x1 << i))
940 			atomic_sub(1 << (i * 6), &er->ref);
941 	}
942 	reg1->alloc = 0;
943 }
944 
945 static struct event_constraint *
__snbep_cbox_get_constraint(struct intel_uncore_box * box,struct perf_event * event,u64 (* cbox_filter_mask)(int fields))946 __snbep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event,
947 			    u64 (*cbox_filter_mask)(int fields))
948 {
949 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
950 	struct intel_uncore_extra_reg *er = &box->shared_regs[0];
951 	int i, alloc = 0;
952 	unsigned long flags;
953 	u64 mask;
954 
955 	if (reg1->idx == EXTRA_REG_NONE)
956 		return NULL;
957 
958 	raw_spin_lock_irqsave(&er->lock, flags);
959 	for (i = 0; i < 5; i++) {
960 		if (!(reg1->idx & (0x1 << i)))
961 			continue;
962 		if (!uncore_box_is_fake(box) && (reg1->alloc & (0x1 << i)))
963 			continue;
964 
965 		mask = cbox_filter_mask(0x1 << i);
966 		if (!__BITS_VALUE(atomic_read(&er->ref), i, 6) ||
967 		    !((reg1->config ^ er->config) & mask)) {
968 			atomic_add(1 << (i * 6), &er->ref);
969 			er->config &= ~mask;
970 			er->config |= reg1->config & mask;
971 			alloc |= (0x1 << i);
972 		} else {
973 			break;
974 		}
975 	}
976 	raw_spin_unlock_irqrestore(&er->lock, flags);
977 	if (i < 5)
978 		goto fail;
979 
980 	if (!uncore_box_is_fake(box))
981 		reg1->alloc |= alloc;
982 
983 	return NULL;
984 fail:
985 	for (; i >= 0; i--) {
986 		if (alloc & (0x1 << i))
987 			atomic_sub(1 << (i * 6), &er->ref);
988 	}
989 	return &uncore_constraint_empty;
990 }
991 
snbep_cbox_filter_mask(int fields)992 static u64 snbep_cbox_filter_mask(int fields)
993 {
994 	u64 mask = 0;
995 
996 	if (fields & 0x1)
997 		mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_TID;
998 	if (fields & 0x2)
999 		mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_NID;
1000 	if (fields & 0x4)
1001 		mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_STATE;
1002 	if (fields & 0x8)
1003 		mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_OPC;
1004 
1005 	return mask;
1006 }
1007 
1008 static struct event_constraint *
snbep_cbox_get_constraint(struct intel_uncore_box * box,struct perf_event * event)1009 snbep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
1010 {
1011 	return __snbep_cbox_get_constraint(box, event, snbep_cbox_filter_mask);
1012 }
1013 
snbep_cbox_hw_config(struct intel_uncore_box * box,struct perf_event * event)1014 static int snbep_cbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1015 {
1016 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
1017 	struct extra_reg *er;
1018 	int idx = 0;
1019 
1020 	for (er = snbep_uncore_cbox_extra_regs; er->msr; er++) {
1021 		if (er->event != (event->hw.config & er->config_mask))
1022 			continue;
1023 		idx |= er->idx;
1024 	}
1025 
1026 	if (idx) {
1027 		reg1->reg = SNBEP_C0_MSR_PMON_BOX_FILTER +
1028 			SNBEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
1029 		reg1->config = event->attr.config1 & snbep_cbox_filter_mask(idx);
1030 		reg1->idx = idx;
1031 	}
1032 	return 0;
1033 }
1034 
1035 static struct intel_uncore_ops snbep_uncore_cbox_ops = {
1036 	SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1037 	.hw_config		= snbep_cbox_hw_config,
1038 	.get_constraint		= snbep_cbox_get_constraint,
1039 	.put_constraint		= snbep_cbox_put_constraint,
1040 };
1041 
1042 static struct intel_uncore_type snbep_uncore_cbox = {
1043 	.name			= "cbox",
1044 	.num_counters		= 4,
1045 	.num_boxes		= 8,
1046 	.perf_ctr_bits		= 44,
1047 	.event_ctl		= SNBEP_C0_MSR_PMON_CTL0,
1048 	.perf_ctr		= SNBEP_C0_MSR_PMON_CTR0,
1049 	.event_mask		= SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
1050 	.box_ctl		= SNBEP_C0_MSR_PMON_BOX_CTL,
1051 	.msr_offset		= SNBEP_CBO_MSR_OFFSET,
1052 	.num_shared_regs	= 1,
1053 	.constraints		= snbep_uncore_cbox_constraints,
1054 	.ops			= &snbep_uncore_cbox_ops,
1055 	.format_group		= &snbep_uncore_cbox_format_group,
1056 };
1057 
snbep_pcu_alter_er(struct perf_event * event,int new_idx,bool modify)1058 static u64 snbep_pcu_alter_er(struct perf_event *event, int new_idx, bool modify)
1059 {
1060 	struct hw_perf_event *hwc = &event->hw;
1061 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1062 	u64 config = reg1->config;
1063 
1064 	if (new_idx > reg1->idx)
1065 		config <<= 8 * (new_idx - reg1->idx);
1066 	else
1067 		config >>= 8 * (reg1->idx - new_idx);
1068 
1069 	if (modify) {
1070 		hwc->config += new_idx - reg1->idx;
1071 		reg1->config = config;
1072 		reg1->idx = new_idx;
1073 	}
1074 	return config;
1075 }
1076 
1077 static struct event_constraint *
snbep_pcu_get_constraint(struct intel_uncore_box * box,struct perf_event * event)1078 snbep_pcu_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
1079 {
1080 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
1081 	struct intel_uncore_extra_reg *er = &box->shared_regs[0];
1082 	unsigned long flags;
1083 	int idx = reg1->idx;
1084 	u64 mask, config1 = reg1->config;
1085 	bool ok = false;
1086 
1087 	if (reg1->idx == EXTRA_REG_NONE ||
1088 	    (!uncore_box_is_fake(box) && reg1->alloc))
1089 		return NULL;
1090 again:
1091 	mask = 0xffULL << (idx * 8);
1092 	raw_spin_lock_irqsave(&er->lock, flags);
1093 	if (!__BITS_VALUE(atomic_read(&er->ref), idx, 8) ||
1094 	    !((config1 ^ er->config) & mask)) {
1095 		atomic_add(1 << (idx * 8), &er->ref);
1096 		er->config &= ~mask;
1097 		er->config |= config1 & mask;
1098 		ok = true;
1099 	}
1100 	raw_spin_unlock_irqrestore(&er->lock, flags);
1101 
1102 	if (!ok) {
1103 		idx = (idx + 1) % 4;
1104 		if (idx != reg1->idx) {
1105 			config1 = snbep_pcu_alter_er(event, idx, false);
1106 			goto again;
1107 		}
1108 		return &uncore_constraint_empty;
1109 	}
1110 
1111 	if (!uncore_box_is_fake(box)) {
1112 		if (idx != reg1->idx)
1113 			snbep_pcu_alter_er(event, idx, true);
1114 		reg1->alloc = 1;
1115 	}
1116 	return NULL;
1117 }
1118 
snbep_pcu_put_constraint(struct intel_uncore_box * box,struct perf_event * event)1119 static void snbep_pcu_put_constraint(struct intel_uncore_box *box, struct perf_event *event)
1120 {
1121 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
1122 	struct intel_uncore_extra_reg *er = &box->shared_regs[0];
1123 
1124 	if (uncore_box_is_fake(box) || !reg1->alloc)
1125 		return;
1126 
1127 	atomic_sub(1 << (reg1->idx * 8), &er->ref);
1128 	reg1->alloc = 0;
1129 }
1130 
snbep_pcu_hw_config(struct intel_uncore_box * box,struct perf_event * event)1131 static int snbep_pcu_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1132 {
1133 	struct hw_perf_event *hwc = &event->hw;
1134 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1135 	int ev_sel = hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK;
1136 
1137 	if (ev_sel >= 0xb && ev_sel <= 0xe) {
1138 		reg1->reg = SNBEP_PCU_MSR_PMON_BOX_FILTER;
1139 		reg1->idx = ev_sel - 0xb;
1140 		reg1->config = event->attr.config1 & (0xff << (reg1->idx * 8));
1141 	}
1142 	return 0;
1143 }
1144 
1145 static struct intel_uncore_ops snbep_uncore_pcu_ops = {
1146 	SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1147 	.hw_config		= snbep_pcu_hw_config,
1148 	.get_constraint		= snbep_pcu_get_constraint,
1149 	.put_constraint		= snbep_pcu_put_constraint,
1150 };
1151 
1152 static struct intel_uncore_type snbep_uncore_pcu = {
1153 	.name			= "pcu",
1154 	.num_counters		= 4,
1155 	.num_boxes		= 1,
1156 	.perf_ctr_bits		= 48,
1157 	.perf_ctr		= SNBEP_PCU_MSR_PMON_CTR0,
1158 	.event_ctl		= SNBEP_PCU_MSR_PMON_CTL0,
1159 	.event_mask		= SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
1160 	.box_ctl		= SNBEP_PCU_MSR_PMON_BOX_CTL,
1161 	.num_shared_regs	= 1,
1162 	.ops			= &snbep_uncore_pcu_ops,
1163 	.format_group		= &snbep_uncore_pcu_format_group,
1164 };
1165 
1166 static struct intel_uncore_type *snbep_msr_uncores[] = {
1167 	&snbep_uncore_ubox,
1168 	&snbep_uncore_cbox,
1169 	&snbep_uncore_pcu,
1170 	NULL,
1171 };
1172 
snbep_uncore_cpu_init(void)1173 void snbep_uncore_cpu_init(void)
1174 {
1175 	if (snbep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
1176 		snbep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
1177 	uncore_msr_uncores = snbep_msr_uncores;
1178 }
1179 
1180 enum {
1181 	SNBEP_PCI_QPI_PORT0_FILTER,
1182 	SNBEP_PCI_QPI_PORT1_FILTER,
1183 	BDX_PCI_QPI_PORT2_FILTER,
1184 };
1185 
snbep_qpi_hw_config(struct intel_uncore_box * box,struct perf_event * event)1186 static int snbep_qpi_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1187 {
1188 	struct hw_perf_event *hwc = &event->hw;
1189 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1190 	struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
1191 
1192 	if ((hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK) == 0x38) {
1193 		reg1->idx = 0;
1194 		reg1->reg = SNBEP_Q_Py_PCI_PMON_PKT_MATCH0;
1195 		reg1->config = event->attr.config1;
1196 		reg2->reg = SNBEP_Q_Py_PCI_PMON_PKT_MASK0;
1197 		reg2->config = event->attr.config2;
1198 	}
1199 	return 0;
1200 }
1201 
snbep_qpi_enable_event(struct intel_uncore_box * box,struct perf_event * event)1202 static void snbep_qpi_enable_event(struct intel_uncore_box *box, struct perf_event *event)
1203 {
1204 	struct pci_dev *pdev = box->pci_dev;
1205 	struct hw_perf_event *hwc = &event->hw;
1206 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1207 	struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
1208 
1209 	if (reg1->idx != EXTRA_REG_NONE) {
1210 		int idx = box->pmu->pmu_idx + SNBEP_PCI_QPI_PORT0_FILTER;
1211 		int die = box->dieid;
1212 		struct pci_dev *filter_pdev = uncore_extra_pci_dev[die].dev[idx];
1213 
1214 		if (filter_pdev) {
1215 			pci_write_config_dword(filter_pdev, reg1->reg,
1216 						(u32)reg1->config);
1217 			pci_write_config_dword(filter_pdev, reg1->reg + 4,
1218 						(u32)(reg1->config >> 32));
1219 			pci_write_config_dword(filter_pdev, reg2->reg,
1220 						(u32)reg2->config);
1221 			pci_write_config_dword(filter_pdev, reg2->reg + 4,
1222 						(u32)(reg2->config >> 32));
1223 		}
1224 	}
1225 
1226 	pci_write_config_dword(pdev, hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
1227 }
1228 
1229 static struct intel_uncore_ops snbep_uncore_qpi_ops = {
1230 	SNBEP_UNCORE_PCI_OPS_COMMON_INIT(),
1231 	.enable_event		= snbep_qpi_enable_event,
1232 	.hw_config		= snbep_qpi_hw_config,
1233 	.get_constraint		= uncore_get_constraint,
1234 	.put_constraint		= uncore_put_constraint,
1235 };
1236 
1237 #define SNBEP_UNCORE_PCI_COMMON_INIT()				\
1238 	.perf_ctr	= SNBEP_PCI_PMON_CTR0,			\
1239 	.event_ctl	= SNBEP_PCI_PMON_CTL0,			\
1240 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,		\
1241 	.box_ctl	= SNBEP_PCI_PMON_BOX_CTL,		\
1242 	.ops		= &snbep_uncore_pci_ops,		\
1243 	.format_group	= &snbep_uncore_format_group
1244 
1245 static struct intel_uncore_type snbep_uncore_ha = {
1246 	.name		= "ha",
1247 	.num_counters   = 4,
1248 	.num_boxes	= 1,
1249 	.perf_ctr_bits	= 48,
1250 	SNBEP_UNCORE_PCI_COMMON_INIT(),
1251 };
1252 
1253 static struct intel_uncore_type snbep_uncore_imc = {
1254 	.name		= "imc",
1255 	.num_counters   = 4,
1256 	.num_boxes	= 4,
1257 	.perf_ctr_bits	= 48,
1258 	.fixed_ctr_bits	= 48,
1259 	.fixed_ctr	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
1260 	.fixed_ctl	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
1261 	.event_descs	= snbep_uncore_imc_events,
1262 	SNBEP_UNCORE_PCI_COMMON_INIT(),
1263 };
1264 
1265 static struct intel_uncore_type snbep_uncore_qpi = {
1266 	.name			= "qpi",
1267 	.num_counters		= 4,
1268 	.num_boxes		= 2,
1269 	.perf_ctr_bits		= 48,
1270 	.perf_ctr		= SNBEP_PCI_PMON_CTR0,
1271 	.event_ctl		= SNBEP_PCI_PMON_CTL0,
1272 	.event_mask		= SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
1273 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
1274 	.num_shared_regs	= 1,
1275 	.ops			= &snbep_uncore_qpi_ops,
1276 	.event_descs		= snbep_uncore_qpi_events,
1277 	.format_group		= &snbep_uncore_qpi_format_group,
1278 };
1279 
1280 
1281 static struct intel_uncore_type snbep_uncore_r2pcie = {
1282 	.name		= "r2pcie",
1283 	.num_counters   = 4,
1284 	.num_boxes	= 1,
1285 	.perf_ctr_bits	= 44,
1286 	.constraints	= snbep_uncore_r2pcie_constraints,
1287 	SNBEP_UNCORE_PCI_COMMON_INIT(),
1288 };
1289 
1290 static struct intel_uncore_type snbep_uncore_r3qpi = {
1291 	.name		= "r3qpi",
1292 	.num_counters   = 3,
1293 	.num_boxes	= 2,
1294 	.perf_ctr_bits	= 44,
1295 	.constraints	= snbep_uncore_r3qpi_constraints,
1296 	SNBEP_UNCORE_PCI_COMMON_INIT(),
1297 };
1298 
1299 enum {
1300 	SNBEP_PCI_UNCORE_HA,
1301 	SNBEP_PCI_UNCORE_IMC,
1302 	SNBEP_PCI_UNCORE_QPI,
1303 	SNBEP_PCI_UNCORE_R2PCIE,
1304 	SNBEP_PCI_UNCORE_R3QPI,
1305 };
1306 
1307 static struct intel_uncore_type *snbep_pci_uncores[] = {
1308 	[SNBEP_PCI_UNCORE_HA]		= &snbep_uncore_ha,
1309 	[SNBEP_PCI_UNCORE_IMC]		= &snbep_uncore_imc,
1310 	[SNBEP_PCI_UNCORE_QPI]		= &snbep_uncore_qpi,
1311 	[SNBEP_PCI_UNCORE_R2PCIE]	= &snbep_uncore_r2pcie,
1312 	[SNBEP_PCI_UNCORE_R3QPI]	= &snbep_uncore_r3qpi,
1313 	NULL,
1314 };
1315 
1316 static const struct pci_device_id snbep_uncore_pci_ids[] = {
1317 	{ /* Home Agent */
1318 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_HA),
1319 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_HA, 0),
1320 	},
1321 	{ /* MC Channel 0 */
1322 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC0),
1323 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 0),
1324 	},
1325 	{ /* MC Channel 1 */
1326 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC1),
1327 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 1),
1328 	},
1329 	{ /* MC Channel 2 */
1330 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC2),
1331 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 2),
1332 	},
1333 	{ /* MC Channel 3 */
1334 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC3),
1335 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 3),
1336 	},
1337 	{ /* QPI Port 0 */
1338 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI0),
1339 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_QPI, 0),
1340 	},
1341 	{ /* QPI Port 1 */
1342 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI1),
1343 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_QPI, 1),
1344 	},
1345 	{ /* R2PCIe */
1346 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R2PCIE),
1347 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R2PCIE, 0),
1348 	},
1349 	{ /* R3QPI Link 0 */
1350 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI0),
1351 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R3QPI, 0),
1352 	},
1353 	{ /* R3QPI Link 1 */
1354 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI1),
1355 		.driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R3QPI, 1),
1356 	},
1357 	{ /* QPI Port 0 filter  */
1358 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3c86),
1359 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
1360 						   SNBEP_PCI_QPI_PORT0_FILTER),
1361 	},
1362 	{ /* QPI Port 0 filter  */
1363 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3c96),
1364 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
1365 						   SNBEP_PCI_QPI_PORT1_FILTER),
1366 	},
1367 	{ /* end: all zeroes */ }
1368 };
1369 
1370 static struct pci_driver snbep_uncore_pci_driver = {
1371 	.name		= "snbep_uncore",
1372 	.id_table	= snbep_uncore_pci_ids,
1373 };
1374 
1375 #define NODE_ID_MASK	0x7
1376 
1377 /* Each three bits from 0 to 23 of GIDNIDMAP register correspond Node ID. */
1378 #define GIDNIDMAP(config, id)	(((config) >> (3 * (id))) & 0x7)
1379 
upi_nodeid_groupid(struct pci_dev * ubox_dev,int nodeid_loc,int idmap_loc,int * nodeid,int * groupid)1380 static int upi_nodeid_groupid(struct pci_dev *ubox_dev, int nodeid_loc, int idmap_loc,
1381 			      int *nodeid, int *groupid)
1382 {
1383 	int ret;
1384 
1385 	/* get the Node ID of the local register */
1386 	ret = pci_read_config_dword(ubox_dev, nodeid_loc, nodeid);
1387 	if (ret)
1388 		goto err;
1389 
1390 	*nodeid = *nodeid & NODE_ID_MASK;
1391 	/* get the Node ID mapping */
1392 	ret = pci_read_config_dword(ubox_dev, idmap_loc, groupid);
1393 	if (ret)
1394 		goto err;
1395 err:
1396 	return ret;
1397 }
1398 
1399 /*
1400  * build pci bus to socket mapping
1401  */
snbep_pci2phy_map_init(int devid,int nodeid_loc,int idmap_loc,bool reverse)1402 static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool reverse)
1403 {
1404 	struct pci_dev *ubox_dev = NULL;
1405 	int i, bus, nodeid, segment, die_id;
1406 	struct pci2phy_map *map;
1407 	int err = 0;
1408 	u32 config = 0;
1409 
1410 	while (1) {
1411 		/* find the UBOX device */
1412 		ubox_dev = pci_get_device(PCI_VENDOR_ID_INTEL, devid, ubox_dev);
1413 		if (!ubox_dev)
1414 			break;
1415 		bus = ubox_dev->bus->number;
1416 		/*
1417 		 * The nodeid and idmap registers only contain enough
1418 		 * information to handle 8 nodes.  On systems with more
1419 		 * than 8 nodes, we need to rely on NUMA information,
1420 		 * filled in from BIOS supplied information, to determine
1421 		 * the topology.
1422 		 */
1423 		if (nr_node_ids <= 8) {
1424 			err = upi_nodeid_groupid(ubox_dev, nodeid_loc, idmap_loc,
1425 						 &nodeid, &config);
1426 			if (err)
1427 				break;
1428 
1429 			segment = pci_domain_nr(ubox_dev->bus);
1430 			raw_spin_lock(&pci2phy_map_lock);
1431 			map = __find_pci2phy_map(segment);
1432 			if (!map) {
1433 				raw_spin_unlock(&pci2phy_map_lock);
1434 				err = -ENOMEM;
1435 				break;
1436 			}
1437 
1438 			/*
1439 			 * every three bits in the Node ID mapping register maps
1440 			 * to a particular node.
1441 			 */
1442 			for (i = 0; i < 8; i++) {
1443 				if (nodeid == GIDNIDMAP(config, i)) {
1444 					if (topology_max_die_per_package() > 1)
1445 						die_id = i;
1446 					else
1447 						die_id = topology_phys_to_logical_pkg(i);
1448 					if (die_id < 0)
1449 						die_id = -ENODEV;
1450 					map->pbus_to_dieid[bus] = die_id;
1451 					break;
1452 				}
1453 			}
1454 			raw_spin_unlock(&pci2phy_map_lock);
1455 		} else {
1456 			segment = pci_domain_nr(ubox_dev->bus);
1457 			raw_spin_lock(&pci2phy_map_lock);
1458 			map = __find_pci2phy_map(segment);
1459 			if (!map) {
1460 				raw_spin_unlock(&pci2phy_map_lock);
1461 				err = -ENOMEM;
1462 				break;
1463 			}
1464 
1465 			map->pbus_to_dieid[bus] = die_id = uncore_device_to_die(ubox_dev);
1466 
1467 			raw_spin_unlock(&pci2phy_map_lock);
1468 
1469 			if (WARN_ON_ONCE(die_id == -1)) {
1470 				err = -EINVAL;
1471 				break;
1472 			}
1473 		}
1474 	}
1475 
1476 	if (!err) {
1477 		/*
1478 		 * For PCI bus with no UBOX device, find the next bus
1479 		 * that has UBOX device and use its mapping.
1480 		 */
1481 		raw_spin_lock(&pci2phy_map_lock);
1482 		list_for_each_entry(map, &pci2phy_map_head, list) {
1483 			i = -1;
1484 			if (reverse) {
1485 				for (bus = 255; bus >= 0; bus--) {
1486 					if (map->pbus_to_dieid[bus] != -1)
1487 						i = map->pbus_to_dieid[bus];
1488 					else
1489 						map->pbus_to_dieid[bus] = i;
1490 				}
1491 			} else {
1492 				for (bus = 0; bus <= 255; bus++) {
1493 					if (map->pbus_to_dieid[bus] != -1)
1494 						i = map->pbus_to_dieid[bus];
1495 					else
1496 						map->pbus_to_dieid[bus] = i;
1497 				}
1498 			}
1499 		}
1500 		raw_spin_unlock(&pci2phy_map_lock);
1501 	}
1502 
1503 	pci_dev_put(ubox_dev);
1504 
1505 	return pcibios_err_to_errno(err);
1506 }
1507 
snbep_uncore_pci_init(void)1508 int snbep_uncore_pci_init(void)
1509 {
1510 	int ret = snbep_pci2phy_map_init(0x3ce0, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
1511 	if (ret)
1512 		return ret;
1513 	uncore_pci_uncores = snbep_pci_uncores;
1514 	uncore_pci_driver = &snbep_uncore_pci_driver;
1515 	return 0;
1516 }
1517 /* end of Sandy Bridge-EP uncore support */
1518 
1519 /* IvyTown uncore support */
ivbep_uncore_msr_init_box(struct intel_uncore_box * box)1520 static void ivbep_uncore_msr_init_box(struct intel_uncore_box *box)
1521 {
1522 	unsigned msr = uncore_msr_box_ctl(box);
1523 	if (msr)
1524 		wrmsrl(msr, IVBEP_PMON_BOX_CTL_INT);
1525 }
1526 
ivbep_uncore_pci_init_box(struct intel_uncore_box * box)1527 static void ivbep_uncore_pci_init_box(struct intel_uncore_box *box)
1528 {
1529 	struct pci_dev *pdev = box->pci_dev;
1530 
1531 	pci_write_config_dword(pdev, SNBEP_PCI_PMON_BOX_CTL, IVBEP_PMON_BOX_CTL_INT);
1532 }
1533 
1534 #define IVBEP_UNCORE_MSR_OPS_COMMON_INIT()			\
1535 	.init_box	= ivbep_uncore_msr_init_box,		\
1536 	.disable_box	= snbep_uncore_msr_disable_box,		\
1537 	.enable_box	= snbep_uncore_msr_enable_box,		\
1538 	.disable_event	= snbep_uncore_msr_disable_event,	\
1539 	.enable_event	= snbep_uncore_msr_enable_event,	\
1540 	.read_counter	= uncore_msr_read_counter
1541 
1542 static struct intel_uncore_ops ivbep_uncore_msr_ops = {
1543 	IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1544 };
1545 
1546 static struct intel_uncore_ops ivbep_uncore_pci_ops = {
1547 	.init_box	= ivbep_uncore_pci_init_box,
1548 	.disable_box	= snbep_uncore_pci_disable_box,
1549 	.enable_box	= snbep_uncore_pci_enable_box,
1550 	.disable_event	= snbep_uncore_pci_disable_event,
1551 	.enable_event	= snbep_uncore_pci_enable_event,
1552 	.read_counter	= snbep_uncore_pci_read_counter,
1553 };
1554 
1555 #define IVBEP_UNCORE_PCI_COMMON_INIT()				\
1556 	.perf_ctr	= SNBEP_PCI_PMON_CTR0,			\
1557 	.event_ctl	= SNBEP_PCI_PMON_CTL0,			\
1558 	.event_mask	= IVBEP_PMON_RAW_EVENT_MASK,		\
1559 	.box_ctl	= SNBEP_PCI_PMON_BOX_CTL,		\
1560 	.ops		= &ivbep_uncore_pci_ops,			\
1561 	.format_group	= &ivbep_uncore_format_group
1562 
1563 static struct attribute *ivbep_uncore_formats_attr[] = {
1564 	&format_attr_event.attr,
1565 	&format_attr_umask.attr,
1566 	&format_attr_edge.attr,
1567 	&format_attr_inv.attr,
1568 	&format_attr_thresh8.attr,
1569 	NULL,
1570 };
1571 
1572 static struct attribute *ivbep_uncore_ubox_formats_attr[] = {
1573 	&format_attr_event.attr,
1574 	&format_attr_umask.attr,
1575 	&format_attr_edge.attr,
1576 	&format_attr_inv.attr,
1577 	&format_attr_thresh5.attr,
1578 	NULL,
1579 };
1580 
1581 static struct attribute *ivbep_uncore_cbox_formats_attr[] = {
1582 	&format_attr_event.attr,
1583 	&format_attr_umask.attr,
1584 	&format_attr_edge.attr,
1585 	&format_attr_tid_en.attr,
1586 	&format_attr_thresh8.attr,
1587 	&format_attr_filter_tid.attr,
1588 	&format_attr_filter_link.attr,
1589 	&format_attr_filter_state2.attr,
1590 	&format_attr_filter_nid2.attr,
1591 	&format_attr_filter_opc2.attr,
1592 	&format_attr_filter_nc.attr,
1593 	&format_attr_filter_c6.attr,
1594 	&format_attr_filter_isoc.attr,
1595 	NULL,
1596 };
1597 
1598 static struct attribute *ivbep_uncore_pcu_formats_attr[] = {
1599 	&format_attr_event.attr,
1600 	&format_attr_occ_sel.attr,
1601 	&format_attr_edge.attr,
1602 	&format_attr_thresh5.attr,
1603 	&format_attr_occ_invert.attr,
1604 	&format_attr_occ_edge.attr,
1605 	&format_attr_filter_band0.attr,
1606 	&format_attr_filter_band1.attr,
1607 	&format_attr_filter_band2.attr,
1608 	&format_attr_filter_band3.attr,
1609 	NULL,
1610 };
1611 
1612 static struct attribute *ivbep_uncore_qpi_formats_attr[] = {
1613 	&format_attr_event_ext.attr,
1614 	&format_attr_umask.attr,
1615 	&format_attr_edge.attr,
1616 	&format_attr_thresh8.attr,
1617 	&format_attr_match_rds.attr,
1618 	&format_attr_match_rnid30.attr,
1619 	&format_attr_match_rnid4.attr,
1620 	&format_attr_match_dnid.attr,
1621 	&format_attr_match_mc.attr,
1622 	&format_attr_match_opc.attr,
1623 	&format_attr_match_vnw.attr,
1624 	&format_attr_match0.attr,
1625 	&format_attr_match1.attr,
1626 	&format_attr_mask_rds.attr,
1627 	&format_attr_mask_rnid30.attr,
1628 	&format_attr_mask_rnid4.attr,
1629 	&format_attr_mask_dnid.attr,
1630 	&format_attr_mask_mc.attr,
1631 	&format_attr_mask_opc.attr,
1632 	&format_attr_mask_vnw.attr,
1633 	&format_attr_mask0.attr,
1634 	&format_attr_mask1.attr,
1635 	NULL,
1636 };
1637 
1638 static const struct attribute_group ivbep_uncore_format_group = {
1639 	.name = "format",
1640 	.attrs = ivbep_uncore_formats_attr,
1641 };
1642 
1643 static const struct attribute_group ivbep_uncore_ubox_format_group = {
1644 	.name = "format",
1645 	.attrs = ivbep_uncore_ubox_formats_attr,
1646 };
1647 
1648 static const struct attribute_group ivbep_uncore_cbox_format_group = {
1649 	.name = "format",
1650 	.attrs = ivbep_uncore_cbox_formats_attr,
1651 };
1652 
1653 static const struct attribute_group ivbep_uncore_pcu_format_group = {
1654 	.name = "format",
1655 	.attrs = ivbep_uncore_pcu_formats_attr,
1656 };
1657 
1658 static const struct attribute_group ivbep_uncore_qpi_format_group = {
1659 	.name = "format",
1660 	.attrs = ivbep_uncore_qpi_formats_attr,
1661 };
1662 
1663 static struct intel_uncore_type ivbep_uncore_ubox = {
1664 	.name		= "ubox",
1665 	.num_counters   = 2,
1666 	.num_boxes	= 1,
1667 	.perf_ctr_bits	= 44,
1668 	.fixed_ctr_bits	= 48,
1669 	.perf_ctr	= SNBEP_U_MSR_PMON_CTR0,
1670 	.event_ctl	= SNBEP_U_MSR_PMON_CTL0,
1671 	.event_mask	= IVBEP_U_MSR_PMON_RAW_EVENT_MASK,
1672 	.fixed_ctr	= SNBEP_U_MSR_PMON_UCLK_FIXED_CTR,
1673 	.fixed_ctl	= SNBEP_U_MSR_PMON_UCLK_FIXED_CTL,
1674 	.ops		= &ivbep_uncore_msr_ops,
1675 	.format_group	= &ivbep_uncore_ubox_format_group,
1676 };
1677 
1678 static struct extra_reg ivbep_uncore_cbox_extra_regs[] = {
1679 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
1680 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
1681 	SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2),
1682 	SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
1683 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc),
1684 	SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc),
1685 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
1686 	SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0xc),
1687 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
1688 	SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0xc),
1689 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
1690 	SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0xc),
1691 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10),
1692 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10),
1693 	SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10),
1694 	SNBEP_CBO_EVENT_EXTRA_REG(0x2335, 0xffff, 0x10),
1695 	SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0x18),
1696 	SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0x18),
1697 	SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x8),
1698 	SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x8),
1699 	SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x8),
1700 	SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x8),
1701 	SNBEP_CBO_EVENT_EXTRA_REG(0x8135, 0xffff, 0x10),
1702 	SNBEP_CBO_EVENT_EXTRA_REG(0x8335, 0xffff, 0x10),
1703 	SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x10),
1704 	SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x10),
1705 	SNBEP_CBO_EVENT_EXTRA_REG(0x2136, 0xffff, 0x10),
1706 	SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10),
1707 	SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0x18),
1708 	SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0x18),
1709 	SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x8),
1710 	SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x8),
1711 	SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x8),
1712 	SNBEP_CBO_EVENT_EXTRA_REG(0x5036, 0xffff, 0x8),
1713 	SNBEP_CBO_EVENT_EXTRA_REG(0x8136, 0xffff, 0x10),
1714 	SNBEP_CBO_EVENT_EXTRA_REG(0x8336, 0xffff, 0x10),
1715 	SNBEP_CBO_EVENT_EXTRA_REG(0x4037, 0x40ff, 0x8),
1716 	EVENT_EXTRA_END
1717 };
1718 
ivbep_cbox_filter_mask(int fields)1719 static u64 ivbep_cbox_filter_mask(int fields)
1720 {
1721 	u64 mask = 0;
1722 
1723 	if (fields & 0x1)
1724 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_TID;
1725 	if (fields & 0x2)
1726 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_LINK;
1727 	if (fields & 0x4)
1728 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_STATE;
1729 	if (fields & 0x8)
1730 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_NID;
1731 	if (fields & 0x10) {
1732 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_OPC;
1733 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_NC;
1734 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_C6;
1735 		mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_ISOC;
1736 	}
1737 
1738 	return mask;
1739 }
1740 
1741 static struct event_constraint *
ivbep_cbox_get_constraint(struct intel_uncore_box * box,struct perf_event * event)1742 ivbep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
1743 {
1744 	return __snbep_cbox_get_constraint(box, event, ivbep_cbox_filter_mask);
1745 }
1746 
ivbep_cbox_hw_config(struct intel_uncore_box * box,struct perf_event * event)1747 static int ivbep_cbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1748 {
1749 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
1750 	struct extra_reg *er;
1751 	int idx = 0;
1752 
1753 	for (er = ivbep_uncore_cbox_extra_regs; er->msr; er++) {
1754 		if (er->event != (event->hw.config & er->config_mask))
1755 			continue;
1756 		idx |= er->idx;
1757 	}
1758 
1759 	if (idx) {
1760 		reg1->reg = SNBEP_C0_MSR_PMON_BOX_FILTER +
1761 			SNBEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
1762 		reg1->config = event->attr.config1 & ivbep_cbox_filter_mask(idx);
1763 		reg1->idx = idx;
1764 	}
1765 	return 0;
1766 }
1767 
ivbep_cbox_enable_event(struct intel_uncore_box * box,struct perf_event * event)1768 static void ivbep_cbox_enable_event(struct intel_uncore_box *box, struct perf_event *event)
1769 {
1770 	struct hw_perf_event *hwc = &event->hw;
1771 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1772 
1773 	if (reg1->idx != EXTRA_REG_NONE) {
1774 		u64 filter = uncore_shared_reg_config(box, 0);
1775 		wrmsrl(reg1->reg, filter & 0xffffffff);
1776 		wrmsrl(reg1->reg + 6, filter >> 32);
1777 	}
1778 
1779 	wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
1780 }
1781 
1782 static struct intel_uncore_ops ivbep_uncore_cbox_ops = {
1783 	.init_box		= ivbep_uncore_msr_init_box,
1784 	.disable_box		= snbep_uncore_msr_disable_box,
1785 	.enable_box		= snbep_uncore_msr_enable_box,
1786 	.disable_event		= snbep_uncore_msr_disable_event,
1787 	.enable_event		= ivbep_cbox_enable_event,
1788 	.read_counter		= uncore_msr_read_counter,
1789 	.hw_config		= ivbep_cbox_hw_config,
1790 	.get_constraint		= ivbep_cbox_get_constraint,
1791 	.put_constraint		= snbep_cbox_put_constraint,
1792 };
1793 
1794 static struct intel_uncore_type ivbep_uncore_cbox = {
1795 	.name			= "cbox",
1796 	.num_counters		= 4,
1797 	.num_boxes		= 15,
1798 	.perf_ctr_bits		= 44,
1799 	.event_ctl		= SNBEP_C0_MSR_PMON_CTL0,
1800 	.perf_ctr		= SNBEP_C0_MSR_PMON_CTR0,
1801 	.event_mask		= IVBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
1802 	.box_ctl		= SNBEP_C0_MSR_PMON_BOX_CTL,
1803 	.msr_offset		= SNBEP_CBO_MSR_OFFSET,
1804 	.num_shared_regs	= 1,
1805 	.constraints		= snbep_uncore_cbox_constraints,
1806 	.ops			= &ivbep_uncore_cbox_ops,
1807 	.format_group		= &ivbep_uncore_cbox_format_group,
1808 };
1809 
1810 static struct intel_uncore_ops ivbep_uncore_pcu_ops = {
1811 	IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1812 	.hw_config		= snbep_pcu_hw_config,
1813 	.get_constraint		= snbep_pcu_get_constraint,
1814 	.put_constraint		= snbep_pcu_put_constraint,
1815 };
1816 
1817 static struct intel_uncore_type ivbep_uncore_pcu = {
1818 	.name			= "pcu",
1819 	.num_counters		= 4,
1820 	.num_boxes		= 1,
1821 	.perf_ctr_bits		= 48,
1822 	.perf_ctr		= SNBEP_PCU_MSR_PMON_CTR0,
1823 	.event_ctl		= SNBEP_PCU_MSR_PMON_CTL0,
1824 	.event_mask		= IVBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
1825 	.box_ctl		= SNBEP_PCU_MSR_PMON_BOX_CTL,
1826 	.num_shared_regs	= 1,
1827 	.ops			= &ivbep_uncore_pcu_ops,
1828 	.format_group		= &ivbep_uncore_pcu_format_group,
1829 };
1830 
1831 static struct intel_uncore_type *ivbep_msr_uncores[] = {
1832 	&ivbep_uncore_ubox,
1833 	&ivbep_uncore_cbox,
1834 	&ivbep_uncore_pcu,
1835 	NULL,
1836 };
1837 
ivbep_uncore_cpu_init(void)1838 void ivbep_uncore_cpu_init(void)
1839 {
1840 	if (ivbep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
1841 		ivbep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
1842 	uncore_msr_uncores = ivbep_msr_uncores;
1843 }
1844 
1845 static struct intel_uncore_type ivbep_uncore_ha = {
1846 	.name		= "ha",
1847 	.num_counters   = 4,
1848 	.num_boxes	= 2,
1849 	.perf_ctr_bits	= 48,
1850 	IVBEP_UNCORE_PCI_COMMON_INIT(),
1851 };
1852 
1853 static struct intel_uncore_type ivbep_uncore_imc = {
1854 	.name		= "imc",
1855 	.num_counters   = 4,
1856 	.num_boxes	= 8,
1857 	.perf_ctr_bits	= 48,
1858 	.fixed_ctr_bits	= 48,
1859 	.fixed_ctr	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
1860 	.fixed_ctl	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
1861 	.event_descs	= snbep_uncore_imc_events,
1862 	IVBEP_UNCORE_PCI_COMMON_INIT(),
1863 };
1864 
1865 /* registers in IRP boxes are not properly aligned */
1866 static unsigned ivbep_uncore_irp_ctls[] = {0xd8, 0xdc, 0xe0, 0xe4};
1867 static unsigned ivbep_uncore_irp_ctrs[] = {0xa0, 0xb0, 0xb8, 0xc0};
1868 
ivbep_uncore_irp_enable_event(struct intel_uncore_box * box,struct perf_event * event)1869 static void ivbep_uncore_irp_enable_event(struct intel_uncore_box *box, struct perf_event *event)
1870 {
1871 	struct pci_dev *pdev = box->pci_dev;
1872 	struct hw_perf_event *hwc = &event->hw;
1873 
1874 	pci_write_config_dword(pdev, ivbep_uncore_irp_ctls[hwc->idx],
1875 			       hwc->config | SNBEP_PMON_CTL_EN);
1876 }
1877 
ivbep_uncore_irp_disable_event(struct intel_uncore_box * box,struct perf_event * event)1878 static void ivbep_uncore_irp_disable_event(struct intel_uncore_box *box, struct perf_event *event)
1879 {
1880 	struct pci_dev *pdev = box->pci_dev;
1881 	struct hw_perf_event *hwc = &event->hw;
1882 
1883 	pci_write_config_dword(pdev, ivbep_uncore_irp_ctls[hwc->idx], hwc->config);
1884 }
1885 
ivbep_uncore_irp_read_counter(struct intel_uncore_box * box,struct perf_event * event)1886 static u64 ivbep_uncore_irp_read_counter(struct intel_uncore_box *box, struct perf_event *event)
1887 {
1888 	struct pci_dev *pdev = box->pci_dev;
1889 	struct hw_perf_event *hwc = &event->hw;
1890 	u64 count = 0;
1891 
1892 	pci_read_config_dword(pdev, ivbep_uncore_irp_ctrs[hwc->idx], (u32 *)&count);
1893 	pci_read_config_dword(pdev, ivbep_uncore_irp_ctrs[hwc->idx] + 4, (u32 *)&count + 1);
1894 
1895 	return count;
1896 }
1897 
1898 static struct intel_uncore_ops ivbep_uncore_irp_ops = {
1899 	.init_box	= ivbep_uncore_pci_init_box,
1900 	.disable_box	= snbep_uncore_pci_disable_box,
1901 	.enable_box	= snbep_uncore_pci_enable_box,
1902 	.disable_event	= ivbep_uncore_irp_disable_event,
1903 	.enable_event	= ivbep_uncore_irp_enable_event,
1904 	.read_counter	= ivbep_uncore_irp_read_counter,
1905 };
1906 
1907 static struct intel_uncore_type ivbep_uncore_irp = {
1908 	.name			= "irp",
1909 	.num_counters		= 4,
1910 	.num_boxes		= 1,
1911 	.perf_ctr_bits		= 48,
1912 	.event_mask		= IVBEP_PMON_RAW_EVENT_MASK,
1913 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
1914 	.ops			= &ivbep_uncore_irp_ops,
1915 	.format_group		= &ivbep_uncore_format_group,
1916 };
1917 
1918 static struct intel_uncore_ops ivbep_uncore_qpi_ops = {
1919 	.init_box	= ivbep_uncore_pci_init_box,
1920 	.disable_box	= snbep_uncore_pci_disable_box,
1921 	.enable_box	= snbep_uncore_pci_enable_box,
1922 	.disable_event	= snbep_uncore_pci_disable_event,
1923 	.enable_event	= snbep_qpi_enable_event,
1924 	.read_counter	= snbep_uncore_pci_read_counter,
1925 	.hw_config	= snbep_qpi_hw_config,
1926 	.get_constraint	= uncore_get_constraint,
1927 	.put_constraint	= uncore_put_constraint,
1928 };
1929 
1930 static struct intel_uncore_type ivbep_uncore_qpi = {
1931 	.name			= "qpi",
1932 	.num_counters		= 4,
1933 	.num_boxes		= 3,
1934 	.perf_ctr_bits		= 48,
1935 	.perf_ctr		= SNBEP_PCI_PMON_CTR0,
1936 	.event_ctl		= SNBEP_PCI_PMON_CTL0,
1937 	.event_mask		= IVBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
1938 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
1939 	.num_shared_regs	= 1,
1940 	.ops			= &ivbep_uncore_qpi_ops,
1941 	.format_group		= &ivbep_uncore_qpi_format_group,
1942 };
1943 
1944 static struct intel_uncore_type ivbep_uncore_r2pcie = {
1945 	.name		= "r2pcie",
1946 	.num_counters   = 4,
1947 	.num_boxes	= 1,
1948 	.perf_ctr_bits	= 44,
1949 	.constraints	= snbep_uncore_r2pcie_constraints,
1950 	IVBEP_UNCORE_PCI_COMMON_INIT(),
1951 };
1952 
1953 static struct intel_uncore_type ivbep_uncore_r3qpi = {
1954 	.name		= "r3qpi",
1955 	.num_counters   = 3,
1956 	.num_boxes	= 2,
1957 	.perf_ctr_bits	= 44,
1958 	.constraints	= snbep_uncore_r3qpi_constraints,
1959 	IVBEP_UNCORE_PCI_COMMON_INIT(),
1960 };
1961 
1962 enum {
1963 	IVBEP_PCI_UNCORE_HA,
1964 	IVBEP_PCI_UNCORE_IMC,
1965 	IVBEP_PCI_UNCORE_IRP,
1966 	IVBEP_PCI_UNCORE_QPI,
1967 	IVBEP_PCI_UNCORE_R2PCIE,
1968 	IVBEP_PCI_UNCORE_R3QPI,
1969 };
1970 
1971 static struct intel_uncore_type *ivbep_pci_uncores[] = {
1972 	[IVBEP_PCI_UNCORE_HA]	= &ivbep_uncore_ha,
1973 	[IVBEP_PCI_UNCORE_IMC]	= &ivbep_uncore_imc,
1974 	[IVBEP_PCI_UNCORE_IRP]	= &ivbep_uncore_irp,
1975 	[IVBEP_PCI_UNCORE_QPI]	= &ivbep_uncore_qpi,
1976 	[IVBEP_PCI_UNCORE_R2PCIE]	= &ivbep_uncore_r2pcie,
1977 	[IVBEP_PCI_UNCORE_R3QPI]	= &ivbep_uncore_r3qpi,
1978 	NULL,
1979 };
1980 
1981 static const struct pci_device_id ivbep_uncore_pci_ids[] = {
1982 	{ /* Home Agent 0 */
1983 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe30),
1984 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_HA, 0),
1985 	},
1986 	{ /* Home Agent 1 */
1987 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe38),
1988 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_HA, 1),
1989 	},
1990 	{ /* MC0 Channel 0 */
1991 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb4),
1992 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 0),
1993 	},
1994 	{ /* MC0 Channel 1 */
1995 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb5),
1996 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 1),
1997 	},
1998 	{ /* MC0 Channel 3 */
1999 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb0),
2000 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 2),
2001 	},
2002 	{ /* MC0 Channel 4 */
2003 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb1),
2004 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 3),
2005 	},
2006 	{ /* MC1 Channel 0 */
2007 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef4),
2008 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 4),
2009 	},
2010 	{ /* MC1 Channel 1 */
2011 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef5),
2012 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 5),
2013 	},
2014 	{ /* MC1 Channel 3 */
2015 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef0),
2016 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 6),
2017 	},
2018 	{ /* MC1 Channel 4 */
2019 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef1),
2020 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 7),
2021 	},
2022 	{ /* IRP */
2023 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe39),
2024 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IRP, 0),
2025 	},
2026 	{ /* QPI0 Port 0 */
2027 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe32),
2028 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_QPI, 0),
2029 	},
2030 	{ /* QPI0 Port 1 */
2031 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe33),
2032 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_QPI, 1),
2033 	},
2034 	{ /* QPI1 Port 2 */
2035 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3a),
2036 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_QPI, 2),
2037 	},
2038 	{ /* R2PCIe */
2039 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe34),
2040 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R2PCIE, 0),
2041 	},
2042 	{ /* R3QPI0 Link 0 */
2043 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe36),
2044 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R3QPI, 0),
2045 	},
2046 	{ /* R3QPI0 Link 1 */
2047 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe37),
2048 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R3QPI, 1),
2049 	},
2050 	{ /* R3QPI1 Link 2 */
2051 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3e),
2052 		.driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R3QPI, 2),
2053 	},
2054 	{ /* QPI Port 0 filter  */
2055 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe86),
2056 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
2057 						   SNBEP_PCI_QPI_PORT0_FILTER),
2058 	},
2059 	{ /* QPI Port 0 filter  */
2060 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe96),
2061 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
2062 						   SNBEP_PCI_QPI_PORT1_FILTER),
2063 	},
2064 	{ /* end: all zeroes */ }
2065 };
2066 
2067 static struct pci_driver ivbep_uncore_pci_driver = {
2068 	.name		= "ivbep_uncore",
2069 	.id_table	= ivbep_uncore_pci_ids,
2070 };
2071 
ivbep_uncore_pci_init(void)2072 int ivbep_uncore_pci_init(void)
2073 {
2074 	int ret = snbep_pci2phy_map_init(0x0e1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
2075 	if (ret)
2076 		return ret;
2077 	uncore_pci_uncores = ivbep_pci_uncores;
2078 	uncore_pci_driver = &ivbep_uncore_pci_driver;
2079 	return 0;
2080 }
2081 /* end of IvyTown uncore support */
2082 
2083 /* KNL uncore support */
2084 static struct attribute *knl_uncore_ubox_formats_attr[] = {
2085 	&format_attr_event.attr,
2086 	&format_attr_umask.attr,
2087 	&format_attr_edge.attr,
2088 	&format_attr_tid_en.attr,
2089 	&format_attr_inv.attr,
2090 	&format_attr_thresh5.attr,
2091 	NULL,
2092 };
2093 
2094 static const struct attribute_group knl_uncore_ubox_format_group = {
2095 	.name = "format",
2096 	.attrs = knl_uncore_ubox_formats_attr,
2097 };
2098 
2099 static struct intel_uncore_type knl_uncore_ubox = {
2100 	.name			= "ubox",
2101 	.num_counters		= 2,
2102 	.num_boxes		= 1,
2103 	.perf_ctr_bits		= 48,
2104 	.fixed_ctr_bits		= 48,
2105 	.perf_ctr		= HSWEP_U_MSR_PMON_CTR0,
2106 	.event_ctl		= HSWEP_U_MSR_PMON_CTL0,
2107 	.event_mask		= KNL_U_MSR_PMON_RAW_EVENT_MASK,
2108 	.fixed_ctr		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
2109 	.fixed_ctl		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
2110 	.ops			= &snbep_uncore_msr_ops,
2111 	.format_group		= &knl_uncore_ubox_format_group,
2112 };
2113 
2114 static struct attribute *knl_uncore_cha_formats_attr[] = {
2115 	&format_attr_event.attr,
2116 	&format_attr_umask.attr,
2117 	&format_attr_qor.attr,
2118 	&format_attr_edge.attr,
2119 	&format_attr_tid_en.attr,
2120 	&format_attr_inv.attr,
2121 	&format_attr_thresh8.attr,
2122 	&format_attr_filter_tid4.attr,
2123 	&format_attr_filter_link3.attr,
2124 	&format_attr_filter_state4.attr,
2125 	&format_attr_filter_local.attr,
2126 	&format_attr_filter_all_op.attr,
2127 	&format_attr_filter_nnm.attr,
2128 	&format_attr_filter_opc3.attr,
2129 	&format_attr_filter_nc.attr,
2130 	&format_attr_filter_isoc.attr,
2131 	NULL,
2132 };
2133 
2134 static const struct attribute_group knl_uncore_cha_format_group = {
2135 	.name = "format",
2136 	.attrs = knl_uncore_cha_formats_attr,
2137 };
2138 
2139 static struct event_constraint knl_uncore_cha_constraints[] = {
2140 	UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
2141 	UNCORE_EVENT_CONSTRAINT(0x1f, 0x1),
2142 	UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
2143 	EVENT_CONSTRAINT_END
2144 };
2145 
2146 static struct extra_reg knl_uncore_cha_extra_regs[] = {
2147 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
2148 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
2149 	SNBEP_CBO_EVENT_EXTRA_REG(0x3d, 0xff, 0x2),
2150 	SNBEP_CBO_EVENT_EXTRA_REG(0x35, 0xff, 0x4),
2151 	SNBEP_CBO_EVENT_EXTRA_REG(0x36, 0xff, 0x4),
2152 	EVENT_EXTRA_END
2153 };
2154 
knl_cha_filter_mask(int fields)2155 static u64 knl_cha_filter_mask(int fields)
2156 {
2157 	u64 mask = 0;
2158 
2159 	if (fields & 0x1)
2160 		mask |= KNL_CHA_MSR_PMON_BOX_FILTER_TID;
2161 	if (fields & 0x2)
2162 		mask |= KNL_CHA_MSR_PMON_BOX_FILTER_STATE;
2163 	if (fields & 0x4)
2164 		mask |= KNL_CHA_MSR_PMON_BOX_FILTER_OP;
2165 	return mask;
2166 }
2167 
2168 static struct event_constraint *
knl_cha_get_constraint(struct intel_uncore_box * box,struct perf_event * event)2169 knl_cha_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
2170 {
2171 	return __snbep_cbox_get_constraint(box, event, knl_cha_filter_mask);
2172 }
2173 
knl_cha_hw_config(struct intel_uncore_box * box,struct perf_event * event)2174 static int knl_cha_hw_config(struct intel_uncore_box *box,
2175 			     struct perf_event *event)
2176 {
2177 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
2178 	struct extra_reg *er;
2179 	int idx = 0;
2180 
2181 	for (er = knl_uncore_cha_extra_regs; er->msr; er++) {
2182 		if (er->event != (event->hw.config & er->config_mask))
2183 			continue;
2184 		idx |= er->idx;
2185 	}
2186 
2187 	if (idx) {
2188 		reg1->reg = HSWEP_C0_MSR_PMON_BOX_FILTER0 +
2189 			    KNL_CHA_MSR_OFFSET * box->pmu->pmu_idx;
2190 		reg1->config = event->attr.config1 & knl_cha_filter_mask(idx);
2191 
2192 		reg1->config |= KNL_CHA_MSR_PMON_BOX_FILTER_REMOTE_NODE;
2193 		reg1->config |= KNL_CHA_MSR_PMON_BOX_FILTER_LOCAL_NODE;
2194 		reg1->config |= KNL_CHA_MSR_PMON_BOX_FILTER_NNC;
2195 		reg1->idx = idx;
2196 	}
2197 	return 0;
2198 }
2199 
2200 static void hswep_cbox_enable_event(struct intel_uncore_box *box,
2201 				    struct perf_event *event);
2202 
2203 static struct intel_uncore_ops knl_uncore_cha_ops = {
2204 	.init_box		= snbep_uncore_msr_init_box,
2205 	.disable_box		= snbep_uncore_msr_disable_box,
2206 	.enable_box		= snbep_uncore_msr_enable_box,
2207 	.disable_event		= snbep_uncore_msr_disable_event,
2208 	.enable_event		= hswep_cbox_enable_event,
2209 	.read_counter		= uncore_msr_read_counter,
2210 	.hw_config		= knl_cha_hw_config,
2211 	.get_constraint		= knl_cha_get_constraint,
2212 	.put_constraint		= snbep_cbox_put_constraint,
2213 };
2214 
2215 static struct intel_uncore_type knl_uncore_cha = {
2216 	.name			= "cha",
2217 	.num_counters		= 4,
2218 	.num_boxes		= 38,
2219 	.perf_ctr_bits		= 48,
2220 	.event_ctl		= HSWEP_C0_MSR_PMON_CTL0,
2221 	.perf_ctr		= HSWEP_C0_MSR_PMON_CTR0,
2222 	.event_mask		= KNL_CHA_MSR_PMON_RAW_EVENT_MASK,
2223 	.box_ctl		= HSWEP_C0_MSR_PMON_BOX_CTL,
2224 	.msr_offset		= KNL_CHA_MSR_OFFSET,
2225 	.num_shared_regs	= 1,
2226 	.constraints		= knl_uncore_cha_constraints,
2227 	.ops			= &knl_uncore_cha_ops,
2228 	.format_group		= &knl_uncore_cha_format_group,
2229 };
2230 
2231 static struct attribute *knl_uncore_pcu_formats_attr[] = {
2232 	&format_attr_event2.attr,
2233 	&format_attr_use_occ_ctr.attr,
2234 	&format_attr_occ_sel.attr,
2235 	&format_attr_edge.attr,
2236 	&format_attr_tid_en.attr,
2237 	&format_attr_inv.attr,
2238 	&format_attr_thresh6.attr,
2239 	&format_attr_occ_invert.attr,
2240 	&format_attr_occ_edge_det.attr,
2241 	NULL,
2242 };
2243 
2244 static const struct attribute_group knl_uncore_pcu_format_group = {
2245 	.name = "format",
2246 	.attrs = knl_uncore_pcu_formats_attr,
2247 };
2248 
2249 static struct intel_uncore_type knl_uncore_pcu = {
2250 	.name			= "pcu",
2251 	.num_counters		= 4,
2252 	.num_boxes		= 1,
2253 	.perf_ctr_bits		= 48,
2254 	.perf_ctr		= HSWEP_PCU_MSR_PMON_CTR0,
2255 	.event_ctl		= HSWEP_PCU_MSR_PMON_CTL0,
2256 	.event_mask		= KNL_PCU_MSR_PMON_RAW_EVENT_MASK,
2257 	.box_ctl		= HSWEP_PCU_MSR_PMON_BOX_CTL,
2258 	.ops			= &snbep_uncore_msr_ops,
2259 	.format_group		= &knl_uncore_pcu_format_group,
2260 };
2261 
2262 static struct intel_uncore_type *knl_msr_uncores[] = {
2263 	&knl_uncore_ubox,
2264 	&knl_uncore_cha,
2265 	&knl_uncore_pcu,
2266 	NULL,
2267 };
2268 
knl_uncore_cpu_init(void)2269 void knl_uncore_cpu_init(void)
2270 {
2271 	uncore_msr_uncores = knl_msr_uncores;
2272 }
2273 
knl_uncore_imc_enable_box(struct intel_uncore_box * box)2274 static void knl_uncore_imc_enable_box(struct intel_uncore_box *box)
2275 {
2276 	struct pci_dev *pdev = box->pci_dev;
2277 	int box_ctl = uncore_pci_box_ctl(box);
2278 
2279 	pci_write_config_dword(pdev, box_ctl, 0);
2280 }
2281 
knl_uncore_imc_enable_event(struct intel_uncore_box * box,struct perf_event * event)2282 static void knl_uncore_imc_enable_event(struct intel_uncore_box *box,
2283 					struct perf_event *event)
2284 {
2285 	struct pci_dev *pdev = box->pci_dev;
2286 	struct hw_perf_event *hwc = &event->hw;
2287 
2288 	if ((event->attr.config & SNBEP_PMON_CTL_EV_SEL_MASK)
2289 							== UNCORE_FIXED_EVENT)
2290 		pci_write_config_dword(pdev, hwc->config_base,
2291 				       hwc->config | KNL_PMON_FIXED_CTL_EN);
2292 	else
2293 		pci_write_config_dword(pdev, hwc->config_base,
2294 				       hwc->config | SNBEP_PMON_CTL_EN);
2295 }
2296 
2297 static struct intel_uncore_ops knl_uncore_imc_ops = {
2298 	.init_box	= snbep_uncore_pci_init_box,
2299 	.disable_box	= snbep_uncore_pci_disable_box,
2300 	.enable_box	= knl_uncore_imc_enable_box,
2301 	.read_counter	= snbep_uncore_pci_read_counter,
2302 	.enable_event	= knl_uncore_imc_enable_event,
2303 	.disable_event	= snbep_uncore_pci_disable_event,
2304 };
2305 
2306 static struct intel_uncore_type knl_uncore_imc_uclk = {
2307 	.name			= "imc_uclk",
2308 	.num_counters		= 4,
2309 	.num_boxes		= 2,
2310 	.perf_ctr_bits		= 48,
2311 	.fixed_ctr_bits		= 48,
2312 	.perf_ctr		= KNL_UCLK_MSR_PMON_CTR0_LOW,
2313 	.event_ctl		= KNL_UCLK_MSR_PMON_CTL0,
2314 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
2315 	.fixed_ctr		= KNL_UCLK_MSR_PMON_UCLK_FIXED_LOW,
2316 	.fixed_ctl		= KNL_UCLK_MSR_PMON_UCLK_FIXED_CTL,
2317 	.box_ctl		= KNL_UCLK_MSR_PMON_BOX_CTL,
2318 	.ops			= &knl_uncore_imc_ops,
2319 	.format_group		= &snbep_uncore_format_group,
2320 };
2321 
2322 static struct intel_uncore_type knl_uncore_imc_dclk = {
2323 	.name			= "imc",
2324 	.num_counters		= 4,
2325 	.num_boxes		= 6,
2326 	.perf_ctr_bits		= 48,
2327 	.fixed_ctr_bits		= 48,
2328 	.perf_ctr		= KNL_MC0_CH0_MSR_PMON_CTR0_LOW,
2329 	.event_ctl		= KNL_MC0_CH0_MSR_PMON_CTL0,
2330 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
2331 	.fixed_ctr		= KNL_MC0_CH0_MSR_PMON_FIXED_LOW,
2332 	.fixed_ctl		= KNL_MC0_CH0_MSR_PMON_FIXED_CTL,
2333 	.box_ctl		= KNL_MC0_CH0_MSR_PMON_BOX_CTL,
2334 	.ops			= &knl_uncore_imc_ops,
2335 	.format_group		= &snbep_uncore_format_group,
2336 };
2337 
2338 static struct intel_uncore_type knl_uncore_edc_uclk = {
2339 	.name			= "edc_uclk",
2340 	.num_counters		= 4,
2341 	.num_boxes		= 8,
2342 	.perf_ctr_bits		= 48,
2343 	.fixed_ctr_bits		= 48,
2344 	.perf_ctr		= KNL_UCLK_MSR_PMON_CTR0_LOW,
2345 	.event_ctl		= KNL_UCLK_MSR_PMON_CTL0,
2346 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
2347 	.fixed_ctr		= KNL_UCLK_MSR_PMON_UCLK_FIXED_LOW,
2348 	.fixed_ctl		= KNL_UCLK_MSR_PMON_UCLK_FIXED_CTL,
2349 	.box_ctl		= KNL_UCLK_MSR_PMON_BOX_CTL,
2350 	.ops			= &knl_uncore_imc_ops,
2351 	.format_group		= &snbep_uncore_format_group,
2352 };
2353 
2354 static struct intel_uncore_type knl_uncore_edc_eclk = {
2355 	.name			= "edc_eclk",
2356 	.num_counters		= 4,
2357 	.num_boxes		= 8,
2358 	.perf_ctr_bits		= 48,
2359 	.fixed_ctr_bits		= 48,
2360 	.perf_ctr		= KNL_EDC0_ECLK_MSR_PMON_CTR0_LOW,
2361 	.event_ctl		= KNL_EDC0_ECLK_MSR_PMON_CTL0,
2362 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
2363 	.fixed_ctr		= KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_LOW,
2364 	.fixed_ctl		= KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_CTL,
2365 	.box_ctl		= KNL_EDC0_ECLK_MSR_PMON_BOX_CTL,
2366 	.ops			= &knl_uncore_imc_ops,
2367 	.format_group		= &snbep_uncore_format_group,
2368 };
2369 
2370 static struct event_constraint knl_uncore_m2pcie_constraints[] = {
2371 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
2372 	EVENT_CONSTRAINT_END
2373 };
2374 
2375 static struct intel_uncore_type knl_uncore_m2pcie = {
2376 	.name		= "m2pcie",
2377 	.num_counters   = 4,
2378 	.num_boxes	= 1,
2379 	.perf_ctr_bits	= 48,
2380 	.constraints	= knl_uncore_m2pcie_constraints,
2381 	SNBEP_UNCORE_PCI_COMMON_INIT(),
2382 };
2383 
2384 static struct attribute *knl_uncore_irp_formats_attr[] = {
2385 	&format_attr_event.attr,
2386 	&format_attr_umask.attr,
2387 	&format_attr_qor.attr,
2388 	&format_attr_edge.attr,
2389 	&format_attr_inv.attr,
2390 	&format_attr_thresh8.attr,
2391 	NULL,
2392 };
2393 
2394 static const struct attribute_group knl_uncore_irp_format_group = {
2395 	.name = "format",
2396 	.attrs = knl_uncore_irp_formats_attr,
2397 };
2398 
2399 static struct intel_uncore_type knl_uncore_irp = {
2400 	.name			= "irp",
2401 	.num_counters		= 2,
2402 	.num_boxes		= 1,
2403 	.perf_ctr_bits		= 48,
2404 	.perf_ctr		= SNBEP_PCI_PMON_CTR0,
2405 	.event_ctl		= SNBEP_PCI_PMON_CTL0,
2406 	.event_mask		= KNL_IRP_PCI_PMON_RAW_EVENT_MASK,
2407 	.box_ctl		= KNL_IRP_PCI_PMON_BOX_CTL,
2408 	.ops			= &snbep_uncore_pci_ops,
2409 	.format_group		= &knl_uncore_irp_format_group,
2410 };
2411 
2412 enum {
2413 	KNL_PCI_UNCORE_MC_UCLK,
2414 	KNL_PCI_UNCORE_MC_DCLK,
2415 	KNL_PCI_UNCORE_EDC_UCLK,
2416 	KNL_PCI_UNCORE_EDC_ECLK,
2417 	KNL_PCI_UNCORE_M2PCIE,
2418 	KNL_PCI_UNCORE_IRP,
2419 };
2420 
2421 static struct intel_uncore_type *knl_pci_uncores[] = {
2422 	[KNL_PCI_UNCORE_MC_UCLK]	= &knl_uncore_imc_uclk,
2423 	[KNL_PCI_UNCORE_MC_DCLK]	= &knl_uncore_imc_dclk,
2424 	[KNL_PCI_UNCORE_EDC_UCLK]	= &knl_uncore_edc_uclk,
2425 	[KNL_PCI_UNCORE_EDC_ECLK]	= &knl_uncore_edc_eclk,
2426 	[KNL_PCI_UNCORE_M2PCIE]		= &knl_uncore_m2pcie,
2427 	[KNL_PCI_UNCORE_IRP]		= &knl_uncore_irp,
2428 	NULL,
2429 };
2430 
2431 /*
2432  * KNL uses a common PCI device ID for multiple instances of an Uncore PMU
2433  * device type. prior to KNL, each instance of a PMU device type had a unique
2434  * device ID.
2435  *
2436  *	PCI Device ID	Uncore PMU Devices
2437  *	----------------------------------
2438  *	0x7841		MC0 UClk, MC1 UClk
2439  *	0x7843		MC0 DClk CH 0, MC0 DClk CH 1, MC0 DClk CH 2,
2440  *			MC1 DClk CH 0, MC1 DClk CH 1, MC1 DClk CH 2
2441  *	0x7833		EDC0 UClk, EDC1 UClk, EDC2 UClk, EDC3 UClk,
2442  *			EDC4 UClk, EDC5 UClk, EDC6 UClk, EDC7 UClk
2443  *	0x7835		EDC0 EClk, EDC1 EClk, EDC2 EClk, EDC3 EClk,
2444  *			EDC4 EClk, EDC5 EClk, EDC6 EClk, EDC7 EClk
2445  *	0x7817		M2PCIe
2446  *	0x7814		IRP
2447 */
2448 
2449 static const struct pci_device_id knl_uncore_pci_ids[] = {
2450 	{ /* MC0 UClk */
2451 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7841),
2452 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(10, 0, KNL_PCI_UNCORE_MC_UCLK, 0),
2453 	},
2454 	{ /* MC1 UClk */
2455 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7841),
2456 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(11, 0, KNL_PCI_UNCORE_MC_UCLK, 1),
2457 	},
2458 	{ /* MC0 DClk CH 0 */
2459 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2460 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 2, KNL_PCI_UNCORE_MC_DCLK, 0),
2461 	},
2462 	{ /* MC0 DClk CH 1 */
2463 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2464 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 3, KNL_PCI_UNCORE_MC_DCLK, 1),
2465 	},
2466 	{ /* MC0 DClk CH 2 */
2467 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2468 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 4, KNL_PCI_UNCORE_MC_DCLK, 2),
2469 	},
2470 	{ /* MC1 DClk CH 0 */
2471 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2472 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 2, KNL_PCI_UNCORE_MC_DCLK, 3),
2473 	},
2474 	{ /* MC1 DClk CH 1 */
2475 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2476 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 3, KNL_PCI_UNCORE_MC_DCLK, 4),
2477 	},
2478 	{ /* MC1 DClk CH 2 */
2479 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2480 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 4, KNL_PCI_UNCORE_MC_DCLK, 5),
2481 	},
2482 	{ /* EDC0 UClk */
2483 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2484 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(15, 0, KNL_PCI_UNCORE_EDC_UCLK, 0),
2485 	},
2486 	{ /* EDC1 UClk */
2487 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2488 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(16, 0, KNL_PCI_UNCORE_EDC_UCLK, 1),
2489 	},
2490 	{ /* EDC2 UClk */
2491 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2492 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(17, 0, KNL_PCI_UNCORE_EDC_UCLK, 2),
2493 	},
2494 	{ /* EDC3 UClk */
2495 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2496 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 0, KNL_PCI_UNCORE_EDC_UCLK, 3),
2497 	},
2498 	{ /* EDC4 UClk */
2499 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2500 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(19, 0, KNL_PCI_UNCORE_EDC_UCLK, 4),
2501 	},
2502 	{ /* EDC5 UClk */
2503 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2504 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(20, 0, KNL_PCI_UNCORE_EDC_UCLK, 5),
2505 	},
2506 	{ /* EDC6 UClk */
2507 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2508 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 0, KNL_PCI_UNCORE_EDC_UCLK, 6),
2509 	},
2510 	{ /* EDC7 UClk */
2511 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2512 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(22, 0, KNL_PCI_UNCORE_EDC_UCLK, 7),
2513 	},
2514 	{ /* EDC0 EClk */
2515 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2516 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(24, 2, KNL_PCI_UNCORE_EDC_ECLK, 0),
2517 	},
2518 	{ /* EDC1 EClk */
2519 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2520 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(25, 2, KNL_PCI_UNCORE_EDC_ECLK, 1),
2521 	},
2522 	{ /* EDC2 EClk */
2523 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2524 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(26, 2, KNL_PCI_UNCORE_EDC_ECLK, 2),
2525 	},
2526 	{ /* EDC3 EClk */
2527 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2528 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(27, 2, KNL_PCI_UNCORE_EDC_ECLK, 3),
2529 	},
2530 	{ /* EDC4 EClk */
2531 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2532 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(28, 2, KNL_PCI_UNCORE_EDC_ECLK, 4),
2533 	},
2534 	{ /* EDC5 EClk */
2535 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2536 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(29, 2, KNL_PCI_UNCORE_EDC_ECLK, 5),
2537 	},
2538 	{ /* EDC6 EClk */
2539 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2540 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(30, 2, KNL_PCI_UNCORE_EDC_ECLK, 6),
2541 	},
2542 	{ /* EDC7 EClk */
2543 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2544 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(31, 2, KNL_PCI_UNCORE_EDC_ECLK, 7),
2545 	},
2546 	{ /* M2PCIe */
2547 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7817),
2548 		.driver_data = UNCORE_PCI_DEV_DATA(KNL_PCI_UNCORE_M2PCIE, 0),
2549 	},
2550 	{ /* IRP */
2551 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7814),
2552 		.driver_data = UNCORE_PCI_DEV_DATA(KNL_PCI_UNCORE_IRP, 0),
2553 	},
2554 	{ /* end: all zeroes */ }
2555 };
2556 
2557 static struct pci_driver knl_uncore_pci_driver = {
2558 	.name		= "knl_uncore",
2559 	.id_table	= knl_uncore_pci_ids,
2560 };
2561 
knl_uncore_pci_init(void)2562 int knl_uncore_pci_init(void)
2563 {
2564 	int ret;
2565 
2566 	/* All KNL PCI based PMON units are on the same PCI bus except IRP */
2567 	ret = snb_pci2phy_map_init(0x7814); /* IRP */
2568 	if (ret)
2569 		return ret;
2570 	ret = snb_pci2phy_map_init(0x7817); /* M2PCIe */
2571 	if (ret)
2572 		return ret;
2573 	uncore_pci_uncores = knl_pci_uncores;
2574 	uncore_pci_driver = &knl_uncore_pci_driver;
2575 	return 0;
2576 }
2577 
2578 /* end of KNL uncore support */
2579 
2580 /* Haswell-EP uncore support */
2581 static struct attribute *hswep_uncore_ubox_formats_attr[] = {
2582 	&format_attr_event.attr,
2583 	&format_attr_umask.attr,
2584 	&format_attr_edge.attr,
2585 	&format_attr_inv.attr,
2586 	&format_attr_thresh5.attr,
2587 	&format_attr_filter_tid2.attr,
2588 	&format_attr_filter_cid.attr,
2589 	NULL,
2590 };
2591 
2592 static const struct attribute_group hswep_uncore_ubox_format_group = {
2593 	.name = "format",
2594 	.attrs = hswep_uncore_ubox_formats_attr,
2595 };
2596 
hswep_ubox_hw_config(struct intel_uncore_box * box,struct perf_event * event)2597 static int hswep_ubox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
2598 {
2599 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
2600 	reg1->reg = HSWEP_U_MSR_PMON_FILTER;
2601 	reg1->config = event->attr.config1 & HSWEP_U_MSR_PMON_BOX_FILTER_MASK;
2602 	reg1->idx = 0;
2603 	return 0;
2604 }
2605 
2606 static struct intel_uncore_ops hswep_uncore_ubox_ops = {
2607 	SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
2608 	.hw_config		= hswep_ubox_hw_config,
2609 	.get_constraint		= uncore_get_constraint,
2610 	.put_constraint		= uncore_put_constraint,
2611 };
2612 
2613 static struct intel_uncore_type hswep_uncore_ubox = {
2614 	.name			= "ubox",
2615 	.num_counters		= 2,
2616 	.num_boxes		= 1,
2617 	.perf_ctr_bits		= 44,
2618 	.fixed_ctr_bits		= 48,
2619 	.perf_ctr		= HSWEP_U_MSR_PMON_CTR0,
2620 	.event_ctl		= HSWEP_U_MSR_PMON_CTL0,
2621 	.event_mask		= SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
2622 	.fixed_ctr		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
2623 	.fixed_ctl		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
2624 	.num_shared_regs	= 1,
2625 	.ops			= &hswep_uncore_ubox_ops,
2626 	.format_group		= &hswep_uncore_ubox_format_group,
2627 };
2628 
2629 static struct attribute *hswep_uncore_cbox_formats_attr[] = {
2630 	&format_attr_event.attr,
2631 	&format_attr_umask.attr,
2632 	&format_attr_edge.attr,
2633 	&format_attr_tid_en.attr,
2634 	&format_attr_thresh8.attr,
2635 	&format_attr_filter_tid3.attr,
2636 	&format_attr_filter_link2.attr,
2637 	&format_attr_filter_state3.attr,
2638 	&format_attr_filter_nid2.attr,
2639 	&format_attr_filter_opc2.attr,
2640 	&format_attr_filter_nc.attr,
2641 	&format_attr_filter_c6.attr,
2642 	&format_attr_filter_isoc.attr,
2643 	NULL,
2644 };
2645 
2646 static const struct attribute_group hswep_uncore_cbox_format_group = {
2647 	.name = "format",
2648 	.attrs = hswep_uncore_cbox_formats_attr,
2649 };
2650 
2651 static struct event_constraint hswep_uncore_cbox_constraints[] = {
2652 	UNCORE_EVENT_CONSTRAINT(0x01, 0x1),
2653 	UNCORE_EVENT_CONSTRAINT(0x09, 0x1),
2654 	UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
2655 	UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
2656 	UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
2657 	UNCORE_EVENT_CONSTRAINT(0x3b, 0x1),
2658 	UNCORE_EVENT_CONSTRAINT(0x3e, 0x1),
2659 	EVENT_CONSTRAINT_END
2660 };
2661 
2662 static struct extra_reg hswep_uncore_cbox_extra_regs[] = {
2663 	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
2664 				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
2665 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
2666 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
2667 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
2668 	SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
2669 	SNBEP_CBO_EVENT_EXTRA_REG(0x2134, 0xffff, 0x4),
2670 	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x4),
2671 	SNBEP_CBO_EVENT_EXTRA_REG(0x4037, 0x40ff, 0x8),
2672 	SNBEP_CBO_EVENT_EXTRA_REG(0x4028, 0x40ff, 0x8),
2673 	SNBEP_CBO_EVENT_EXTRA_REG(0x4032, 0x40ff, 0x8),
2674 	SNBEP_CBO_EVENT_EXTRA_REG(0x4029, 0x40ff, 0x8),
2675 	SNBEP_CBO_EVENT_EXTRA_REG(0x4033, 0x40ff, 0x8),
2676 	SNBEP_CBO_EVENT_EXTRA_REG(0x402A, 0x40ff, 0x8),
2677 	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x12),
2678 	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10),
2679 	SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0x18),
2680 	SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x8),
2681 	SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x8),
2682 	SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x8),
2683 	SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0x18),
2684 	SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x8),
2685 	SNBEP_CBO_EVENT_EXTRA_REG(0x2335, 0xffff, 0x10),
2686 	SNBEP_CBO_EVENT_EXTRA_REG(0x8335, 0xffff, 0x10),
2687 	SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10),
2688 	SNBEP_CBO_EVENT_EXTRA_REG(0x8135, 0xffff, 0x10),
2689 	SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x10),
2690 	SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x10),
2691 	SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0x18),
2692 	SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x8),
2693 	SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x8),
2694 	SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0x18),
2695 	SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x8),
2696 	SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10),
2697 	SNBEP_CBO_EVENT_EXTRA_REG(0x8336, 0xffff, 0x10),
2698 	SNBEP_CBO_EVENT_EXTRA_REG(0x2136, 0xffff, 0x10),
2699 	SNBEP_CBO_EVENT_EXTRA_REG(0x8136, 0xffff, 0x10),
2700 	SNBEP_CBO_EVENT_EXTRA_REG(0x5036, 0xffff, 0x8),
2701 	EVENT_EXTRA_END
2702 };
2703 
hswep_cbox_filter_mask(int fields)2704 static u64 hswep_cbox_filter_mask(int fields)
2705 {
2706 	u64 mask = 0;
2707 	if (fields & 0x1)
2708 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_TID;
2709 	if (fields & 0x2)
2710 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_LINK;
2711 	if (fields & 0x4)
2712 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_STATE;
2713 	if (fields & 0x8)
2714 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_NID;
2715 	if (fields & 0x10) {
2716 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_OPC;
2717 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_NC;
2718 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_C6;
2719 		mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_ISOC;
2720 	}
2721 	return mask;
2722 }
2723 
2724 static struct event_constraint *
hswep_cbox_get_constraint(struct intel_uncore_box * box,struct perf_event * event)2725 hswep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
2726 {
2727 	return __snbep_cbox_get_constraint(box, event, hswep_cbox_filter_mask);
2728 }
2729 
hswep_cbox_hw_config(struct intel_uncore_box * box,struct perf_event * event)2730 static int hswep_cbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
2731 {
2732 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
2733 	struct extra_reg *er;
2734 	int idx = 0;
2735 
2736 	for (er = hswep_uncore_cbox_extra_regs; er->msr; er++) {
2737 		if (er->event != (event->hw.config & er->config_mask))
2738 			continue;
2739 		idx |= er->idx;
2740 	}
2741 
2742 	if (idx) {
2743 		reg1->reg = HSWEP_C0_MSR_PMON_BOX_FILTER0 +
2744 			    HSWEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
2745 		reg1->config = event->attr.config1 & hswep_cbox_filter_mask(idx);
2746 		reg1->idx = idx;
2747 	}
2748 	return 0;
2749 }
2750 
hswep_cbox_enable_event(struct intel_uncore_box * box,struct perf_event * event)2751 static void hswep_cbox_enable_event(struct intel_uncore_box *box,
2752 				  struct perf_event *event)
2753 {
2754 	struct hw_perf_event *hwc = &event->hw;
2755 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
2756 
2757 	if (reg1->idx != EXTRA_REG_NONE) {
2758 		u64 filter = uncore_shared_reg_config(box, 0);
2759 		wrmsrl(reg1->reg, filter & 0xffffffff);
2760 		wrmsrl(reg1->reg + 1, filter >> 32);
2761 	}
2762 
2763 	wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
2764 }
2765 
2766 static struct intel_uncore_ops hswep_uncore_cbox_ops = {
2767 	.init_box		= snbep_uncore_msr_init_box,
2768 	.disable_box		= snbep_uncore_msr_disable_box,
2769 	.enable_box		= snbep_uncore_msr_enable_box,
2770 	.disable_event		= snbep_uncore_msr_disable_event,
2771 	.enable_event		= hswep_cbox_enable_event,
2772 	.read_counter		= uncore_msr_read_counter,
2773 	.hw_config		= hswep_cbox_hw_config,
2774 	.get_constraint		= hswep_cbox_get_constraint,
2775 	.put_constraint		= snbep_cbox_put_constraint,
2776 };
2777 
2778 static struct intel_uncore_type hswep_uncore_cbox = {
2779 	.name			= "cbox",
2780 	.num_counters		= 4,
2781 	.num_boxes		= 18,
2782 	.perf_ctr_bits		= 48,
2783 	.event_ctl		= HSWEP_C0_MSR_PMON_CTL0,
2784 	.perf_ctr		= HSWEP_C0_MSR_PMON_CTR0,
2785 	.event_mask		= SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
2786 	.box_ctl		= HSWEP_C0_MSR_PMON_BOX_CTL,
2787 	.msr_offset		= HSWEP_CBO_MSR_OFFSET,
2788 	.num_shared_regs	= 1,
2789 	.constraints		= hswep_uncore_cbox_constraints,
2790 	.ops			= &hswep_uncore_cbox_ops,
2791 	.format_group		= &hswep_uncore_cbox_format_group,
2792 };
2793 
2794 /*
2795  * Write SBOX Initialization register bit by bit to avoid spurious #GPs
2796  */
hswep_uncore_sbox_msr_init_box(struct intel_uncore_box * box)2797 static void hswep_uncore_sbox_msr_init_box(struct intel_uncore_box *box)
2798 {
2799 	unsigned msr = uncore_msr_box_ctl(box);
2800 
2801 	if (msr) {
2802 		u64 init = SNBEP_PMON_BOX_CTL_INT;
2803 		u64 flags = 0;
2804 		int i;
2805 
2806 		for_each_set_bit(i, (unsigned long *)&init, 64) {
2807 			flags |= (1ULL << i);
2808 			wrmsrl(msr, flags);
2809 		}
2810 	}
2811 }
2812 
2813 static struct intel_uncore_ops hswep_uncore_sbox_msr_ops = {
2814 	__SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
2815 	.init_box		= hswep_uncore_sbox_msr_init_box
2816 };
2817 
2818 static struct attribute *hswep_uncore_sbox_formats_attr[] = {
2819 	&format_attr_event.attr,
2820 	&format_attr_umask.attr,
2821 	&format_attr_edge.attr,
2822 	&format_attr_tid_en.attr,
2823 	&format_attr_inv.attr,
2824 	&format_attr_thresh8.attr,
2825 	NULL,
2826 };
2827 
2828 static const struct attribute_group hswep_uncore_sbox_format_group = {
2829 	.name = "format",
2830 	.attrs = hswep_uncore_sbox_formats_attr,
2831 };
2832 
2833 static struct intel_uncore_type hswep_uncore_sbox = {
2834 	.name			= "sbox",
2835 	.num_counters		= 4,
2836 	.num_boxes		= 4,
2837 	.perf_ctr_bits		= 44,
2838 	.event_ctl		= HSWEP_S0_MSR_PMON_CTL0,
2839 	.perf_ctr		= HSWEP_S0_MSR_PMON_CTR0,
2840 	.event_mask		= HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
2841 	.box_ctl		= HSWEP_S0_MSR_PMON_BOX_CTL,
2842 	.msr_offset		= HSWEP_SBOX_MSR_OFFSET,
2843 	.ops			= &hswep_uncore_sbox_msr_ops,
2844 	.format_group		= &hswep_uncore_sbox_format_group,
2845 };
2846 
hswep_pcu_hw_config(struct intel_uncore_box * box,struct perf_event * event)2847 static int hswep_pcu_hw_config(struct intel_uncore_box *box, struct perf_event *event)
2848 {
2849 	struct hw_perf_event *hwc = &event->hw;
2850 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
2851 	int ev_sel = hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK;
2852 
2853 	if (ev_sel >= 0xb && ev_sel <= 0xe) {
2854 		reg1->reg = HSWEP_PCU_MSR_PMON_BOX_FILTER;
2855 		reg1->idx = ev_sel - 0xb;
2856 		reg1->config = event->attr.config1 & (0xff << reg1->idx);
2857 	}
2858 	return 0;
2859 }
2860 
2861 static struct intel_uncore_ops hswep_uncore_pcu_ops = {
2862 	SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
2863 	.hw_config		= hswep_pcu_hw_config,
2864 	.get_constraint		= snbep_pcu_get_constraint,
2865 	.put_constraint		= snbep_pcu_put_constraint,
2866 };
2867 
2868 static struct intel_uncore_type hswep_uncore_pcu = {
2869 	.name			= "pcu",
2870 	.num_counters		= 4,
2871 	.num_boxes		= 1,
2872 	.perf_ctr_bits		= 48,
2873 	.perf_ctr		= HSWEP_PCU_MSR_PMON_CTR0,
2874 	.event_ctl		= HSWEP_PCU_MSR_PMON_CTL0,
2875 	.event_mask		= SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
2876 	.box_ctl		= HSWEP_PCU_MSR_PMON_BOX_CTL,
2877 	.num_shared_regs	= 1,
2878 	.ops			= &hswep_uncore_pcu_ops,
2879 	.format_group		= &snbep_uncore_pcu_format_group,
2880 };
2881 
2882 static struct intel_uncore_type *hswep_msr_uncores[] = {
2883 	&hswep_uncore_ubox,
2884 	&hswep_uncore_cbox,
2885 	&hswep_uncore_sbox,
2886 	&hswep_uncore_pcu,
2887 	NULL,
2888 };
2889 
2890 #define HSWEP_PCU_DID			0x2fc0
2891 #define HSWEP_PCU_CAPID4_OFFET		0x94
2892 #define hswep_get_chop(_cap)		(((_cap) >> 6) & 0x3)
2893 
hswep_has_limit_sbox(unsigned int device)2894 static bool hswep_has_limit_sbox(unsigned int device)
2895 {
2896 	struct pci_dev *dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, NULL);
2897 	u32 capid4;
2898 
2899 	if (!dev)
2900 		return false;
2901 
2902 	pci_read_config_dword(dev, HSWEP_PCU_CAPID4_OFFET, &capid4);
2903 	pci_dev_put(dev);
2904 	if (!hswep_get_chop(capid4))
2905 		return true;
2906 
2907 	return false;
2908 }
2909 
hswep_uncore_cpu_init(void)2910 void hswep_uncore_cpu_init(void)
2911 {
2912 	if (hswep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
2913 		hswep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
2914 
2915 	/* Detect 6-8 core systems with only two SBOXes */
2916 	if (hswep_has_limit_sbox(HSWEP_PCU_DID))
2917 		hswep_uncore_sbox.num_boxes = 2;
2918 
2919 	uncore_msr_uncores = hswep_msr_uncores;
2920 }
2921 
2922 static struct intel_uncore_type hswep_uncore_ha = {
2923 	.name		= "ha",
2924 	.num_counters   = 4,
2925 	.num_boxes	= 2,
2926 	.perf_ctr_bits	= 48,
2927 	SNBEP_UNCORE_PCI_COMMON_INIT(),
2928 };
2929 
2930 static struct uncore_event_desc hswep_uncore_imc_events[] = {
2931 	INTEL_UNCORE_EVENT_DESC(clockticks,      "event=0x00,umask=0x00"),
2932 	INTEL_UNCORE_EVENT_DESC(cas_count_read,  "event=0x04,umask=0x03"),
2933 	INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
2934 	INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
2935 	INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x0c"),
2936 	INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
2937 	INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
2938 	{ /* end: all zeroes */ },
2939 };
2940 
2941 static struct intel_uncore_type hswep_uncore_imc = {
2942 	.name		= "imc",
2943 	.num_counters   = 4,
2944 	.num_boxes	= 8,
2945 	.perf_ctr_bits	= 48,
2946 	.fixed_ctr_bits	= 48,
2947 	.fixed_ctr	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
2948 	.fixed_ctl	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
2949 	.event_descs	= hswep_uncore_imc_events,
2950 	SNBEP_UNCORE_PCI_COMMON_INIT(),
2951 };
2952 
2953 static unsigned hswep_uncore_irp_ctrs[] = {0xa0, 0xa8, 0xb0, 0xb8};
2954 
hswep_uncore_irp_read_counter(struct intel_uncore_box * box,struct perf_event * event)2955 static u64 hswep_uncore_irp_read_counter(struct intel_uncore_box *box, struct perf_event *event)
2956 {
2957 	struct pci_dev *pdev = box->pci_dev;
2958 	struct hw_perf_event *hwc = &event->hw;
2959 	u64 count = 0;
2960 
2961 	pci_read_config_dword(pdev, hswep_uncore_irp_ctrs[hwc->idx], (u32 *)&count);
2962 	pci_read_config_dword(pdev, hswep_uncore_irp_ctrs[hwc->idx] + 4, (u32 *)&count + 1);
2963 
2964 	return count;
2965 }
2966 
2967 static struct intel_uncore_ops hswep_uncore_irp_ops = {
2968 	.init_box	= snbep_uncore_pci_init_box,
2969 	.disable_box	= snbep_uncore_pci_disable_box,
2970 	.enable_box	= snbep_uncore_pci_enable_box,
2971 	.disable_event	= ivbep_uncore_irp_disable_event,
2972 	.enable_event	= ivbep_uncore_irp_enable_event,
2973 	.read_counter	= hswep_uncore_irp_read_counter,
2974 };
2975 
2976 static struct intel_uncore_type hswep_uncore_irp = {
2977 	.name			= "irp",
2978 	.num_counters		= 4,
2979 	.num_boxes		= 1,
2980 	.perf_ctr_bits		= 48,
2981 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
2982 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
2983 	.ops			= &hswep_uncore_irp_ops,
2984 	.format_group		= &snbep_uncore_format_group,
2985 };
2986 
2987 static struct intel_uncore_type hswep_uncore_qpi = {
2988 	.name			= "qpi",
2989 	.num_counters		= 4,
2990 	.num_boxes		= 3,
2991 	.perf_ctr_bits		= 48,
2992 	.perf_ctr		= SNBEP_PCI_PMON_CTR0,
2993 	.event_ctl		= SNBEP_PCI_PMON_CTL0,
2994 	.event_mask		= SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
2995 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
2996 	.num_shared_regs	= 1,
2997 	.ops			= &snbep_uncore_qpi_ops,
2998 	.format_group		= &snbep_uncore_qpi_format_group,
2999 };
3000 
3001 static struct event_constraint hswep_uncore_r2pcie_constraints[] = {
3002 	UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
3003 	UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
3004 	UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
3005 	UNCORE_EVENT_CONSTRAINT(0x23, 0x1),
3006 	UNCORE_EVENT_CONSTRAINT(0x24, 0x1),
3007 	UNCORE_EVENT_CONSTRAINT(0x25, 0x1),
3008 	UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
3009 	UNCORE_EVENT_CONSTRAINT(0x27, 0x1),
3010 	UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
3011 	UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
3012 	UNCORE_EVENT_CONSTRAINT(0x2a, 0x1),
3013 	UNCORE_EVENT_CONSTRAINT(0x2b, 0x3),
3014 	UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
3015 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
3016 	UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
3017 	UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
3018 	UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
3019 	UNCORE_EVENT_CONSTRAINT(0x35, 0x3),
3020 	EVENT_CONSTRAINT_END
3021 };
3022 
3023 static struct intel_uncore_type hswep_uncore_r2pcie = {
3024 	.name		= "r2pcie",
3025 	.num_counters   = 4,
3026 	.num_boxes	= 1,
3027 	.perf_ctr_bits	= 48,
3028 	.constraints	= hswep_uncore_r2pcie_constraints,
3029 	SNBEP_UNCORE_PCI_COMMON_INIT(),
3030 };
3031 
3032 static struct event_constraint hswep_uncore_r3qpi_constraints[] = {
3033 	UNCORE_EVENT_CONSTRAINT(0x01, 0x3),
3034 	UNCORE_EVENT_CONSTRAINT(0x07, 0x7),
3035 	UNCORE_EVENT_CONSTRAINT(0x08, 0x7),
3036 	UNCORE_EVENT_CONSTRAINT(0x09, 0x7),
3037 	UNCORE_EVENT_CONSTRAINT(0x0a, 0x7),
3038 	UNCORE_EVENT_CONSTRAINT(0x0e, 0x7),
3039 	UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
3040 	UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
3041 	UNCORE_EVENT_CONSTRAINT(0x12, 0x3),
3042 	UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
3043 	UNCORE_EVENT_CONSTRAINT(0x14, 0x3),
3044 	UNCORE_EVENT_CONSTRAINT(0x15, 0x3),
3045 	UNCORE_EVENT_CONSTRAINT(0x1f, 0x3),
3046 	UNCORE_EVENT_CONSTRAINT(0x20, 0x3),
3047 	UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
3048 	UNCORE_EVENT_CONSTRAINT(0x22, 0x3),
3049 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
3050 	UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
3051 	UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
3052 	UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
3053 	UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
3054 	UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
3055 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
3056 	UNCORE_EVENT_CONSTRAINT(0x2e, 0x3),
3057 	UNCORE_EVENT_CONSTRAINT(0x2f, 0x3),
3058 	UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
3059 	UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
3060 	UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
3061 	UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
3062 	UNCORE_EVENT_CONSTRAINT(0x36, 0x3),
3063 	UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
3064 	UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
3065 	UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
3066 	EVENT_CONSTRAINT_END
3067 };
3068 
3069 static struct intel_uncore_type hswep_uncore_r3qpi = {
3070 	.name		= "r3qpi",
3071 	.num_counters   = 3,
3072 	.num_boxes	= 3,
3073 	.perf_ctr_bits	= 44,
3074 	.constraints	= hswep_uncore_r3qpi_constraints,
3075 	SNBEP_UNCORE_PCI_COMMON_INIT(),
3076 };
3077 
3078 enum {
3079 	HSWEP_PCI_UNCORE_HA,
3080 	HSWEP_PCI_UNCORE_IMC,
3081 	HSWEP_PCI_UNCORE_IRP,
3082 	HSWEP_PCI_UNCORE_QPI,
3083 	HSWEP_PCI_UNCORE_R2PCIE,
3084 	HSWEP_PCI_UNCORE_R3QPI,
3085 };
3086 
3087 static struct intel_uncore_type *hswep_pci_uncores[] = {
3088 	[HSWEP_PCI_UNCORE_HA]	= &hswep_uncore_ha,
3089 	[HSWEP_PCI_UNCORE_IMC]	= &hswep_uncore_imc,
3090 	[HSWEP_PCI_UNCORE_IRP]	= &hswep_uncore_irp,
3091 	[HSWEP_PCI_UNCORE_QPI]	= &hswep_uncore_qpi,
3092 	[HSWEP_PCI_UNCORE_R2PCIE]	= &hswep_uncore_r2pcie,
3093 	[HSWEP_PCI_UNCORE_R3QPI]	= &hswep_uncore_r3qpi,
3094 	NULL,
3095 };
3096 
3097 static const struct pci_device_id hswep_uncore_pci_ids[] = {
3098 	{ /* Home Agent 0 */
3099 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f30),
3100 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_HA, 0),
3101 	},
3102 	{ /* Home Agent 1 */
3103 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f38),
3104 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_HA, 1),
3105 	},
3106 	{ /* MC0 Channel 0 */
3107 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb0),
3108 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 0),
3109 	},
3110 	{ /* MC0 Channel 1 */
3111 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb1),
3112 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 1),
3113 	},
3114 	{ /* MC0 Channel 2 */
3115 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb4),
3116 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 2),
3117 	},
3118 	{ /* MC0 Channel 3 */
3119 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb5),
3120 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 3),
3121 	},
3122 	{ /* MC1 Channel 0 */
3123 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd0),
3124 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 4),
3125 	},
3126 	{ /* MC1 Channel 1 */
3127 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd1),
3128 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 5),
3129 	},
3130 	{ /* MC1 Channel 2 */
3131 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd4),
3132 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 6),
3133 	},
3134 	{ /* MC1 Channel 3 */
3135 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd5),
3136 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 7),
3137 	},
3138 	{ /* IRP */
3139 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f39),
3140 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IRP, 0),
3141 	},
3142 	{ /* QPI0 Port 0 */
3143 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f32),
3144 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_QPI, 0),
3145 	},
3146 	{ /* QPI0 Port 1 */
3147 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f33),
3148 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_QPI, 1),
3149 	},
3150 	{ /* QPI1 Port 2 */
3151 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f3a),
3152 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_QPI, 2),
3153 	},
3154 	{ /* R2PCIe */
3155 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f34),
3156 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R2PCIE, 0),
3157 	},
3158 	{ /* R3QPI0 Link 0 */
3159 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f36),
3160 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R3QPI, 0),
3161 	},
3162 	{ /* R3QPI0 Link 1 */
3163 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f37),
3164 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R3QPI, 1),
3165 	},
3166 	{ /* R3QPI1 Link 2 */
3167 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f3e),
3168 		.driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R3QPI, 2),
3169 	},
3170 	{ /* QPI Port 0 filter  */
3171 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f86),
3172 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3173 						   SNBEP_PCI_QPI_PORT0_FILTER),
3174 	},
3175 	{ /* QPI Port 1 filter  */
3176 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f96),
3177 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3178 						   SNBEP_PCI_QPI_PORT1_FILTER),
3179 	},
3180 	{ /* end: all zeroes */ }
3181 };
3182 
3183 static struct pci_driver hswep_uncore_pci_driver = {
3184 	.name		= "hswep_uncore",
3185 	.id_table	= hswep_uncore_pci_ids,
3186 };
3187 
hswep_uncore_pci_init(void)3188 int hswep_uncore_pci_init(void)
3189 {
3190 	int ret = snbep_pci2phy_map_init(0x2f1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
3191 	if (ret)
3192 		return ret;
3193 	uncore_pci_uncores = hswep_pci_uncores;
3194 	uncore_pci_driver = &hswep_uncore_pci_driver;
3195 	return 0;
3196 }
3197 /* end of Haswell-EP uncore support */
3198 
3199 /* BDX uncore support */
3200 
3201 static struct intel_uncore_type bdx_uncore_ubox = {
3202 	.name			= "ubox",
3203 	.num_counters		= 2,
3204 	.num_boxes		= 1,
3205 	.perf_ctr_bits		= 48,
3206 	.fixed_ctr_bits		= 48,
3207 	.perf_ctr		= HSWEP_U_MSR_PMON_CTR0,
3208 	.event_ctl		= HSWEP_U_MSR_PMON_CTL0,
3209 	.event_mask		= SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
3210 	.fixed_ctr		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
3211 	.fixed_ctl		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
3212 	.num_shared_regs	= 1,
3213 	.ops			= &ivbep_uncore_msr_ops,
3214 	.format_group		= &ivbep_uncore_ubox_format_group,
3215 };
3216 
3217 static struct event_constraint bdx_uncore_cbox_constraints[] = {
3218 	UNCORE_EVENT_CONSTRAINT(0x09, 0x3),
3219 	UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
3220 	UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
3221 	UNCORE_EVENT_CONSTRAINT(0x3e, 0x1),
3222 	EVENT_CONSTRAINT_END
3223 };
3224 
3225 static struct intel_uncore_type bdx_uncore_cbox = {
3226 	.name			= "cbox",
3227 	.num_counters		= 4,
3228 	.num_boxes		= 24,
3229 	.perf_ctr_bits		= 48,
3230 	.event_ctl		= HSWEP_C0_MSR_PMON_CTL0,
3231 	.perf_ctr		= HSWEP_C0_MSR_PMON_CTR0,
3232 	.event_mask		= SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
3233 	.box_ctl		= HSWEP_C0_MSR_PMON_BOX_CTL,
3234 	.msr_offset		= HSWEP_CBO_MSR_OFFSET,
3235 	.num_shared_regs	= 1,
3236 	.constraints		= bdx_uncore_cbox_constraints,
3237 	.ops			= &hswep_uncore_cbox_ops,
3238 	.format_group		= &hswep_uncore_cbox_format_group,
3239 };
3240 
3241 static struct intel_uncore_type bdx_uncore_sbox = {
3242 	.name			= "sbox",
3243 	.num_counters		= 4,
3244 	.num_boxes		= 4,
3245 	.perf_ctr_bits		= 48,
3246 	.event_ctl		= HSWEP_S0_MSR_PMON_CTL0,
3247 	.perf_ctr		= HSWEP_S0_MSR_PMON_CTR0,
3248 	.event_mask		= HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
3249 	.box_ctl		= HSWEP_S0_MSR_PMON_BOX_CTL,
3250 	.msr_offset		= HSWEP_SBOX_MSR_OFFSET,
3251 	.ops			= &hswep_uncore_sbox_msr_ops,
3252 	.format_group		= &hswep_uncore_sbox_format_group,
3253 };
3254 
3255 #define BDX_MSR_UNCORE_SBOX	3
3256 
3257 static struct intel_uncore_type *bdx_msr_uncores[] = {
3258 	&bdx_uncore_ubox,
3259 	&bdx_uncore_cbox,
3260 	&hswep_uncore_pcu,
3261 	&bdx_uncore_sbox,
3262 	NULL,
3263 };
3264 
3265 /* Bit 7 'Use Occupancy' is not available for counter 0 on BDX */
3266 static struct event_constraint bdx_uncore_pcu_constraints[] = {
3267 	EVENT_CONSTRAINT(0x80, 0xe, 0x80),
3268 	EVENT_CONSTRAINT_END
3269 };
3270 
3271 #define BDX_PCU_DID			0x6fc0
3272 
bdx_uncore_cpu_init(void)3273 void bdx_uncore_cpu_init(void)
3274 {
3275 	if (bdx_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
3276 		bdx_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
3277 	uncore_msr_uncores = bdx_msr_uncores;
3278 
3279 	/* Detect systems with no SBOXes */
3280 	if ((boot_cpu_data.x86_model == 86) || hswep_has_limit_sbox(BDX_PCU_DID))
3281 		uncore_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL;
3282 
3283 	hswep_uncore_pcu.constraints = bdx_uncore_pcu_constraints;
3284 }
3285 
3286 static struct intel_uncore_type bdx_uncore_ha = {
3287 	.name		= "ha",
3288 	.num_counters   = 4,
3289 	.num_boxes	= 2,
3290 	.perf_ctr_bits	= 48,
3291 	SNBEP_UNCORE_PCI_COMMON_INIT(),
3292 };
3293 
3294 static struct intel_uncore_type bdx_uncore_imc = {
3295 	.name		= "imc",
3296 	.num_counters   = 4,
3297 	.num_boxes	= 8,
3298 	.perf_ctr_bits	= 48,
3299 	.fixed_ctr_bits	= 48,
3300 	.fixed_ctr	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
3301 	.fixed_ctl	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
3302 	.event_descs	= hswep_uncore_imc_events,
3303 	SNBEP_UNCORE_PCI_COMMON_INIT(),
3304 };
3305 
3306 static struct intel_uncore_type bdx_uncore_irp = {
3307 	.name			= "irp",
3308 	.num_counters		= 4,
3309 	.num_boxes		= 1,
3310 	.perf_ctr_bits		= 48,
3311 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
3312 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
3313 	.ops			= &hswep_uncore_irp_ops,
3314 	.format_group		= &snbep_uncore_format_group,
3315 };
3316 
3317 static struct intel_uncore_type bdx_uncore_qpi = {
3318 	.name			= "qpi",
3319 	.num_counters		= 4,
3320 	.num_boxes		= 3,
3321 	.perf_ctr_bits		= 48,
3322 	.perf_ctr		= SNBEP_PCI_PMON_CTR0,
3323 	.event_ctl		= SNBEP_PCI_PMON_CTL0,
3324 	.event_mask		= SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
3325 	.box_ctl		= SNBEP_PCI_PMON_BOX_CTL,
3326 	.num_shared_regs	= 1,
3327 	.ops			= &snbep_uncore_qpi_ops,
3328 	.format_group		= &snbep_uncore_qpi_format_group,
3329 };
3330 
3331 static struct event_constraint bdx_uncore_r2pcie_constraints[] = {
3332 	UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
3333 	UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
3334 	UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
3335 	UNCORE_EVENT_CONSTRAINT(0x23, 0x1),
3336 	UNCORE_EVENT_CONSTRAINT(0x25, 0x1),
3337 	UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
3338 	UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
3339 	UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
3340 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
3341 	EVENT_CONSTRAINT_END
3342 };
3343 
3344 static struct intel_uncore_type bdx_uncore_r2pcie = {
3345 	.name		= "r2pcie",
3346 	.num_counters   = 4,
3347 	.num_boxes	= 1,
3348 	.perf_ctr_bits	= 48,
3349 	.constraints	= bdx_uncore_r2pcie_constraints,
3350 	SNBEP_UNCORE_PCI_COMMON_INIT(),
3351 };
3352 
3353 static struct event_constraint bdx_uncore_r3qpi_constraints[] = {
3354 	UNCORE_EVENT_CONSTRAINT(0x01, 0x7),
3355 	UNCORE_EVENT_CONSTRAINT(0x07, 0x7),
3356 	UNCORE_EVENT_CONSTRAINT(0x08, 0x7),
3357 	UNCORE_EVENT_CONSTRAINT(0x09, 0x7),
3358 	UNCORE_EVENT_CONSTRAINT(0x0a, 0x7),
3359 	UNCORE_EVENT_CONSTRAINT(0x0e, 0x7),
3360 	UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
3361 	UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
3362 	UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
3363 	UNCORE_EVENT_CONSTRAINT(0x14, 0x3),
3364 	UNCORE_EVENT_CONSTRAINT(0x15, 0x3),
3365 	UNCORE_EVENT_CONSTRAINT(0x1f, 0x3),
3366 	UNCORE_EVENT_CONSTRAINT(0x20, 0x3),
3367 	UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
3368 	UNCORE_EVENT_CONSTRAINT(0x22, 0x3),
3369 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
3370 	UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
3371 	UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
3372 	UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
3373 	UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
3374 	UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
3375 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
3376 	UNCORE_EVENT_CONSTRAINT(0x2e, 0x3),
3377 	UNCORE_EVENT_CONSTRAINT(0x2f, 0x3),
3378 	UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
3379 	UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
3380 	UNCORE_EVENT_CONSTRAINT(0x36, 0x3),
3381 	UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
3382 	UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
3383 	UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
3384 	EVENT_CONSTRAINT_END
3385 };
3386 
3387 static struct intel_uncore_type bdx_uncore_r3qpi = {
3388 	.name		= "r3qpi",
3389 	.num_counters   = 3,
3390 	.num_boxes	= 3,
3391 	.perf_ctr_bits	= 48,
3392 	.constraints	= bdx_uncore_r3qpi_constraints,
3393 	SNBEP_UNCORE_PCI_COMMON_INIT(),
3394 };
3395 
3396 enum {
3397 	BDX_PCI_UNCORE_HA,
3398 	BDX_PCI_UNCORE_IMC,
3399 	BDX_PCI_UNCORE_IRP,
3400 	BDX_PCI_UNCORE_QPI,
3401 	BDX_PCI_UNCORE_R2PCIE,
3402 	BDX_PCI_UNCORE_R3QPI,
3403 };
3404 
3405 static struct intel_uncore_type *bdx_pci_uncores[] = {
3406 	[BDX_PCI_UNCORE_HA]	= &bdx_uncore_ha,
3407 	[BDX_PCI_UNCORE_IMC]	= &bdx_uncore_imc,
3408 	[BDX_PCI_UNCORE_IRP]	= &bdx_uncore_irp,
3409 	[BDX_PCI_UNCORE_QPI]	= &bdx_uncore_qpi,
3410 	[BDX_PCI_UNCORE_R2PCIE]	= &bdx_uncore_r2pcie,
3411 	[BDX_PCI_UNCORE_R3QPI]	= &bdx_uncore_r3qpi,
3412 	NULL,
3413 };
3414 
3415 static const struct pci_device_id bdx_uncore_pci_ids[] = {
3416 	{ /* Home Agent 0 */
3417 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f30),
3418 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_HA, 0),
3419 	},
3420 	{ /* Home Agent 1 */
3421 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f38),
3422 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_HA, 1),
3423 	},
3424 	{ /* MC0 Channel 0 */
3425 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb0),
3426 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 0),
3427 	},
3428 	{ /* MC0 Channel 1 */
3429 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb1),
3430 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 1),
3431 	},
3432 	{ /* MC0 Channel 2 */
3433 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb4),
3434 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 2),
3435 	},
3436 	{ /* MC0 Channel 3 */
3437 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb5),
3438 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 3),
3439 	},
3440 	{ /* MC1 Channel 0 */
3441 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd0),
3442 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 4),
3443 	},
3444 	{ /* MC1 Channel 1 */
3445 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd1),
3446 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 5),
3447 	},
3448 	{ /* MC1 Channel 2 */
3449 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd4),
3450 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 6),
3451 	},
3452 	{ /* MC1 Channel 3 */
3453 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd5),
3454 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 7),
3455 	},
3456 	{ /* IRP */
3457 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f39),
3458 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IRP, 0),
3459 	},
3460 	{ /* QPI0 Port 0 */
3461 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f32),
3462 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_QPI, 0),
3463 	},
3464 	{ /* QPI0 Port 1 */
3465 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f33),
3466 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_QPI, 1),
3467 	},
3468 	{ /* QPI1 Port 2 */
3469 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f3a),
3470 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_QPI, 2),
3471 	},
3472 	{ /* R2PCIe */
3473 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f34),
3474 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R2PCIE, 0),
3475 	},
3476 	{ /* R3QPI0 Link 0 */
3477 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f36),
3478 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R3QPI, 0),
3479 	},
3480 	{ /* R3QPI0 Link 1 */
3481 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f37),
3482 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R3QPI, 1),
3483 	},
3484 	{ /* R3QPI1 Link 2 */
3485 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f3e),
3486 		.driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R3QPI, 2),
3487 	},
3488 	{ /* QPI Port 0 filter  */
3489 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f86),
3490 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3491 						   SNBEP_PCI_QPI_PORT0_FILTER),
3492 	},
3493 	{ /* QPI Port 1 filter  */
3494 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f96),
3495 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3496 						   SNBEP_PCI_QPI_PORT1_FILTER),
3497 	},
3498 	{ /* QPI Port 2 filter  */
3499 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f46),
3500 		.driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3501 						   BDX_PCI_QPI_PORT2_FILTER),
3502 	},
3503 	{ /* end: all zeroes */ }
3504 };
3505 
3506 static struct pci_driver bdx_uncore_pci_driver = {
3507 	.name		= "bdx_uncore",
3508 	.id_table	= bdx_uncore_pci_ids,
3509 };
3510 
bdx_uncore_pci_init(void)3511 int bdx_uncore_pci_init(void)
3512 {
3513 	int ret = snbep_pci2phy_map_init(0x6f1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
3514 
3515 	if (ret)
3516 		return ret;
3517 	uncore_pci_uncores = bdx_pci_uncores;
3518 	uncore_pci_driver = &bdx_uncore_pci_driver;
3519 	return 0;
3520 }
3521 
3522 /* end of BDX uncore support */
3523 
3524 /* SKX uncore support */
3525 
3526 static struct intel_uncore_type skx_uncore_ubox = {
3527 	.name			= "ubox",
3528 	.num_counters		= 2,
3529 	.num_boxes		= 1,
3530 	.perf_ctr_bits		= 48,
3531 	.fixed_ctr_bits		= 48,
3532 	.perf_ctr		= HSWEP_U_MSR_PMON_CTR0,
3533 	.event_ctl		= HSWEP_U_MSR_PMON_CTL0,
3534 	.event_mask		= SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
3535 	.fixed_ctr		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
3536 	.fixed_ctl		= HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
3537 	.ops			= &ivbep_uncore_msr_ops,
3538 	.format_group		= &ivbep_uncore_ubox_format_group,
3539 };
3540 
3541 static struct attribute *skx_uncore_cha_formats_attr[] = {
3542 	&format_attr_event.attr,
3543 	&format_attr_umask.attr,
3544 	&format_attr_edge.attr,
3545 	&format_attr_tid_en.attr,
3546 	&format_attr_inv.attr,
3547 	&format_attr_thresh8.attr,
3548 	&format_attr_filter_tid4.attr,
3549 	&format_attr_filter_state5.attr,
3550 	&format_attr_filter_rem.attr,
3551 	&format_attr_filter_loc.attr,
3552 	&format_attr_filter_nm.attr,
3553 	&format_attr_filter_all_op.attr,
3554 	&format_attr_filter_not_nm.attr,
3555 	&format_attr_filter_opc_0.attr,
3556 	&format_attr_filter_opc_1.attr,
3557 	&format_attr_filter_nc.attr,
3558 	&format_attr_filter_isoc.attr,
3559 	NULL,
3560 };
3561 
3562 static const struct attribute_group skx_uncore_chabox_format_group = {
3563 	.name = "format",
3564 	.attrs = skx_uncore_cha_formats_attr,
3565 };
3566 
3567 static struct event_constraint skx_uncore_chabox_constraints[] = {
3568 	UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
3569 	UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
3570 	EVENT_CONSTRAINT_END
3571 };
3572 
3573 static struct extra_reg skx_uncore_cha_extra_regs[] = {
3574 	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
3575 	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
3576 	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
3577 	SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
3578 	SNBEP_CBO_EVENT_EXTRA_REG(0x3134, 0xffff, 0x4),
3579 	SNBEP_CBO_EVENT_EXTRA_REG(0x9134, 0xffff, 0x4),
3580 	SNBEP_CBO_EVENT_EXTRA_REG(0x35, 0xff, 0x8),
3581 	SNBEP_CBO_EVENT_EXTRA_REG(0x36, 0xff, 0x8),
3582 	SNBEP_CBO_EVENT_EXTRA_REG(0x38, 0xff, 0x3),
3583 	EVENT_EXTRA_END
3584 };
3585 
skx_cha_filter_mask(int fields)3586 static u64 skx_cha_filter_mask(int fields)
3587 {
3588 	u64 mask = 0;
3589 
3590 	if (fields & 0x1)
3591 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_TID;
3592 	if (fields & 0x2)
3593 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_LINK;
3594 	if (fields & 0x4)
3595 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_STATE;
3596 	if (fields & 0x8) {
3597 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_REM;
3598 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_LOC;
3599 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_ALL_OPC;
3600 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_NM;
3601 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_NOT_NM;
3602 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_OPC0;
3603 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_OPC1;
3604 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_NC;
3605 		mask |= SKX_CHA_MSR_PMON_BOX_FILTER_ISOC;
3606 	}
3607 	return mask;
3608 }
3609 
3610 static struct event_constraint *
skx_cha_get_constraint(struct intel_uncore_box * box,struct perf_event * event)3611 skx_cha_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
3612 {
3613 	return __snbep_cbox_get_constraint(box, event, skx_cha_filter_mask);
3614 }
3615 
skx_cha_hw_config(struct intel_uncore_box * box,struct perf_event * event)3616 static int skx_cha_hw_config(struct intel_uncore_box *box, struct perf_event *event)
3617 {
3618 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
3619 	struct extra_reg *er;
3620 	int idx = 0;
3621 	/* Any of the CHA events may be filtered by Thread/Core-ID.*/
3622 	if (event->hw.config & SNBEP_CBO_PMON_CTL_TID_EN)
3623 		idx = SKX_CHA_MSR_PMON_BOX_FILTER_TID;
3624 
3625 	for (er = skx_uncore_cha_extra_regs; er->msr; er++) {
3626 		if (er->event != (event->hw.config & er->config_mask))
3627 			continue;
3628 		idx |= er->idx;
3629 	}
3630 
3631 	if (idx) {
3632 		reg1->reg = HSWEP_C0_MSR_PMON_BOX_FILTER0 +
3633 			    HSWEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
3634 		reg1->config = event->attr.config1 & skx_cha_filter_mask(idx);
3635 		reg1->idx = idx;
3636 	}
3637 	return 0;
3638 }
3639 
3640 static struct intel_uncore_ops skx_uncore_chabox_ops = {
3641 	/* There is no frz_en for chabox ctl */
3642 	.init_box		= ivbep_uncore_msr_init_box,
3643 	.disable_box		= snbep_uncore_msr_disable_box,
3644 	.enable_box		= snbep_uncore_msr_enable_box,
3645 	.disable_event		= snbep_uncore_msr_disable_event,
3646 	.enable_event		= hswep_cbox_enable_event,
3647 	.read_counter		= uncore_msr_read_counter,
3648 	.hw_config		= skx_cha_hw_config,
3649 	.get_constraint		= skx_cha_get_constraint,
3650 	.put_constraint		= snbep_cbox_put_constraint,
3651 };
3652 
3653 static struct intel_uncore_type skx_uncore_chabox = {
3654 	.name			= "cha",
3655 	.num_counters		= 4,
3656 	.perf_ctr_bits		= 48,
3657 	.event_ctl		= HSWEP_C0_MSR_PMON_CTL0,
3658 	.perf_ctr		= HSWEP_C0_MSR_PMON_CTR0,
3659 	.event_mask		= HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
3660 	.box_ctl		= HSWEP_C0_MSR_PMON_BOX_CTL,
3661 	.msr_offset		= HSWEP_CBO_MSR_OFFSET,
3662 	.num_shared_regs	= 1,
3663 	.constraints		= skx_uncore_chabox_constraints,
3664 	.ops			= &skx_uncore_chabox_ops,
3665 	.format_group		= &skx_uncore_chabox_format_group,
3666 };
3667 
3668 static struct attribute *skx_uncore_iio_formats_attr[] = {
3669 	&format_attr_event.attr,
3670 	&format_attr_umask.attr,
3671 	&format_attr_edge.attr,
3672 	&format_attr_inv.attr,
3673 	&format_attr_thresh9.attr,
3674 	&format_attr_ch_mask.attr,
3675 	&format_attr_fc_mask.attr,
3676 	NULL,
3677 };
3678 
3679 static const struct attribute_group skx_uncore_iio_format_group = {
3680 	.name = "format",
3681 	.attrs = skx_uncore_iio_formats_attr,
3682 };
3683 
3684 static struct event_constraint skx_uncore_iio_constraints[] = {
3685 	UNCORE_EVENT_CONSTRAINT(0x83, 0x3),
3686 	UNCORE_EVENT_CONSTRAINT(0x88, 0xc),
3687 	UNCORE_EVENT_CONSTRAINT(0x95, 0xc),
3688 	UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
3689 	UNCORE_EVENT_CONSTRAINT(0xc5, 0xc),
3690 	UNCORE_EVENT_CONSTRAINT(0xd4, 0xc),
3691 	UNCORE_EVENT_CONSTRAINT(0xd5, 0xc),
3692 	EVENT_CONSTRAINT_END
3693 };
3694 
skx_iio_enable_event(struct intel_uncore_box * box,struct perf_event * event)3695 static void skx_iio_enable_event(struct intel_uncore_box *box,
3696 				 struct perf_event *event)
3697 {
3698 	struct hw_perf_event *hwc = &event->hw;
3699 
3700 	wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
3701 }
3702 
3703 static struct intel_uncore_ops skx_uncore_iio_ops = {
3704 	.init_box		= ivbep_uncore_msr_init_box,
3705 	.disable_box		= snbep_uncore_msr_disable_box,
3706 	.enable_box		= snbep_uncore_msr_enable_box,
3707 	.disable_event		= snbep_uncore_msr_disable_event,
3708 	.enable_event		= skx_iio_enable_event,
3709 	.read_counter		= uncore_msr_read_counter,
3710 };
3711 
pmu_topology(struct intel_uncore_pmu * pmu,int die)3712 static struct intel_uncore_topology *pmu_topology(struct intel_uncore_pmu *pmu, int die)
3713 {
3714 	int idx;
3715 
3716 	for (idx = 0; idx < pmu->type->num_boxes; idx++) {
3717 		if (pmu->type->topology[die][idx].pmu_idx == pmu->pmu_idx)
3718 			return &pmu->type->topology[die][idx];
3719 	}
3720 
3721 	return NULL;
3722 }
3723 
3724 static umode_t
pmu_iio_mapping_visible(struct kobject * kobj,struct attribute * attr,int die,int zero_bus_pmu)3725 pmu_iio_mapping_visible(struct kobject *kobj, struct attribute *attr,
3726 			 int die, int zero_bus_pmu)
3727 {
3728 	struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(kobj_to_dev(kobj));
3729 	struct intel_uncore_topology *pmut = pmu_topology(pmu, die);
3730 
3731 	return (pmut && !pmut->iio->pci_bus_no && pmu->pmu_idx != zero_bus_pmu) ? 0 : attr->mode;
3732 }
3733 
3734 static umode_t
skx_iio_mapping_visible(struct kobject * kobj,struct attribute * attr,int die)3735 skx_iio_mapping_visible(struct kobject *kobj, struct attribute *attr, int die)
3736 {
3737 	/* Root bus 0x00 is valid only for pmu_idx = 0. */
3738 	return pmu_iio_mapping_visible(kobj, attr, die, 0);
3739 }
3740 
skx_iio_mapping_show(struct device * dev,struct device_attribute * attr,char * buf)3741 static ssize_t skx_iio_mapping_show(struct device *dev,
3742 				    struct device_attribute *attr, char *buf)
3743 {
3744 	struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(dev);
3745 	struct dev_ext_attribute *ea = to_dev_ext_attribute(attr);
3746 	long die = (long)ea->var;
3747 	struct intel_uncore_topology *pmut = pmu_topology(pmu, die);
3748 
3749 	return sprintf(buf, "%04x:%02x\n", pmut ? pmut->iio->segment : 0,
3750 					   pmut ? pmut->iio->pci_bus_no : 0);
3751 }
3752 
skx_msr_cpu_bus_read(int cpu,u64 * topology)3753 static int skx_msr_cpu_bus_read(int cpu, u64 *topology)
3754 {
3755 	u64 msr_value;
3756 
3757 	if (rdmsrl_on_cpu(cpu, SKX_MSR_CPU_BUS_NUMBER, &msr_value) ||
3758 			!(msr_value & SKX_MSR_CPU_BUS_VALID_BIT))
3759 		return -ENXIO;
3760 
3761 	*topology = msr_value;
3762 
3763 	return 0;
3764 }
3765 
die_to_cpu(int die)3766 static int die_to_cpu(int die)
3767 {
3768 	int res = 0, cpu, current_die;
3769 	/*
3770 	 * Using cpus_read_lock() to ensure cpu is not going down between
3771 	 * looking at cpu_online_mask.
3772 	 */
3773 	cpus_read_lock();
3774 	for_each_online_cpu(cpu) {
3775 		current_die = topology_logical_die_id(cpu);
3776 		if (current_die == die) {
3777 			res = cpu;
3778 			break;
3779 		}
3780 	}
3781 	cpus_read_unlock();
3782 	return res;
3783 }
3784 
3785 enum {
3786 	IIO_TOPOLOGY_TYPE,
3787 	UPI_TOPOLOGY_TYPE,
3788 	TOPOLOGY_MAX
3789 };
3790 
3791 static const size_t topology_size[TOPOLOGY_MAX] = {
3792 	sizeof(*((struct intel_uncore_topology *)NULL)->iio),
3793 	sizeof(*((struct intel_uncore_topology *)NULL)->upi)
3794 };
3795 
pmu_alloc_topology(struct intel_uncore_type * type,int topology_type)3796 static int pmu_alloc_topology(struct intel_uncore_type *type, int topology_type)
3797 {
3798 	int die, idx;
3799 	struct intel_uncore_topology **topology;
3800 
3801 	if (!type->num_boxes)
3802 		return -EPERM;
3803 
3804 	topology = kcalloc(uncore_max_dies(), sizeof(*topology), GFP_KERNEL);
3805 	if (!topology)
3806 		goto err;
3807 
3808 	for (die = 0; die < uncore_max_dies(); die++) {
3809 		topology[die] = kcalloc(type->num_boxes, sizeof(**topology), GFP_KERNEL);
3810 		if (!topology[die])
3811 			goto clear;
3812 		for (idx = 0; idx < type->num_boxes; idx++) {
3813 			topology[die][idx].untyped = kcalloc(type->num_boxes,
3814 							     topology_size[topology_type],
3815 							     GFP_KERNEL);
3816 			if (!topology[die][idx].untyped)
3817 				goto clear;
3818 		}
3819 	}
3820 
3821 	type->topology = topology;
3822 
3823 	return 0;
3824 clear:
3825 	for (; die >= 0; die--) {
3826 		for (idx = 0; idx < type->num_boxes; idx++)
3827 			kfree(topology[die][idx].untyped);
3828 		kfree(topology[die]);
3829 	}
3830 	kfree(topology);
3831 err:
3832 	return -ENOMEM;
3833 }
3834 
pmu_free_topology(struct intel_uncore_type * type)3835 static void pmu_free_topology(struct intel_uncore_type *type)
3836 {
3837 	int die, idx;
3838 
3839 	if (type->topology) {
3840 		for (die = 0; die < uncore_max_dies(); die++) {
3841 			for (idx = 0; idx < type->num_boxes; idx++)
3842 				kfree(type->topology[die][idx].untyped);
3843 			kfree(type->topology[die]);
3844 		}
3845 		kfree(type->topology);
3846 		type->topology = NULL;
3847 	}
3848 }
3849 
skx_pmu_get_topology(struct intel_uncore_type * type,int (* topology_cb)(struct intel_uncore_type *,int,int,u64))3850 static int skx_pmu_get_topology(struct intel_uncore_type *type,
3851 				 int (*topology_cb)(struct intel_uncore_type*, int, int, u64))
3852 {
3853 	int die, ret = -EPERM;
3854 	u64 cpu_bus_msr;
3855 
3856 	for (die = 0; die < uncore_max_dies(); die++) {
3857 		ret = skx_msr_cpu_bus_read(die_to_cpu(die), &cpu_bus_msr);
3858 		if (ret)
3859 			break;
3860 
3861 		ret = uncore_die_to_segment(die);
3862 		if (ret < 0)
3863 			break;
3864 
3865 		ret = topology_cb(type, ret, die, cpu_bus_msr);
3866 		if (ret)
3867 			break;
3868 	}
3869 
3870 	return ret;
3871 }
3872 
skx_iio_topology_cb(struct intel_uncore_type * type,int segment,int die,u64 cpu_bus_msr)3873 static int skx_iio_topology_cb(struct intel_uncore_type *type, int segment,
3874 				int die, u64 cpu_bus_msr)
3875 {
3876 	int idx;
3877 	struct intel_uncore_topology *t;
3878 
3879 	for (idx = 0; idx < type->num_boxes; idx++) {
3880 		t = &type->topology[die][idx];
3881 		t->pmu_idx = idx;
3882 		t->iio->segment = segment;
3883 		t->iio->pci_bus_no = (cpu_bus_msr >> (idx * BUS_NUM_STRIDE)) & 0xff;
3884 	}
3885 
3886 	return 0;
3887 }
3888 
skx_iio_get_topology(struct intel_uncore_type * type)3889 static int skx_iio_get_topology(struct intel_uncore_type *type)
3890 {
3891 	return skx_pmu_get_topology(type, skx_iio_topology_cb);
3892 }
3893 
3894 static struct attribute_group skx_iio_mapping_group = {
3895 	.is_visible	= skx_iio_mapping_visible,
3896 };
3897 
3898 static const struct attribute_group *skx_iio_attr_update[] = {
3899 	&skx_iio_mapping_group,
3900 	NULL,
3901 };
3902 
pmu_clear_mapping_attr(const struct attribute_group ** groups,struct attribute_group * ag)3903 static void pmu_clear_mapping_attr(const struct attribute_group **groups,
3904 				   struct attribute_group *ag)
3905 {
3906 	int i;
3907 
3908 	for (i = 0; groups[i]; i++) {
3909 		if (groups[i] == ag) {
3910 			for (i++; groups[i]; i++)
3911 				groups[i - 1] = groups[i];
3912 			groups[i - 1] = NULL;
3913 			break;
3914 		}
3915 	}
3916 }
3917 
3918 static void
pmu_set_mapping(struct intel_uncore_type * type,struct attribute_group * ag,ssize_t (* show)(struct device *,struct device_attribute *,char *),int topology_type)3919 pmu_set_mapping(struct intel_uncore_type *type, struct attribute_group *ag,
3920 		ssize_t (*show)(struct device*, struct device_attribute*, char*),
3921 		int topology_type)
3922 {
3923 	char buf[64];
3924 	int ret;
3925 	long die = -1;
3926 	struct attribute **attrs = NULL;
3927 	struct dev_ext_attribute *eas = NULL;
3928 
3929 	ret = pmu_alloc_topology(type, topology_type);
3930 	if (ret < 0)
3931 		goto clear_attr_update;
3932 
3933 	ret = type->get_topology(type);
3934 	if (ret < 0)
3935 		goto clear_topology;
3936 
3937 	/* One more for NULL. */
3938 	attrs = kcalloc((uncore_max_dies() + 1), sizeof(*attrs), GFP_KERNEL);
3939 	if (!attrs)
3940 		goto clear_topology;
3941 
3942 	eas = kcalloc(uncore_max_dies(), sizeof(*eas), GFP_KERNEL);
3943 	if (!eas)
3944 		goto clear_attrs;
3945 
3946 	for (die = 0; die < uncore_max_dies(); die++) {
3947 		snprintf(buf, sizeof(buf), "die%ld", die);
3948 		sysfs_attr_init(&eas[die].attr.attr);
3949 		eas[die].attr.attr.name = kstrdup(buf, GFP_KERNEL);
3950 		if (!eas[die].attr.attr.name)
3951 			goto err;
3952 		eas[die].attr.attr.mode = 0444;
3953 		eas[die].attr.show = show;
3954 		eas[die].attr.store = NULL;
3955 		eas[die].var = (void *)die;
3956 		attrs[die] = &eas[die].attr.attr;
3957 	}
3958 	ag->attrs = attrs;
3959 
3960 	return;
3961 err:
3962 	for (; die >= 0; die--)
3963 		kfree(eas[die].attr.attr.name);
3964 	kfree(eas);
3965 clear_attrs:
3966 	kfree(attrs);
3967 clear_topology:
3968 	pmu_free_topology(type);
3969 clear_attr_update:
3970 	pmu_clear_mapping_attr(type->attr_update, ag);
3971 }
3972 
3973 static void
pmu_cleanup_mapping(struct intel_uncore_type * type,struct attribute_group * ag)3974 pmu_cleanup_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
3975 {
3976 	struct attribute **attr = ag->attrs;
3977 
3978 	if (!attr)
3979 		return;
3980 
3981 	for (; *attr; attr++)
3982 		kfree((*attr)->name);
3983 	kfree(attr_to_ext_attr(*ag->attrs));
3984 	kfree(ag->attrs);
3985 	ag->attrs = NULL;
3986 	pmu_free_topology(type);
3987 }
3988 
3989 static void
pmu_iio_set_mapping(struct intel_uncore_type * type,struct attribute_group * ag)3990 pmu_iio_set_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
3991 {
3992 	pmu_set_mapping(type, ag, skx_iio_mapping_show, IIO_TOPOLOGY_TYPE);
3993 }
3994 
skx_iio_set_mapping(struct intel_uncore_type * type)3995 static void skx_iio_set_mapping(struct intel_uncore_type *type)
3996 {
3997 	pmu_iio_set_mapping(type, &skx_iio_mapping_group);
3998 }
3999 
skx_iio_cleanup_mapping(struct intel_uncore_type * type)4000 static void skx_iio_cleanup_mapping(struct intel_uncore_type *type)
4001 {
4002 	pmu_cleanup_mapping(type, &skx_iio_mapping_group);
4003 }
4004 
4005 static struct intel_uncore_type skx_uncore_iio = {
4006 	.name			= "iio",
4007 	.num_counters		= 4,
4008 	.num_boxes		= 6,
4009 	.perf_ctr_bits		= 48,
4010 	.event_ctl		= SKX_IIO0_MSR_PMON_CTL0,
4011 	.perf_ctr		= SKX_IIO0_MSR_PMON_CTR0,
4012 	.event_mask		= SKX_IIO_PMON_RAW_EVENT_MASK,
4013 	.event_mask_ext		= SKX_IIO_PMON_RAW_EVENT_MASK_EXT,
4014 	.box_ctl		= SKX_IIO0_MSR_PMON_BOX_CTL,
4015 	.msr_offset		= SKX_IIO_MSR_OFFSET,
4016 	.constraints		= skx_uncore_iio_constraints,
4017 	.ops			= &skx_uncore_iio_ops,
4018 	.format_group		= &skx_uncore_iio_format_group,
4019 	.attr_update		= skx_iio_attr_update,
4020 	.get_topology		= skx_iio_get_topology,
4021 	.set_mapping		= skx_iio_set_mapping,
4022 	.cleanup_mapping	= skx_iio_cleanup_mapping,
4023 };
4024 
4025 enum perf_uncore_iio_freerunning_type_id {
4026 	SKX_IIO_MSR_IOCLK			= 0,
4027 	SKX_IIO_MSR_BW				= 1,
4028 	SKX_IIO_MSR_UTIL			= 2,
4029 
4030 	SKX_IIO_FREERUNNING_TYPE_MAX,
4031 };
4032 
4033 
4034 static struct freerunning_counters skx_iio_freerunning[] = {
4035 	[SKX_IIO_MSR_IOCLK]	= { 0xa45, 0x1, 0x20, 1, 36 },
4036 	[SKX_IIO_MSR_BW]	= { 0xb00, 0x1, 0x10, 8, 36 },
4037 	[SKX_IIO_MSR_UTIL]	= { 0xb08, 0x1, 0x10, 8, 36 },
4038 };
4039 
4040 static struct uncore_event_desc skx_uncore_iio_freerunning_events[] = {
4041 	/* Free-Running IO CLOCKS Counter */
4042 	INTEL_UNCORE_EVENT_DESC(ioclk,			"event=0xff,umask=0x10"),
4043 	/* Free-Running IIO BANDWIDTH Counters */
4044 	INTEL_UNCORE_EVENT_DESC(bw_in_port0,		"event=0xff,umask=0x20"),
4045 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale,	"3.814697266e-6"),
4046 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit,	"MiB"),
4047 	INTEL_UNCORE_EVENT_DESC(bw_in_port1,		"event=0xff,umask=0x21"),
4048 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale,	"3.814697266e-6"),
4049 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit,	"MiB"),
4050 	INTEL_UNCORE_EVENT_DESC(bw_in_port2,		"event=0xff,umask=0x22"),
4051 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale,	"3.814697266e-6"),
4052 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit,	"MiB"),
4053 	INTEL_UNCORE_EVENT_DESC(bw_in_port3,		"event=0xff,umask=0x23"),
4054 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale,	"3.814697266e-6"),
4055 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit,	"MiB"),
4056 	INTEL_UNCORE_EVENT_DESC(bw_out_port0,		"event=0xff,umask=0x24"),
4057 	INTEL_UNCORE_EVENT_DESC(bw_out_port0.scale,	"3.814697266e-6"),
4058 	INTEL_UNCORE_EVENT_DESC(bw_out_port0.unit,	"MiB"),
4059 	INTEL_UNCORE_EVENT_DESC(bw_out_port1,		"event=0xff,umask=0x25"),
4060 	INTEL_UNCORE_EVENT_DESC(bw_out_port1.scale,	"3.814697266e-6"),
4061 	INTEL_UNCORE_EVENT_DESC(bw_out_port1.unit,	"MiB"),
4062 	INTEL_UNCORE_EVENT_DESC(bw_out_port2,		"event=0xff,umask=0x26"),
4063 	INTEL_UNCORE_EVENT_DESC(bw_out_port2.scale,	"3.814697266e-6"),
4064 	INTEL_UNCORE_EVENT_DESC(bw_out_port2.unit,	"MiB"),
4065 	INTEL_UNCORE_EVENT_DESC(bw_out_port3,		"event=0xff,umask=0x27"),
4066 	INTEL_UNCORE_EVENT_DESC(bw_out_port3.scale,	"3.814697266e-6"),
4067 	INTEL_UNCORE_EVENT_DESC(bw_out_port3.unit,	"MiB"),
4068 	/* Free-running IIO UTILIZATION Counters */
4069 	INTEL_UNCORE_EVENT_DESC(util_in_port0,		"event=0xff,umask=0x30"),
4070 	INTEL_UNCORE_EVENT_DESC(util_out_port0,		"event=0xff,umask=0x31"),
4071 	INTEL_UNCORE_EVENT_DESC(util_in_port1,		"event=0xff,umask=0x32"),
4072 	INTEL_UNCORE_EVENT_DESC(util_out_port1,		"event=0xff,umask=0x33"),
4073 	INTEL_UNCORE_EVENT_DESC(util_in_port2,		"event=0xff,umask=0x34"),
4074 	INTEL_UNCORE_EVENT_DESC(util_out_port2,		"event=0xff,umask=0x35"),
4075 	INTEL_UNCORE_EVENT_DESC(util_in_port3,		"event=0xff,umask=0x36"),
4076 	INTEL_UNCORE_EVENT_DESC(util_out_port3,		"event=0xff,umask=0x37"),
4077 	{ /* end: all zeroes */ },
4078 };
4079 
4080 static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = {
4081 	.read_counter		= uncore_msr_read_counter,
4082 	.hw_config		= uncore_freerunning_hw_config,
4083 };
4084 
4085 static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = {
4086 	&format_attr_event.attr,
4087 	&format_attr_umask.attr,
4088 	NULL,
4089 };
4090 
4091 static const struct attribute_group skx_uncore_iio_freerunning_format_group = {
4092 	.name = "format",
4093 	.attrs = skx_uncore_iio_freerunning_formats_attr,
4094 };
4095 
4096 static struct intel_uncore_type skx_uncore_iio_free_running = {
4097 	.name			= "iio_free_running",
4098 	.num_counters		= 17,
4099 	.num_boxes		= 6,
4100 	.num_freerunning_types	= SKX_IIO_FREERUNNING_TYPE_MAX,
4101 	.freerunning		= skx_iio_freerunning,
4102 	.ops			= &skx_uncore_iio_freerunning_ops,
4103 	.event_descs		= skx_uncore_iio_freerunning_events,
4104 	.format_group		= &skx_uncore_iio_freerunning_format_group,
4105 };
4106 
4107 static struct attribute *skx_uncore_formats_attr[] = {
4108 	&format_attr_event.attr,
4109 	&format_attr_umask.attr,
4110 	&format_attr_edge.attr,
4111 	&format_attr_inv.attr,
4112 	&format_attr_thresh8.attr,
4113 	NULL,
4114 };
4115 
4116 static const struct attribute_group skx_uncore_format_group = {
4117 	.name = "format",
4118 	.attrs = skx_uncore_formats_attr,
4119 };
4120 
4121 static struct intel_uncore_type skx_uncore_irp = {
4122 	.name			= "irp",
4123 	.num_counters		= 2,
4124 	.num_boxes		= 6,
4125 	.perf_ctr_bits		= 48,
4126 	.event_ctl		= SKX_IRP0_MSR_PMON_CTL0,
4127 	.perf_ctr		= SKX_IRP0_MSR_PMON_CTR0,
4128 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
4129 	.box_ctl		= SKX_IRP0_MSR_PMON_BOX_CTL,
4130 	.msr_offset		= SKX_IRP_MSR_OFFSET,
4131 	.ops			= &skx_uncore_iio_ops,
4132 	.format_group		= &skx_uncore_format_group,
4133 };
4134 
4135 static struct attribute *skx_uncore_pcu_formats_attr[] = {
4136 	&format_attr_event.attr,
4137 	&format_attr_umask.attr,
4138 	&format_attr_edge.attr,
4139 	&format_attr_inv.attr,
4140 	&format_attr_thresh8.attr,
4141 	&format_attr_occ_invert.attr,
4142 	&format_attr_occ_edge_det.attr,
4143 	&format_attr_filter_band0.attr,
4144 	&format_attr_filter_band1.attr,
4145 	&format_attr_filter_band2.attr,
4146 	&format_attr_filter_band3.attr,
4147 	NULL,
4148 };
4149 
4150 static struct attribute_group skx_uncore_pcu_format_group = {
4151 	.name = "format",
4152 	.attrs = skx_uncore_pcu_formats_attr,
4153 };
4154 
4155 static struct intel_uncore_ops skx_uncore_pcu_ops = {
4156 	IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
4157 	.hw_config		= hswep_pcu_hw_config,
4158 	.get_constraint		= snbep_pcu_get_constraint,
4159 	.put_constraint		= snbep_pcu_put_constraint,
4160 };
4161 
4162 static struct intel_uncore_type skx_uncore_pcu = {
4163 	.name			= "pcu",
4164 	.num_counters		= 4,
4165 	.num_boxes		= 1,
4166 	.perf_ctr_bits		= 48,
4167 	.perf_ctr		= HSWEP_PCU_MSR_PMON_CTR0,
4168 	.event_ctl		= HSWEP_PCU_MSR_PMON_CTL0,
4169 	.event_mask		= SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
4170 	.box_ctl		= HSWEP_PCU_MSR_PMON_BOX_CTL,
4171 	.num_shared_regs	= 1,
4172 	.ops			= &skx_uncore_pcu_ops,
4173 	.format_group		= &skx_uncore_pcu_format_group,
4174 };
4175 
4176 static struct intel_uncore_type *skx_msr_uncores[] = {
4177 	&skx_uncore_ubox,
4178 	&skx_uncore_chabox,
4179 	&skx_uncore_iio,
4180 	&skx_uncore_iio_free_running,
4181 	&skx_uncore_irp,
4182 	&skx_uncore_pcu,
4183 	NULL,
4184 };
4185 
4186 /*
4187  * To determine the number of CHAs, it should read bits 27:0 in the CAPID6
4188  * register which located at Device 30, Function 3, Offset 0x9C. PCI ID 0x2083.
4189  */
4190 #define SKX_CAPID6		0x9c
4191 #define SKX_CHA_BIT_MASK	GENMASK(27, 0)
4192 
skx_count_chabox(void)4193 static int skx_count_chabox(void)
4194 {
4195 	struct pci_dev *dev = NULL;
4196 	u32 val = 0;
4197 
4198 	dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x2083, dev);
4199 	if (!dev)
4200 		goto out;
4201 
4202 	pci_read_config_dword(dev, SKX_CAPID6, &val);
4203 	val &= SKX_CHA_BIT_MASK;
4204 out:
4205 	pci_dev_put(dev);
4206 	return hweight32(val);
4207 }
4208 
skx_uncore_cpu_init(void)4209 void skx_uncore_cpu_init(void)
4210 {
4211 	skx_uncore_chabox.num_boxes = skx_count_chabox();
4212 	uncore_msr_uncores = skx_msr_uncores;
4213 }
4214 
4215 static struct intel_uncore_type skx_uncore_imc = {
4216 	.name		= "imc",
4217 	.num_counters   = 4,
4218 	.num_boxes	= 6,
4219 	.perf_ctr_bits	= 48,
4220 	.fixed_ctr_bits	= 48,
4221 	.fixed_ctr	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
4222 	.fixed_ctl	= SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
4223 	.event_descs	= hswep_uncore_imc_events,
4224 	.perf_ctr	= SNBEP_PCI_PMON_CTR0,
4225 	.event_ctl	= SNBEP_PCI_PMON_CTL0,
4226 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4227 	.box_ctl	= SNBEP_PCI_PMON_BOX_CTL,
4228 	.ops		= &ivbep_uncore_pci_ops,
4229 	.format_group	= &skx_uncore_format_group,
4230 };
4231 
4232 static struct attribute *skx_upi_uncore_formats_attr[] = {
4233 	&format_attr_event.attr,
4234 	&format_attr_umask_ext.attr,
4235 	&format_attr_edge.attr,
4236 	&format_attr_inv.attr,
4237 	&format_attr_thresh8.attr,
4238 	NULL,
4239 };
4240 
4241 static const struct attribute_group skx_upi_uncore_format_group = {
4242 	.name = "format",
4243 	.attrs = skx_upi_uncore_formats_attr,
4244 };
4245 
skx_upi_uncore_pci_init_box(struct intel_uncore_box * box)4246 static void skx_upi_uncore_pci_init_box(struct intel_uncore_box *box)
4247 {
4248 	struct pci_dev *pdev = box->pci_dev;
4249 
4250 	__set_bit(UNCORE_BOX_FLAG_CTL_OFFS8, &box->flags);
4251 	pci_write_config_dword(pdev, SKX_UPI_PCI_PMON_BOX_CTL, IVBEP_PMON_BOX_CTL_INT);
4252 }
4253 
4254 static struct intel_uncore_ops skx_upi_uncore_pci_ops = {
4255 	.init_box	= skx_upi_uncore_pci_init_box,
4256 	.disable_box	= snbep_uncore_pci_disable_box,
4257 	.enable_box	= snbep_uncore_pci_enable_box,
4258 	.disable_event	= snbep_uncore_pci_disable_event,
4259 	.enable_event	= snbep_uncore_pci_enable_event,
4260 	.read_counter	= snbep_uncore_pci_read_counter,
4261 };
4262 
4263 static umode_t
skx_upi_mapping_visible(struct kobject * kobj,struct attribute * attr,int die)4264 skx_upi_mapping_visible(struct kobject *kobj, struct attribute *attr, int die)
4265 {
4266 	struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(kobj_to_dev(kobj));
4267 
4268 	return pmu->type->topology[die][pmu->pmu_idx].upi->enabled ? attr->mode : 0;
4269 }
4270 
skx_upi_mapping_show(struct device * dev,struct device_attribute * attr,char * buf)4271 static ssize_t skx_upi_mapping_show(struct device *dev,
4272 				    struct device_attribute *attr, char *buf)
4273 {
4274 	struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(dev);
4275 	struct dev_ext_attribute *ea = to_dev_ext_attribute(attr);
4276 	long die = (long)ea->var;
4277 	struct uncore_upi_topology *upi = pmu->type->topology[die][pmu->pmu_idx].upi;
4278 
4279 	return sysfs_emit(buf, "upi_%d,die_%d\n", upi->pmu_idx_to, upi->die_to);
4280 }
4281 
4282 #define SKX_UPI_REG_DID			0x2058
4283 #define SKX_UPI_REGS_ADDR_DEVICE_LINK0	0x0e
4284 #define SKX_UPI_REGS_ADDR_FUNCTION	0x00
4285 
4286 /*
4287  * UPI Link Parameter 0
4288  * |  Bit  |  Default  |  Description
4289  * | 19:16 |     0h    | base_nodeid - The NodeID of the sending socket.
4290  * | 12:8  |    00h    | sending_port - The processor die port number of the sending port.
4291  */
4292 #define SKX_KTILP0_OFFSET	0x94
4293 
4294 /*
4295  * UPI Pcode Status. This register is used by PCode to store the link training status.
4296  * |  Bit  |  Default  |  Description
4297  * |   4   |     0h    | ll_status_valid — Bit indicates the valid training status
4298  *                       logged from PCode to the BIOS.
4299  */
4300 #define SKX_KTIPCSTS_OFFSET	0x120
4301 
upi_fill_topology(struct pci_dev * dev,struct intel_uncore_topology * tp,int pmu_idx)4302 static int upi_fill_topology(struct pci_dev *dev, struct intel_uncore_topology *tp,
4303 			     int pmu_idx)
4304 {
4305 	int ret;
4306 	u32 upi_conf;
4307 	struct uncore_upi_topology *upi = tp->upi;
4308 
4309 	tp->pmu_idx = pmu_idx;
4310 	ret = pci_read_config_dword(dev, SKX_KTIPCSTS_OFFSET, &upi_conf);
4311 	if (ret) {
4312 		ret = pcibios_err_to_errno(ret);
4313 		goto err;
4314 	}
4315 	upi->enabled = (upi_conf >> 4) & 1;
4316 	if (upi->enabled) {
4317 		ret = pci_read_config_dword(dev, SKX_KTILP0_OFFSET,
4318 					    &upi_conf);
4319 		if (ret) {
4320 			ret = pcibios_err_to_errno(ret);
4321 			goto err;
4322 		}
4323 		upi->die_to = (upi_conf >> 16) & 0xf;
4324 		upi->pmu_idx_to = (upi_conf >> 8) & 0x1f;
4325 	}
4326 err:
4327 	return ret;
4328 }
4329 
skx_upi_topology_cb(struct intel_uncore_type * type,int segment,int die,u64 cpu_bus_msr)4330 static int skx_upi_topology_cb(struct intel_uncore_type *type, int segment,
4331 				int die, u64 cpu_bus_msr)
4332 {
4333 	int idx, ret;
4334 	struct intel_uncore_topology *upi;
4335 	unsigned int devfn;
4336 	struct pci_dev *dev = NULL;
4337 	u8 bus = cpu_bus_msr >> (3 * BUS_NUM_STRIDE);
4338 
4339 	for (idx = 0; idx < type->num_boxes; idx++) {
4340 		upi = &type->topology[die][idx];
4341 		devfn = PCI_DEVFN(SKX_UPI_REGS_ADDR_DEVICE_LINK0 + idx,
4342 				  SKX_UPI_REGS_ADDR_FUNCTION);
4343 		dev = pci_get_domain_bus_and_slot(segment, bus, devfn);
4344 		if (dev) {
4345 			ret = upi_fill_topology(dev, upi, idx);
4346 			if (ret)
4347 				break;
4348 		}
4349 	}
4350 
4351 	pci_dev_put(dev);
4352 	return ret;
4353 }
4354 
skx_upi_get_topology(struct intel_uncore_type * type)4355 static int skx_upi_get_topology(struct intel_uncore_type *type)
4356 {
4357 	/* CPX case is not supported */
4358 	if (boot_cpu_data.x86_stepping == 11)
4359 		return -EPERM;
4360 
4361 	return skx_pmu_get_topology(type, skx_upi_topology_cb);
4362 }
4363 
4364 static struct attribute_group skx_upi_mapping_group = {
4365 	.is_visible	= skx_upi_mapping_visible,
4366 };
4367 
4368 static const struct attribute_group *skx_upi_attr_update[] = {
4369 	&skx_upi_mapping_group,
4370 	NULL
4371 };
4372 
4373 static void
pmu_upi_set_mapping(struct intel_uncore_type * type,struct attribute_group * ag)4374 pmu_upi_set_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
4375 {
4376 	pmu_set_mapping(type, ag, skx_upi_mapping_show, UPI_TOPOLOGY_TYPE);
4377 }
4378 
skx_upi_set_mapping(struct intel_uncore_type * type)4379 static void skx_upi_set_mapping(struct intel_uncore_type *type)
4380 {
4381 	pmu_upi_set_mapping(type, &skx_upi_mapping_group);
4382 }
4383 
skx_upi_cleanup_mapping(struct intel_uncore_type * type)4384 static void skx_upi_cleanup_mapping(struct intel_uncore_type *type)
4385 {
4386 	pmu_cleanup_mapping(type, &skx_upi_mapping_group);
4387 }
4388 
4389 static struct intel_uncore_type skx_uncore_upi = {
4390 	.name		= "upi",
4391 	.num_counters   = 4,
4392 	.num_boxes	= 3,
4393 	.perf_ctr_bits	= 48,
4394 	.perf_ctr	= SKX_UPI_PCI_PMON_CTR0,
4395 	.event_ctl	= SKX_UPI_PCI_PMON_CTL0,
4396 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4397 	.event_mask_ext = SKX_UPI_CTL_UMASK_EXT,
4398 	.box_ctl	= SKX_UPI_PCI_PMON_BOX_CTL,
4399 	.ops		= &skx_upi_uncore_pci_ops,
4400 	.format_group	= &skx_upi_uncore_format_group,
4401 	.attr_update	= skx_upi_attr_update,
4402 	.get_topology	= skx_upi_get_topology,
4403 	.set_mapping	= skx_upi_set_mapping,
4404 	.cleanup_mapping = skx_upi_cleanup_mapping,
4405 };
4406 
skx_m2m_uncore_pci_init_box(struct intel_uncore_box * box)4407 static void skx_m2m_uncore_pci_init_box(struct intel_uncore_box *box)
4408 {
4409 	struct pci_dev *pdev = box->pci_dev;
4410 
4411 	__set_bit(UNCORE_BOX_FLAG_CTL_OFFS8, &box->flags);
4412 	pci_write_config_dword(pdev, SKX_M2M_PCI_PMON_BOX_CTL, IVBEP_PMON_BOX_CTL_INT);
4413 }
4414 
4415 static struct intel_uncore_ops skx_m2m_uncore_pci_ops = {
4416 	.init_box	= skx_m2m_uncore_pci_init_box,
4417 	.disable_box	= snbep_uncore_pci_disable_box,
4418 	.enable_box	= snbep_uncore_pci_enable_box,
4419 	.disable_event	= snbep_uncore_pci_disable_event,
4420 	.enable_event	= snbep_uncore_pci_enable_event,
4421 	.read_counter	= snbep_uncore_pci_read_counter,
4422 };
4423 
4424 static struct intel_uncore_type skx_uncore_m2m = {
4425 	.name		= "m2m",
4426 	.num_counters   = 4,
4427 	.num_boxes	= 2,
4428 	.perf_ctr_bits	= 48,
4429 	.perf_ctr	= SKX_M2M_PCI_PMON_CTR0,
4430 	.event_ctl	= SKX_M2M_PCI_PMON_CTL0,
4431 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4432 	.box_ctl	= SKX_M2M_PCI_PMON_BOX_CTL,
4433 	.ops		= &skx_m2m_uncore_pci_ops,
4434 	.format_group	= &skx_uncore_format_group,
4435 };
4436 
4437 static struct event_constraint skx_uncore_m2pcie_constraints[] = {
4438 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
4439 	EVENT_CONSTRAINT_END
4440 };
4441 
4442 static struct intel_uncore_type skx_uncore_m2pcie = {
4443 	.name		= "m2pcie",
4444 	.num_counters   = 4,
4445 	.num_boxes	= 4,
4446 	.perf_ctr_bits	= 48,
4447 	.constraints	= skx_uncore_m2pcie_constraints,
4448 	.perf_ctr	= SNBEP_PCI_PMON_CTR0,
4449 	.event_ctl	= SNBEP_PCI_PMON_CTL0,
4450 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4451 	.box_ctl	= SNBEP_PCI_PMON_BOX_CTL,
4452 	.ops		= &ivbep_uncore_pci_ops,
4453 	.format_group	= &skx_uncore_format_group,
4454 };
4455 
4456 static struct event_constraint skx_uncore_m3upi_constraints[] = {
4457 	UNCORE_EVENT_CONSTRAINT(0x1d, 0x1),
4458 	UNCORE_EVENT_CONSTRAINT(0x1e, 0x1),
4459 	UNCORE_EVENT_CONSTRAINT(0x40, 0x7),
4460 	UNCORE_EVENT_CONSTRAINT(0x4e, 0x7),
4461 	UNCORE_EVENT_CONSTRAINT(0x4f, 0x7),
4462 	UNCORE_EVENT_CONSTRAINT(0x50, 0x7),
4463 	UNCORE_EVENT_CONSTRAINT(0x51, 0x7),
4464 	UNCORE_EVENT_CONSTRAINT(0x52, 0x7),
4465 	EVENT_CONSTRAINT_END
4466 };
4467 
4468 static struct intel_uncore_type skx_uncore_m3upi = {
4469 	.name		= "m3upi",
4470 	.num_counters   = 3,
4471 	.num_boxes	= 3,
4472 	.perf_ctr_bits	= 48,
4473 	.constraints	= skx_uncore_m3upi_constraints,
4474 	.perf_ctr	= SNBEP_PCI_PMON_CTR0,
4475 	.event_ctl	= SNBEP_PCI_PMON_CTL0,
4476 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4477 	.box_ctl	= SNBEP_PCI_PMON_BOX_CTL,
4478 	.ops		= &ivbep_uncore_pci_ops,
4479 	.format_group	= &skx_uncore_format_group,
4480 };
4481 
4482 enum {
4483 	SKX_PCI_UNCORE_IMC,
4484 	SKX_PCI_UNCORE_M2M,
4485 	SKX_PCI_UNCORE_UPI,
4486 	SKX_PCI_UNCORE_M2PCIE,
4487 	SKX_PCI_UNCORE_M3UPI,
4488 };
4489 
4490 static struct intel_uncore_type *skx_pci_uncores[] = {
4491 	[SKX_PCI_UNCORE_IMC]	= &skx_uncore_imc,
4492 	[SKX_PCI_UNCORE_M2M]	= &skx_uncore_m2m,
4493 	[SKX_PCI_UNCORE_UPI]	= &skx_uncore_upi,
4494 	[SKX_PCI_UNCORE_M2PCIE]	= &skx_uncore_m2pcie,
4495 	[SKX_PCI_UNCORE_M3UPI]	= &skx_uncore_m3upi,
4496 	NULL,
4497 };
4498 
4499 static const struct pci_device_id skx_uncore_pci_ids[] = {
4500 	{ /* MC0 Channel 0 */
4501 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2042),
4502 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(10, 2, SKX_PCI_UNCORE_IMC, 0),
4503 	},
4504 	{ /* MC0 Channel 1 */
4505 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2046),
4506 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(10, 6, SKX_PCI_UNCORE_IMC, 1),
4507 	},
4508 	{ /* MC0 Channel 2 */
4509 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204a),
4510 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(11, 2, SKX_PCI_UNCORE_IMC, 2),
4511 	},
4512 	{ /* MC1 Channel 0 */
4513 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2042),
4514 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 2, SKX_PCI_UNCORE_IMC, 3),
4515 	},
4516 	{ /* MC1 Channel 1 */
4517 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2046),
4518 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 6, SKX_PCI_UNCORE_IMC, 4),
4519 	},
4520 	{ /* MC1 Channel 2 */
4521 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204a),
4522 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(13, 2, SKX_PCI_UNCORE_IMC, 5),
4523 	},
4524 	{ /* M2M0 */
4525 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2066),
4526 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 0, SKX_PCI_UNCORE_M2M, 0),
4527 	},
4528 	{ /* M2M1 */
4529 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2066),
4530 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 0, SKX_PCI_UNCORE_M2M, 1),
4531 	},
4532 	{ /* UPI0 Link 0 */
4533 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2058),
4534 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(14, 0, SKX_PCI_UNCORE_UPI, 0),
4535 	},
4536 	{ /* UPI0 Link 1 */
4537 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2058),
4538 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(15, 0, SKX_PCI_UNCORE_UPI, 1),
4539 	},
4540 	{ /* UPI1 Link 2 */
4541 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2058),
4542 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(16, 0, SKX_PCI_UNCORE_UPI, 2),
4543 	},
4544 	{ /* M2PCIe 0 */
4545 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
4546 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 1, SKX_PCI_UNCORE_M2PCIE, 0),
4547 	},
4548 	{ /* M2PCIe 1 */
4549 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
4550 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(22, 1, SKX_PCI_UNCORE_M2PCIE, 1),
4551 	},
4552 	{ /* M2PCIe 2 */
4553 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
4554 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(23, 1, SKX_PCI_UNCORE_M2PCIE, 2),
4555 	},
4556 	{ /* M2PCIe 3 */
4557 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
4558 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 5, SKX_PCI_UNCORE_M2PCIE, 3),
4559 	},
4560 	{ /* M3UPI0 Link 0 */
4561 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
4562 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 0),
4563 	},
4564 	{ /* M3UPI0 Link 1 */
4565 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204E),
4566 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 2, SKX_PCI_UNCORE_M3UPI, 1),
4567 	},
4568 	{ /* M3UPI1 Link 2 */
4569 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
4570 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 5, SKX_PCI_UNCORE_M3UPI, 2),
4571 	},
4572 	{ /* end: all zeroes */ }
4573 };
4574 
4575 
4576 static struct pci_driver skx_uncore_pci_driver = {
4577 	.name		= "skx_uncore",
4578 	.id_table	= skx_uncore_pci_ids,
4579 };
4580 
skx_uncore_pci_init(void)4581 int skx_uncore_pci_init(void)
4582 {
4583 	/* need to double check pci address */
4584 	int ret = snbep_pci2phy_map_init(0x2014, SKX_CPUNODEID, SKX_GIDNIDMAP, false);
4585 
4586 	if (ret)
4587 		return ret;
4588 
4589 	uncore_pci_uncores = skx_pci_uncores;
4590 	uncore_pci_driver = &skx_uncore_pci_driver;
4591 	return 0;
4592 }
4593 
4594 /* end of SKX uncore support */
4595 
4596 /* SNR uncore support */
4597 
4598 static struct intel_uncore_type snr_uncore_ubox = {
4599 	.name			= "ubox",
4600 	.num_counters		= 2,
4601 	.num_boxes		= 1,
4602 	.perf_ctr_bits		= 48,
4603 	.fixed_ctr_bits		= 48,
4604 	.perf_ctr		= SNR_U_MSR_PMON_CTR0,
4605 	.event_ctl		= SNR_U_MSR_PMON_CTL0,
4606 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
4607 	.fixed_ctr		= SNR_U_MSR_PMON_UCLK_FIXED_CTR,
4608 	.fixed_ctl		= SNR_U_MSR_PMON_UCLK_FIXED_CTL,
4609 	.ops			= &ivbep_uncore_msr_ops,
4610 	.format_group		= &ivbep_uncore_format_group,
4611 };
4612 
4613 static struct attribute *snr_uncore_cha_formats_attr[] = {
4614 	&format_attr_event.attr,
4615 	&format_attr_umask_ext2.attr,
4616 	&format_attr_edge.attr,
4617 	&format_attr_tid_en.attr,
4618 	&format_attr_inv.attr,
4619 	&format_attr_thresh8.attr,
4620 	&format_attr_filter_tid5.attr,
4621 	NULL,
4622 };
4623 static const struct attribute_group snr_uncore_chabox_format_group = {
4624 	.name = "format",
4625 	.attrs = snr_uncore_cha_formats_attr,
4626 };
4627 
snr_cha_hw_config(struct intel_uncore_box * box,struct perf_event * event)4628 static int snr_cha_hw_config(struct intel_uncore_box *box, struct perf_event *event)
4629 {
4630 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
4631 
4632 	reg1->reg = SNR_C0_MSR_PMON_BOX_FILTER0 +
4633 		    box->pmu->type->msr_offset * box->pmu->pmu_idx;
4634 	reg1->config = event->attr.config1 & SKX_CHA_MSR_PMON_BOX_FILTER_TID;
4635 	reg1->idx = 0;
4636 
4637 	return 0;
4638 }
4639 
snr_cha_enable_event(struct intel_uncore_box * box,struct perf_event * event)4640 static void snr_cha_enable_event(struct intel_uncore_box *box,
4641 				   struct perf_event *event)
4642 {
4643 	struct hw_perf_event *hwc = &event->hw;
4644 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
4645 
4646 	if (reg1->idx != EXTRA_REG_NONE)
4647 		wrmsrl(reg1->reg, reg1->config);
4648 
4649 	wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
4650 }
4651 
4652 static struct intel_uncore_ops snr_uncore_chabox_ops = {
4653 	.init_box		= ivbep_uncore_msr_init_box,
4654 	.disable_box		= snbep_uncore_msr_disable_box,
4655 	.enable_box		= snbep_uncore_msr_enable_box,
4656 	.disable_event		= snbep_uncore_msr_disable_event,
4657 	.enable_event		= snr_cha_enable_event,
4658 	.read_counter		= uncore_msr_read_counter,
4659 	.hw_config		= snr_cha_hw_config,
4660 };
4661 
4662 static struct intel_uncore_type snr_uncore_chabox = {
4663 	.name			= "cha",
4664 	.num_counters		= 4,
4665 	.num_boxes		= 6,
4666 	.perf_ctr_bits		= 48,
4667 	.event_ctl		= SNR_CHA_MSR_PMON_CTL0,
4668 	.perf_ctr		= SNR_CHA_MSR_PMON_CTR0,
4669 	.box_ctl		= SNR_CHA_MSR_PMON_BOX_CTL,
4670 	.msr_offset		= HSWEP_CBO_MSR_OFFSET,
4671 	.event_mask		= HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
4672 	.event_mask_ext		= SNR_CHA_RAW_EVENT_MASK_EXT,
4673 	.ops			= &snr_uncore_chabox_ops,
4674 	.format_group		= &snr_uncore_chabox_format_group,
4675 };
4676 
4677 static struct attribute *snr_uncore_iio_formats_attr[] = {
4678 	&format_attr_event.attr,
4679 	&format_attr_umask.attr,
4680 	&format_attr_edge.attr,
4681 	&format_attr_inv.attr,
4682 	&format_attr_thresh9.attr,
4683 	&format_attr_ch_mask2.attr,
4684 	&format_attr_fc_mask2.attr,
4685 	NULL,
4686 };
4687 
4688 static const struct attribute_group snr_uncore_iio_format_group = {
4689 	.name = "format",
4690 	.attrs = snr_uncore_iio_formats_attr,
4691 };
4692 
4693 static umode_t
snr_iio_mapping_visible(struct kobject * kobj,struct attribute * attr,int die)4694 snr_iio_mapping_visible(struct kobject *kobj, struct attribute *attr, int die)
4695 {
4696 	/* Root bus 0x00 is valid only for pmu_idx = 1. */
4697 	return pmu_iio_mapping_visible(kobj, attr, die, 1);
4698 }
4699 
4700 static struct attribute_group snr_iio_mapping_group = {
4701 	.is_visible	= snr_iio_mapping_visible,
4702 };
4703 
4704 static const struct attribute_group *snr_iio_attr_update[] = {
4705 	&snr_iio_mapping_group,
4706 	NULL,
4707 };
4708 
sad_cfg_iio_topology(struct intel_uncore_type * type,u8 * sad_pmon_mapping)4709 static int sad_cfg_iio_topology(struct intel_uncore_type *type, u8 *sad_pmon_mapping)
4710 {
4711 	u32 sad_cfg;
4712 	int die, stack_id, ret = -EPERM;
4713 	struct pci_dev *dev = NULL;
4714 
4715 	while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL, SNR_ICX_MESH2IIO_MMAP_DID, dev))) {
4716 		ret = pci_read_config_dword(dev, SNR_ICX_SAD_CONTROL_CFG, &sad_cfg);
4717 		if (ret) {
4718 			ret = pcibios_err_to_errno(ret);
4719 			break;
4720 		}
4721 
4722 		die = uncore_pcibus_to_dieid(dev->bus);
4723 		stack_id = SAD_CONTROL_STACK_ID(sad_cfg);
4724 		if (die < 0 || stack_id >= type->num_boxes) {
4725 			ret = -EPERM;
4726 			break;
4727 		}
4728 
4729 		/* Convert stack id from SAD_CONTROL to PMON notation. */
4730 		stack_id = sad_pmon_mapping[stack_id];
4731 
4732 		type->topology[die][stack_id].iio->segment = pci_domain_nr(dev->bus);
4733 		type->topology[die][stack_id].pmu_idx = stack_id;
4734 		type->topology[die][stack_id].iio->pci_bus_no = dev->bus->number;
4735 	}
4736 
4737 	pci_dev_put(dev);
4738 
4739 	return ret;
4740 }
4741 
4742 /*
4743  * SNR has a static mapping of stack IDs from SAD_CONTROL_CFG notation to PMON
4744  */
4745 enum {
4746 	SNR_QAT_PMON_ID,
4747 	SNR_CBDMA_DMI_PMON_ID,
4748 	SNR_NIS_PMON_ID,
4749 	SNR_DLB_PMON_ID,
4750 	SNR_PCIE_GEN3_PMON_ID
4751 };
4752 
4753 static u8 snr_sad_pmon_mapping[] = {
4754 	SNR_CBDMA_DMI_PMON_ID,
4755 	SNR_PCIE_GEN3_PMON_ID,
4756 	SNR_DLB_PMON_ID,
4757 	SNR_NIS_PMON_ID,
4758 	SNR_QAT_PMON_ID
4759 };
4760 
snr_iio_get_topology(struct intel_uncore_type * type)4761 static int snr_iio_get_topology(struct intel_uncore_type *type)
4762 {
4763 	return sad_cfg_iio_topology(type, snr_sad_pmon_mapping);
4764 }
4765 
snr_iio_set_mapping(struct intel_uncore_type * type)4766 static void snr_iio_set_mapping(struct intel_uncore_type *type)
4767 {
4768 	pmu_iio_set_mapping(type, &snr_iio_mapping_group);
4769 }
4770 
snr_iio_cleanup_mapping(struct intel_uncore_type * type)4771 static void snr_iio_cleanup_mapping(struct intel_uncore_type *type)
4772 {
4773 	pmu_cleanup_mapping(type, &snr_iio_mapping_group);
4774 }
4775 
4776 static struct event_constraint snr_uncore_iio_constraints[] = {
4777 	UNCORE_EVENT_CONSTRAINT(0x83, 0x3),
4778 	UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
4779 	UNCORE_EVENT_CONSTRAINT(0xd5, 0xc),
4780 	EVENT_CONSTRAINT_END
4781 };
4782 
4783 static struct intel_uncore_type snr_uncore_iio = {
4784 	.name			= "iio",
4785 	.num_counters		= 4,
4786 	.num_boxes		= 5,
4787 	.perf_ctr_bits		= 48,
4788 	.event_ctl		= SNR_IIO_MSR_PMON_CTL0,
4789 	.perf_ctr		= SNR_IIO_MSR_PMON_CTR0,
4790 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
4791 	.event_mask_ext		= SNR_IIO_PMON_RAW_EVENT_MASK_EXT,
4792 	.box_ctl		= SNR_IIO_MSR_PMON_BOX_CTL,
4793 	.msr_offset		= SNR_IIO_MSR_OFFSET,
4794 	.constraints		= snr_uncore_iio_constraints,
4795 	.ops			= &ivbep_uncore_msr_ops,
4796 	.format_group		= &snr_uncore_iio_format_group,
4797 	.attr_update		= snr_iio_attr_update,
4798 	.get_topology		= snr_iio_get_topology,
4799 	.set_mapping		= snr_iio_set_mapping,
4800 	.cleanup_mapping	= snr_iio_cleanup_mapping,
4801 };
4802 
4803 static struct intel_uncore_type snr_uncore_irp = {
4804 	.name			= "irp",
4805 	.num_counters		= 2,
4806 	.num_boxes		= 5,
4807 	.perf_ctr_bits		= 48,
4808 	.event_ctl		= SNR_IRP0_MSR_PMON_CTL0,
4809 	.perf_ctr		= SNR_IRP0_MSR_PMON_CTR0,
4810 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
4811 	.box_ctl		= SNR_IRP0_MSR_PMON_BOX_CTL,
4812 	.msr_offset		= SNR_IRP_MSR_OFFSET,
4813 	.ops			= &ivbep_uncore_msr_ops,
4814 	.format_group		= &ivbep_uncore_format_group,
4815 };
4816 
4817 static struct intel_uncore_type snr_uncore_m2pcie = {
4818 	.name		= "m2pcie",
4819 	.num_counters	= 4,
4820 	.num_boxes	= 5,
4821 	.perf_ctr_bits	= 48,
4822 	.event_ctl	= SNR_M2PCIE_MSR_PMON_CTL0,
4823 	.perf_ctr	= SNR_M2PCIE_MSR_PMON_CTR0,
4824 	.box_ctl	= SNR_M2PCIE_MSR_PMON_BOX_CTL,
4825 	.msr_offset	= SNR_M2PCIE_MSR_OFFSET,
4826 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4827 	.ops		= &ivbep_uncore_msr_ops,
4828 	.format_group	= &ivbep_uncore_format_group,
4829 };
4830 
snr_pcu_hw_config(struct intel_uncore_box * box,struct perf_event * event)4831 static int snr_pcu_hw_config(struct intel_uncore_box *box, struct perf_event *event)
4832 {
4833 	struct hw_perf_event *hwc = &event->hw;
4834 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
4835 	int ev_sel = hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK;
4836 
4837 	if (ev_sel >= 0xb && ev_sel <= 0xe) {
4838 		reg1->reg = SNR_PCU_MSR_PMON_BOX_FILTER;
4839 		reg1->idx = ev_sel - 0xb;
4840 		reg1->config = event->attr.config1 & (0xff << reg1->idx);
4841 	}
4842 	return 0;
4843 }
4844 
4845 static struct intel_uncore_ops snr_uncore_pcu_ops = {
4846 	IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
4847 	.hw_config		= snr_pcu_hw_config,
4848 	.get_constraint		= snbep_pcu_get_constraint,
4849 	.put_constraint		= snbep_pcu_put_constraint,
4850 };
4851 
4852 static struct intel_uncore_type snr_uncore_pcu = {
4853 	.name			= "pcu",
4854 	.num_counters		= 4,
4855 	.num_boxes		= 1,
4856 	.perf_ctr_bits		= 48,
4857 	.perf_ctr		= SNR_PCU_MSR_PMON_CTR0,
4858 	.event_ctl		= SNR_PCU_MSR_PMON_CTL0,
4859 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
4860 	.box_ctl		= SNR_PCU_MSR_PMON_BOX_CTL,
4861 	.num_shared_regs	= 1,
4862 	.ops			= &snr_uncore_pcu_ops,
4863 	.format_group		= &skx_uncore_pcu_format_group,
4864 };
4865 
4866 enum perf_uncore_snr_iio_freerunning_type_id {
4867 	SNR_IIO_MSR_IOCLK,
4868 	SNR_IIO_MSR_BW_IN,
4869 
4870 	SNR_IIO_FREERUNNING_TYPE_MAX,
4871 };
4872 
4873 static struct freerunning_counters snr_iio_freerunning[] = {
4874 	[SNR_IIO_MSR_IOCLK]	= { 0x1eac, 0x1, 0x10, 1, 48 },
4875 	[SNR_IIO_MSR_BW_IN]	= { 0x1f00, 0x1, 0x10, 8, 48 },
4876 };
4877 
4878 static struct uncore_event_desc snr_uncore_iio_freerunning_events[] = {
4879 	/* Free-Running IIO CLOCKS Counter */
4880 	INTEL_UNCORE_EVENT_DESC(ioclk,			"event=0xff,umask=0x10"),
4881 	/* Free-Running IIO BANDWIDTH IN Counters */
4882 	INTEL_UNCORE_EVENT_DESC(bw_in_port0,		"event=0xff,umask=0x20"),
4883 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale,	"3.814697266e-6"),
4884 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit,	"MiB"),
4885 	INTEL_UNCORE_EVENT_DESC(bw_in_port1,		"event=0xff,umask=0x21"),
4886 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale,	"3.814697266e-6"),
4887 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit,	"MiB"),
4888 	INTEL_UNCORE_EVENT_DESC(bw_in_port2,		"event=0xff,umask=0x22"),
4889 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale,	"3.814697266e-6"),
4890 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit,	"MiB"),
4891 	INTEL_UNCORE_EVENT_DESC(bw_in_port3,		"event=0xff,umask=0x23"),
4892 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale,	"3.814697266e-6"),
4893 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit,	"MiB"),
4894 	INTEL_UNCORE_EVENT_DESC(bw_in_port4,		"event=0xff,umask=0x24"),
4895 	INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale,	"3.814697266e-6"),
4896 	INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit,	"MiB"),
4897 	INTEL_UNCORE_EVENT_DESC(bw_in_port5,		"event=0xff,umask=0x25"),
4898 	INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale,	"3.814697266e-6"),
4899 	INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit,	"MiB"),
4900 	INTEL_UNCORE_EVENT_DESC(bw_in_port6,		"event=0xff,umask=0x26"),
4901 	INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale,	"3.814697266e-6"),
4902 	INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit,	"MiB"),
4903 	INTEL_UNCORE_EVENT_DESC(bw_in_port7,		"event=0xff,umask=0x27"),
4904 	INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale,	"3.814697266e-6"),
4905 	INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit,	"MiB"),
4906 	{ /* end: all zeroes */ },
4907 };
4908 
4909 static struct intel_uncore_type snr_uncore_iio_free_running = {
4910 	.name			= "iio_free_running",
4911 	.num_counters		= 9,
4912 	.num_boxes		= 5,
4913 	.num_freerunning_types	= SNR_IIO_FREERUNNING_TYPE_MAX,
4914 	.freerunning		= snr_iio_freerunning,
4915 	.ops			= &skx_uncore_iio_freerunning_ops,
4916 	.event_descs		= snr_uncore_iio_freerunning_events,
4917 	.format_group		= &skx_uncore_iio_freerunning_format_group,
4918 };
4919 
4920 static struct intel_uncore_type *snr_msr_uncores[] = {
4921 	&snr_uncore_ubox,
4922 	&snr_uncore_chabox,
4923 	&snr_uncore_iio,
4924 	&snr_uncore_irp,
4925 	&snr_uncore_m2pcie,
4926 	&snr_uncore_pcu,
4927 	&snr_uncore_iio_free_running,
4928 	NULL,
4929 };
4930 
snr_uncore_cpu_init(void)4931 void snr_uncore_cpu_init(void)
4932 {
4933 	uncore_msr_uncores = snr_msr_uncores;
4934 }
4935 
snr_m2m_uncore_pci_init_box(struct intel_uncore_box * box)4936 static void snr_m2m_uncore_pci_init_box(struct intel_uncore_box *box)
4937 {
4938 	struct pci_dev *pdev = box->pci_dev;
4939 	int box_ctl = uncore_pci_box_ctl(box);
4940 
4941 	__set_bit(UNCORE_BOX_FLAG_CTL_OFFS8, &box->flags);
4942 	pci_write_config_dword(pdev, box_ctl, IVBEP_PMON_BOX_CTL_INT);
4943 }
4944 
4945 static struct intel_uncore_ops snr_m2m_uncore_pci_ops = {
4946 	.init_box	= snr_m2m_uncore_pci_init_box,
4947 	.disable_box	= snbep_uncore_pci_disable_box,
4948 	.enable_box	= snbep_uncore_pci_enable_box,
4949 	.disable_event	= snbep_uncore_pci_disable_event,
4950 	.enable_event	= snbep_uncore_pci_enable_event,
4951 	.read_counter	= snbep_uncore_pci_read_counter,
4952 };
4953 
4954 static struct attribute *snr_m2m_uncore_formats_attr[] = {
4955 	&format_attr_event.attr,
4956 	&format_attr_umask_ext3.attr,
4957 	&format_attr_edge.attr,
4958 	&format_attr_inv.attr,
4959 	&format_attr_thresh8.attr,
4960 	NULL,
4961 };
4962 
4963 static const struct attribute_group snr_m2m_uncore_format_group = {
4964 	.name = "format",
4965 	.attrs = snr_m2m_uncore_formats_attr,
4966 };
4967 
4968 static struct intel_uncore_type snr_uncore_m2m = {
4969 	.name		= "m2m",
4970 	.num_counters   = 4,
4971 	.num_boxes	= 1,
4972 	.perf_ctr_bits	= 48,
4973 	.perf_ctr	= SNR_M2M_PCI_PMON_CTR0,
4974 	.event_ctl	= SNR_M2M_PCI_PMON_CTL0,
4975 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
4976 	.event_mask_ext	= SNR_M2M_PCI_PMON_UMASK_EXT,
4977 	.box_ctl	= SNR_M2M_PCI_PMON_BOX_CTL,
4978 	.ops		= &snr_m2m_uncore_pci_ops,
4979 	.format_group	= &snr_m2m_uncore_format_group,
4980 };
4981 
snr_uncore_pci_enable_event(struct intel_uncore_box * box,struct perf_event * event)4982 static void snr_uncore_pci_enable_event(struct intel_uncore_box *box, struct perf_event *event)
4983 {
4984 	struct pci_dev *pdev = box->pci_dev;
4985 	struct hw_perf_event *hwc = &event->hw;
4986 
4987 	pci_write_config_dword(pdev, hwc->config_base, (u32)(hwc->config | SNBEP_PMON_CTL_EN));
4988 	pci_write_config_dword(pdev, hwc->config_base + 4, (u32)(hwc->config >> 32));
4989 }
4990 
4991 static struct intel_uncore_ops snr_pcie3_uncore_pci_ops = {
4992 	.init_box	= snr_m2m_uncore_pci_init_box,
4993 	.disable_box	= snbep_uncore_pci_disable_box,
4994 	.enable_box	= snbep_uncore_pci_enable_box,
4995 	.disable_event	= snbep_uncore_pci_disable_event,
4996 	.enable_event	= snr_uncore_pci_enable_event,
4997 	.read_counter	= snbep_uncore_pci_read_counter,
4998 };
4999 
5000 static struct intel_uncore_type snr_uncore_pcie3 = {
5001 	.name		= "pcie3",
5002 	.num_counters	= 4,
5003 	.num_boxes	= 1,
5004 	.perf_ctr_bits	= 48,
5005 	.perf_ctr	= SNR_PCIE3_PCI_PMON_CTR0,
5006 	.event_ctl	= SNR_PCIE3_PCI_PMON_CTL0,
5007 	.event_mask	= SKX_IIO_PMON_RAW_EVENT_MASK,
5008 	.event_mask_ext	= SKX_IIO_PMON_RAW_EVENT_MASK_EXT,
5009 	.box_ctl	= SNR_PCIE3_PCI_PMON_BOX_CTL,
5010 	.ops		= &snr_pcie3_uncore_pci_ops,
5011 	.format_group	= &skx_uncore_iio_format_group,
5012 };
5013 
5014 enum {
5015 	SNR_PCI_UNCORE_M2M,
5016 	SNR_PCI_UNCORE_PCIE3,
5017 };
5018 
5019 static struct intel_uncore_type *snr_pci_uncores[] = {
5020 	[SNR_PCI_UNCORE_M2M]		= &snr_uncore_m2m,
5021 	[SNR_PCI_UNCORE_PCIE3]		= &snr_uncore_pcie3,
5022 	NULL,
5023 };
5024 
5025 static const struct pci_device_id snr_uncore_pci_ids[] = {
5026 	{ /* M2M */
5027 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
5028 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, SNR_PCI_UNCORE_M2M, 0),
5029 	},
5030 	{ /* end: all zeroes */ }
5031 };
5032 
5033 static struct pci_driver snr_uncore_pci_driver = {
5034 	.name		= "snr_uncore",
5035 	.id_table	= snr_uncore_pci_ids,
5036 };
5037 
5038 static const struct pci_device_id snr_uncore_pci_sub_ids[] = {
5039 	{ /* PCIe3 RP */
5040 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x334a),
5041 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(4, 0, SNR_PCI_UNCORE_PCIE3, 0),
5042 	},
5043 	{ /* end: all zeroes */ }
5044 };
5045 
5046 static struct pci_driver snr_uncore_pci_sub_driver = {
5047 	.name		= "snr_uncore_sub",
5048 	.id_table	= snr_uncore_pci_sub_ids,
5049 };
5050 
snr_uncore_pci_init(void)5051 int snr_uncore_pci_init(void)
5052 {
5053 	/* SNR UBOX DID */
5054 	int ret = snbep_pci2phy_map_init(0x3460, SKX_CPUNODEID,
5055 					 SKX_GIDNIDMAP, true);
5056 
5057 	if (ret)
5058 		return ret;
5059 
5060 	uncore_pci_uncores = snr_pci_uncores;
5061 	uncore_pci_driver = &snr_uncore_pci_driver;
5062 	uncore_pci_sub_driver = &snr_uncore_pci_sub_driver;
5063 	return 0;
5064 }
5065 
5066 #define SNR_MC_DEVICE_ID	0x3451
5067 
snr_uncore_get_mc_dev(unsigned int device,int id)5068 static struct pci_dev *snr_uncore_get_mc_dev(unsigned int device, int id)
5069 {
5070 	struct pci_dev *mc_dev = NULL;
5071 	int pkg;
5072 
5073 	while (1) {
5074 		mc_dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, mc_dev);
5075 		if (!mc_dev)
5076 			break;
5077 		pkg = uncore_pcibus_to_dieid(mc_dev->bus);
5078 		if (pkg == id)
5079 			break;
5080 	}
5081 	return mc_dev;
5082 }
5083 
snr_uncore_mmio_map(struct intel_uncore_box * box,unsigned int box_ctl,int mem_offset,unsigned int device)5084 static int snr_uncore_mmio_map(struct intel_uncore_box *box,
5085 			       unsigned int box_ctl, int mem_offset,
5086 			       unsigned int device)
5087 {
5088 	struct pci_dev *pdev = snr_uncore_get_mc_dev(device, box->dieid);
5089 	struct intel_uncore_type *type = box->pmu->type;
5090 	resource_size_t addr;
5091 	u32 pci_dword;
5092 
5093 	if (!pdev)
5094 		return -ENODEV;
5095 
5096 	pci_read_config_dword(pdev, SNR_IMC_MMIO_BASE_OFFSET, &pci_dword);
5097 	addr = ((resource_size_t)pci_dword & SNR_IMC_MMIO_BASE_MASK) << 23;
5098 
5099 	pci_read_config_dword(pdev, mem_offset, &pci_dword);
5100 	addr |= (pci_dword & SNR_IMC_MMIO_MEM0_MASK) << 12;
5101 
5102 	addr += box_ctl;
5103 
5104 	pci_dev_put(pdev);
5105 
5106 	box->io_addr = ioremap(addr, type->mmio_map_size);
5107 	if (!box->io_addr) {
5108 		pr_warn("perf uncore: Failed to ioremap for %s.\n", type->name);
5109 		return -EINVAL;
5110 	}
5111 
5112 	return 0;
5113 }
5114 
__snr_uncore_mmio_init_box(struct intel_uncore_box * box,unsigned int box_ctl,int mem_offset,unsigned int device)5115 static void __snr_uncore_mmio_init_box(struct intel_uncore_box *box,
5116 				       unsigned int box_ctl, int mem_offset,
5117 				       unsigned int device)
5118 {
5119 	if (!snr_uncore_mmio_map(box, box_ctl, mem_offset, device))
5120 		writel(IVBEP_PMON_BOX_CTL_INT, box->io_addr);
5121 }
5122 
snr_uncore_mmio_init_box(struct intel_uncore_box * box)5123 static void snr_uncore_mmio_init_box(struct intel_uncore_box *box)
5124 {
5125 	__snr_uncore_mmio_init_box(box, uncore_mmio_box_ctl(box),
5126 				   SNR_IMC_MMIO_MEM0_OFFSET,
5127 				   SNR_MC_DEVICE_ID);
5128 }
5129 
snr_uncore_mmio_disable_box(struct intel_uncore_box * box)5130 static void snr_uncore_mmio_disable_box(struct intel_uncore_box *box)
5131 {
5132 	u32 config;
5133 
5134 	if (!box->io_addr)
5135 		return;
5136 
5137 	config = readl(box->io_addr);
5138 	config |= SNBEP_PMON_BOX_CTL_FRZ;
5139 	writel(config, box->io_addr);
5140 }
5141 
snr_uncore_mmio_enable_box(struct intel_uncore_box * box)5142 static void snr_uncore_mmio_enable_box(struct intel_uncore_box *box)
5143 {
5144 	u32 config;
5145 
5146 	if (!box->io_addr)
5147 		return;
5148 
5149 	config = readl(box->io_addr);
5150 	config &= ~SNBEP_PMON_BOX_CTL_FRZ;
5151 	writel(config, box->io_addr);
5152 }
5153 
snr_uncore_mmio_enable_event(struct intel_uncore_box * box,struct perf_event * event)5154 static void snr_uncore_mmio_enable_event(struct intel_uncore_box *box,
5155 					   struct perf_event *event)
5156 {
5157 	struct hw_perf_event *hwc = &event->hw;
5158 
5159 	if (!box->io_addr)
5160 		return;
5161 
5162 	if (!uncore_mmio_is_valid_offset(box, hwc->config_base))
5163 		return;
5164 
5165 	writel(hwc->config | SNBEP_PMON_CTL_EN,
5166 	       box->io_addr + hwc->config_base);
5167 }
5168 
snr_uncore_mmio_disable_event(struct intel_uncore_box * box,struct perf_event * event)5169 static void snr_uncore_mmio_disable_event(struct intel_uncore_box *box,
5170 					    struct perf_event *event)
5171 {
5172 	struct hw_perf_event *hwc = &event->hw;
5173 
5174 	if (!box->io_addr)
5175 		return;
5176 
5177 	if (!uncore_mmio_is_valid_offset(box, hwc->config_base))
5178 		return;
5179 
5180 	writel(hwc->config, box->io_addr + hwc->config_base);
5181 }
5182 
5183 static struct intel_uncore_ops snr_uncore_mmio_ops = {
5184 	.init_box	= snr_uncore_mmio_init_box,
5185 	.exit_box	= uncore_mmio_exit_box,
5186 	.disable_box	= snr_uncore_mmio_disable_box,
5187 	.enable_box	= snr_uncore_mmio_enable_box,
5188 	.disable_event	= snr_uncore_mmio_disable_event,
5189 	.enable_event	= snr_uncore_mmio_enable_event,
5190 	.read_counter	= uncore_mmio_read_counter,
5191 };
5192 
5193 static struct uncore_event_desc snr_uncore_imc_events[] = {
5194 	INTEL_UNCORE_EVENT_DESC(clockticks,      "event=0x00,umask=0x00"),
5195 	INTEL_UNCORE_EVENT_DESC(cas_count_read,  "event=0x04,umask=0x0f"),
5196 	INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
5197 	INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
5198 	INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x30"),
5199 	INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
5200 	INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
5201 	{ /* end: all zeroes */ },
5202 };
5203 
5204 static struct intel_uncore_type snr_uncore_imc = {
5205 	.name		= "imc",
5206 	.num_counters   = 4,
5207 	.num_boxes	= 2,
5208 	.perf_ctr_bits	= 48,
5209 	.fixed_ctr_bits	= 48,
5210 	.fixed_ctr	= SNR_IMC_MMIO_PMON_FIXED_CTR,
5211 	.fixed_ctl	= SNR_IMC_MMIO_PMON_FIXED_CTL,
5212 	.event_descs	= snr_uncore_imc_events,
5213 	.perf_ctr	= SNR_IMC_MMIO_PMON_CTR0,
5214 	.event_ctl	= SNR_IMC_MMIO_PMON_CTL0,
5215 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
5216 	.box_ctl	= SNR_IMC_MMIO_PMON_BOX_CTL,
5217 	.mmio_offset	= SNR_IMC_MMIO_OFFSET,
5218 	.mmio_map_size	= SNR_IMC_MMIO_SIZE,
5219 	.ops		= &snr_uncore_mmio_ops,
5220 	.format_group	= &skx_uncore_format_group,
5221 };
5222 
5223 enum perf_uncore_snr_imc_freerunning_type_id {
5224 	SNR_IMC_DCLK,
5225 	SNR_IMC_DDR,
5226 
5227 	SNR_IMC_FREERUNNING_TYPE_MAX,
5228 };
5229 
5230 static struct freerunning_counters snr_imc_freerunning[] = {
5231 	[SNR_IMC_DCLK]	= { 0x22b0, 0x0, 0, 1, 48 },
5232 	[SNR_IMC_DDR]	= { 0x2290, 0x8, 0, 2, 48 },
5233 };
5234 
5235 static struct uncore_event_desc snr_uncore_imc_freerunning_events[] = {
5236 	INTEL_UNCORE_EVENT_DESC(dclk,		"event=0xff,umask=0x10"),
5237 
5238 	INTEL_UNCORE_EVENT_DESC(read,		"event=0xff,umask=0x20"),
5239 	INTEL_UNCORE_EVENT_DESC(read.scale,	"6.103515625e-5"),
5240 	INTEL_UNCORE_EVENT_DESC(read.unit,	"MiB"),
5241 	INTEL_UNCORE_EVENT_DESC(write,		"event=0xff,umask=0x21"),
5242 	INTEL_UNCORE_EVENT_DESC(write.scale,	"6.103515625e-5"),
5243 	INTEL_UNCORE_EVENT_DESC(write.unit,	"MiB"),
5244 	{ /* end: all zeroes */ },
5245 };
5246 
5247 static struct intel_uncore_ops snr_uncore_imc_freerunning_ops = {
5248 	.init_box	= snr_uncore_mmio_init_box,
5249 	.exit_box	= uncore_mmio_exit_box,
5250 	.read_counter	= uncore_mmio_read_counter,
5251 	.hw_config	= uncore_freerunning_hw_config,
5252 };
5253 
5254 static struct intel_uncore_type snr_uncore_imc_free_running = {
5255 	.name			= "imc_free_running",
5256 	.num_counters		= 3,
5257 	.num_boxes		= 1,
5258 	.num_freerunning_types	= SNR_IMC_FREERUNNING_TYPE_MAX,
5259 	.mmio_map_size		= SNR_IMC_MMIO_SIZE,
5260 	.freerunning		= snr_imc_freerunning,
5261 	.ops			= &snr_uncore_imc_freerunning_ops,
5262 	.event_descs		= snr_uncore_imc_freerunning_events,
5263 	.format_group		= &skx_uncore_iio_freerunning_format_group,
5264 };
5265 
5266 static struct intel_uncore_type *snr_mmio_uncores[] = {
5267 	&snr_uncore_imc,
5268 	&snr_uncore_imc_free_running,
5269 	NULL,
5270 };
5271 
snr_uncore_mmio_init(void)5272 void snr_uncore_mmio_init(void)
5273 {
5274 	uncore_mmio_uncores = snr_mmio_uncores;
5275 }
5276 
5277 /* end of SNR uncore support */
5278 
5279 /* ICX uncore support */
5280 
5281 static unsigned icx_cha_msr_offsets[] = {
5282 	0x2a0, 0x2ae, 0x2bc, 0x2ca, 0x2d8, 0x2e6, 0x2f4, 0x302, 0x310,
5283 	0x31e, 0x32c, 0x33a, 0x348, 0x356, 0x364, 0x372, 0x380, 0x38e,
5284 	0x3aa, 0x3b8, 0x3c6, 0x3d4, 0x3e2, 0x3f0, 0x3fe, 0x40c, 0x41a,
5285 	0x428, 0x436, 0x444, 0x452, 0x460, 0x46e, 0x47c, 0x0,   0xe,
5286 	0x1c,  0x2a,  0x38,  0x46,
5287 };
5288 
icx_cha_hw_config(struct intel_uncore_box * box,struct perf_event * event)5289 static int icx_cha_hw_config(struct intel_uncore_box *box, struct perf_event *event)
5290 {
5291 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
5292 	bool tie_en = !!(event->hw.config & SNBEP_CBO_PMON_CTL_TID_EN);
5293 
5294 	if (tie_en) {
5295 		reg1->reg = ICX_C34_MSR_PMON_BOX_FILTER0 +
5296 			    icx_cha_msr_offsets[box->pmu->pmu_idx];
5297 		reg1->config = event->attr.config1 & SKX_CHA_MSR_PMON_BOX_FILTER_TID;
5298 		reg1->idx = 0;
5299 	}
5300 
5301 	return 0;
5302 }
5303 
5304 static struct intel_uncore_ops icx_uncore_chabox_ops = {
5305 	.init_box		= ivbep_uncore_msr_init_box,
5306 	.disable_box		= snbep_uncore_msr_disable_box,
5307 	.enable_box		= snbep_uncore_msr_enable_box,
5308 	.disable_event		= snbep_uncore_msr_disable_event,
5309 	.enable_event		= snr_cha_enable_event,
5310 	.read_counter		= uncore_msr_read_counter,
5311 	.hw_config		= icx_cha_hw_config,
5312 };
5313 
5314 static struct intel_uncore_type icx_uncore_chabox = {
5315 	.name			= "cha",
5316 	.num_counters		= 4,
5317 	.perf_ctr_bits		= 48,
5318 	.event_ctl		= ICX_C34_MSR_PMON_CTL0,
5319 	.perf_ctr		= ICX_C34_MSR_PMON_CTR0,
5320 	.box_ctl		= ICX_C34_MSR_PMON_BOX_CTL,
5321 	.msr_offsets		= icx_cha_msr_offsets,
5322 	.event_mask		= HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
5323 	.event_mask_ext		= SNR_CHA_RAW_EVENT_MASK_EXT,
5324 	.constraints		= skx_uncore_chabox_constraints,
5325 	.ops			= &icx_uncore_chabox_ops,
5326 	.format_group		= &snr_uncore_chabox_format_group,
5327 };
5328 
5329 static unsigned icx_msr_offsets[] = {
5330 	0x0, 0x20, 0x40, 0x90, 0xb0, 0xd0,
5331 };
5332 
5333 static struct event_constraint icx_uncore_iio_constraints[] = {
5334 	UNCORE_EVENT_CONSTRAINT(0x02, 0x3),
5335 	UNCORE_EVENT_CONSTRAINT(0x03, 0x3),
5336 	UNCORE_EVENT_CONSTRAINT(0x83, 0x3),
5337 	UNCORE_EVENT_CONSTRAINT(0x88, 0xc),
5338 	UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
5339 	UNCORE_EVENT_CONSTRAINT(0xc5, 0xc),
5340 	UNCORE_EVENT_CONSTRAINT(0xd5, 0xc),
5341 	EVENT_CONSTRAINT_END
5342 };
5343 
5344 static umode_t
icx_iio_mapping_visible(struct kobject * kobj,struct attribute * attr,int die)5345 icx_iio_mapping_visible(struct kobject *kobj, struct attribute *attr, int die)
5346 {
5347 	/* Root bus 0x00 is valid only for pmu_idx = 5. */
5348 	return pmu_iio_mapping_visible(kobj, attr, die, 5);
5349 }
5350 
5351 static struct attribute_group icx_iio_mapping_group = {
5352 	.is_visible	= icx_iio_mapping_visible,
5353 };
5354 
5355 static const struct attribute_group *icx_iio_attr_update[] = {
5356 	&icx_iio_mapping_group,
5357 	NULL,
5358 };
5359 
5360 /*
5361  * ICX has a static mapping of stack IDs from SAD_CONTROL_CFG notation to PMON
5362  */
5363 enum {
5364 	ICX_PCIE1_PMON_ID,
5365 	ICX_PCIE2_PMON_ID,
5366 	ICX_PCIE3_PMON_ID,
5367 	ICX_PCIE4_PMON_ID,
5368 	ICX_PCIE5_PMON_ID,
5369 	ICX_CBDMA_DMI_PMON_ID
5370 };
5371 
5372 static u8 icx_sad_pmon_mapping[] = {
5373 	ICX_CBDMA_DMI_PMON_ID,
5374 	ICX_PCIE1_PMON_ID,
5375 	ICX_PCIE2_PMON_ID,
5376 	ICX_PCIE3_PMON_ID,
5377 	ICX_PCIE4_PMON_ID,
5378 	ICX_PCIE5_PMON_ID,
5379 };
5380 
icx_iio_get_topology(struct intel_uncore_type * type)5381 static int icx_iio_get_topology(struct intel_uncore_type *type)
5382 {
5383 	return sad_cfg_iio_topology(type, icx_sad_pmon_mapping);
5384 }
5385 
icx_iio_set_mapping(struct intel_uncore_type * type)5386 static void icx_iio_set_mapping(struct intel_uncore_type *type)
5387 {
5388 	/* Detect ICX-D system. This case is not supported */
5389 	if (boot_cpu_data.x86_model == INTEL_FAM6_ICELAKE_D) {
5390 		pmu_clear_mapping_attr(type->attr_update, &icx_iio_mapping_group);
5391 		return;
5392 	}
5393 	pmu_iio_set_mapping(type, &icx_iio_mapping_group);
5394 }
5395 
icx_iio_cleanup_mapping(struct intel_uncore_type * type)5396 static void icx_iio_cleanup_mapping(struct intel_uncore_type *type)
5397 {
5398 	pmu_cleanup_mapping(type, &icx_iio_mapping_group);
5399 }
5400 
5401 static struct intel_uncore_type icx_uncore_iio = {
5402 	.name			= "iio",
5403 	.num_counters		= 4,
5404 	.num_boxes		= 6,
5405 	.perf_ctr_bits		= 48,
5406 	.event_ctl		= ICX_IIO_MSR_PMON_CTL0,
5407 	.perf_ctr		= ICX_IIO_MSR_PMON_CTR0,
5408 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
5409 	.event_mask_ext		= SNR_IIO_PMON_RAW_EVENT_MASK_EXT,
5410 	.box_ctl		= ICX_IIO_MSR_PMON_BOX_CTL,
5411 	.msr_offsets		= icx_msr_offsets,
5412 	.constraints		= icx_uncore_iio_constraints,
5413 	.ops			= &skx_uncore_iio_ops,
5414 	.format_group		= &snr_uncore_iio_format_group,
5415 	.attr_update		= icx_iio_attr_update,
5416 	.get_topology		= icx_iio_get_topology,
5417 	.set_mapping		= icx_iio_set_mapping,
5418 	.cleanup_mapping	= icx_iio_cleanup_mapping,
5419 };
5420 
5421 static struct intel_uncore_type icx_uncore_irp = {
5422 	.name			= "irp",
5423 	.num_counters		= 2,
5424 	.num_boxes		= 6,
5425 	.perf_ctr_bits		= 48,
5426 	.event_ctl		= ICX_IRP0_MSR_PMON_CTL0,
5427 	.perf_ctr		= ICX_IRP0_MSR_PMON_CTR0,
5428 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
5429 	.box_ctl		= ICX_IRP0_MSR_PMON_BOX_CTL,
5430 	.msr_offsets		= icx_msr_offsets,
5431 	.ops			= &ivbep_uncore_msr_ops,
5432 	.format_group		= &ivbep_uncore_format_group,
5433 };
5434 
5435 static struct event_constraint icx_uncore_m2pcie_constraints[] = {
5436 	UNCORE_EVENT_CONSTRAINT(0x14, 0x3),
5437 	UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
5438 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
5439 	EVENT_CONSTRAINT_END
5440 };
5441 
5442 static struct intel_uncore_type icx_uncore_m2pcie = {
5443 	.name		= "m2pcie",
5444 	.num_counters	= 4,
5445 	.num_boxes	= 6,
5446 	.perf_ctr_bits	= 48,
5447 	.event_ctl	= ICX_M2PCIE_MSR_PMON_CTL0,
5448 	.perf_ctr	= ICX_M2PCIE_MSR_PMON_CTR0,
5449 	.box_ctl	= ICX_M2PCIE_MSR_PMON_BOX_CTL,
5450 	.msr_offsets	= icx_msr_offsets,
5451 	.constraints	= icx_uncore_m2pcie_constraints,
5452 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
5453 	.ops		= &ivbep_uncore_msr_ops,
5454 	.format_group	= &ivbep_uncore_format_group,
5455 };
5456 
5457 enum perf_uncore_icx_iio_freerunning_type_id {
5458 	ICX_IIO_MSR_IOCLK,
5459 	ICX_IIO_MSR_BW_IN,
5460 
5461 	ICX_IIO_FREERUNNING_TYPE_MAX,
5462 };
5463 
5464 static unsigned icx_iio_clk_freerunning_box_offsets[] = {
5465 	0x0, 0x20, 0x40, 0x90, 0xb0, 0xd0,
5466 };
5467 
5468 static unsigned icx_iio_bw_freerunning_box_offsets[] = {
5469 	0x0, 0x10, 0x20, 0x90, 0xa0, 0xb0,
5470 };
5471 
5472 static struct freerunning_counters icx_iio_freerunning[] = {
5473 	[ICX_IIO_MSR_IOCLK]	= { 0xa55, 0x1, 0x20, 1, 48, icx_iio_clk_freerunning_box_offsets },
5474 	[ICX_IIO_MSR_BW_IN]	= { 0xaa0, 0x1, 0x10, 8, 48, icx_iio_bw_freerunning_box_offsets },
5475 };
5476 
5477 static struct uncore_event_desc icx_uncore_iio_freerunning_events[] = {
5478 	/* Free-Running IIO CLOCKS Counter */
5479 	INTEL_UNCORE_EVENT_DESC(ioclk,			"event=0xff,umask=0x10"),
5480 	/* Free-Running IIO BANDWIDTH IN Counters */
5481 	INTEL_UNCORE_EVENT_DESC(bw_in_port0,		"event=0xff,umask=0x20"),
5482 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale,	"3.814697266e-6"),
5483 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit,	"MiB"),
5484 	INTEL_UNCORE_EVENT_DESC(bw_in_port1,		"event=0xff,umask=0x21"),
5485 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale,	"3.814697266e-6"),
5486 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit,	"MiB"),
5487 	INTEL_UNCORE_EVENT_DESC(bw_in_port2,		"event=0xff,umask=0x22"),
5488 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale,	"3.814697266e-6"),
5489 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit,	"MiB"),
5490 	INTEL_UNCORE_EVENT_DESC(bw_in_port3,		"event=0xff,umask=0x23"),
5491 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale,	"3.814697266e-6"),
5492 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit,	"MiB"),
5493 	INTEL_UNCORE_EVENT_DESC(bw_in_port4,		"event=0xff,umask=0x24"),
5494 	INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale,	"3.814697266e-6"),
5495 	INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit,	"MiB"),
5496 	INTEL_UNCORE_EVENT_DESC(bw_in_port5,		"event=0xff,umask=0x25"),
5497 	INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale,	"3.814697266e-6"),
5498 	INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit,	"MiB"),
5499 	INTEL_UNCORE_EVENT_DESC(bw_in_port6,		"event=0xff,umask=0x26"),
5500 	INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale,	"3.814697266e-6"),
5501 	INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit,	"MiB"),
5502 	INTEL_UNCORE_EVENT_DESC(bw_in_port7,		"event=0xff,umask=0x27"),
5503 	INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale,	"3.814697266e-6"),
5504 	INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit,	"MiB"),
5505 	{ /* end: all zeroes */ },
5506 };
5507 
5508 static struct intel_uncore_type icx_uncore_iio_free_running = {
5509 	.name			= "iio_free_running",
5510 	.num_counters		= 9,
5511 	.num_boxes		= 6,
5512 	.num_freerunning_types	= ICX_IIO_FREERUNNING_TYPE_MAX,
5513 	.freerunning		= icx_iio_freerunning,
5514 	.ops			= &skx_uncore_iio_freerunning_ops,
5515 	.event_descs		= icx_uncore_iio_freerunning_events,
5516 	.format_group		= &skx_uncore_iio_freerunning_format_group,
5517 };
5518 
5519 static struct intel_uncore_type *icx_msr_uncores[] = {
5520 	&skx_uncore_ubox,
5521 	&icx_uncore_chabox,
5522 	&icx_uncore_iio,
5523 	&icx_uncore_irp,
5524 	&icx_uncore_m2pcie,
5525 	&skx_uncore_pcu,
5526 	&icx_uncore_iio_free_running,
5527 	NULL,
5528 };
5529 
5530 /*
5531  * To determine the number of CHAs, it should read CAPID6(Low) and CAPID7 (High)
5532  * registers which located at Device 30, Function 3
5533  */
5534 #define ICX_CAPID6		0x9c
5535 #define ICX_CAPID7		0xa0
5536 
icx_count_chabox(void)5537 static u64 icx_count_chabox(void)
5538 {
5539 	struct pci_dev *dev = NULL;
5540 	u64 caps = 0;
5541 
5542 	dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x345b, dev);
5543 	if (!dev)
5544 		goto out;
5545 
5546 	pci_read_config_dword(dev, ICX_CAPID6, (u32 *)&caps);
5547 	pci_read_config_dword(dev, ICX_CAPID7, (u32 *)&caps + 1);
5548 out:
5549 	pci_dev_put(dev);
5550 	return hweight64(caps);
5551 }
5552 
icx_uncore_cpu_init(void)5553 void icx_uncore_cpu_init(void)
5554 {
5555 	u64 num_boxes = icx_count_chabox();
5556 
5557 	if (WARN_ON(num_boxes > ARRAY_SIZE(icx_cha_msr_offsets)))
5558 		return;
5559 	icx_uncore_chabox.num_boxes = num_boxes;
5560 	uncore_msr_uncores = icx_msr_uncores;
5561 }
5562 
5563 static struct intel_uncore_type icx_uncore_m2m = {
5564 	.name		= "m2m",
5565 	.num_counters   = 4,
5566 	.num_boxes	= 4,
5567 	.perf_ctr_bits	= 48,
5568 	.perf_ctr	= SNR_M2M_PCI_PMON_CTR0,
5569 	.event_ctl	= SNR_M2M_PCI_PMON_CTL0,
5570 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
5571 	.event_mask_ext	= SNR_M2M_PCI_PMON_UMASK_EXT,
5572 	.box_ctl	= SNR_M2M_PCI_PMON_BOX_CTL,
5573 	.ops		= &snr_m2m_uncore_pci_ops,
5574 	.format_group	= &snr_m2m_uncore_format_group,
5575 };
5576 
5577 static struct attribute *icx_upi_uncore_formats_attr[] = {
5578 	&format_attr_event.attr,
5579 	&format_attr_umask_ext4.attr,
5580 	&format_attr_edge.attr,
5581 	&format_attr_inv.attr,
5582 	&format_attr_thresh8.attr,
5583 	NULL,
5584 };
5585 
5586 static const struct attribute_group icx_upi_uncore_format_group = {
5587 	.name = "format",
5588 	.attrs = icx_upi_uncore_formats_attr,
5589 };
5590 
5591 #define ICX_UPI_REGS_ADDR_DEVICE_LINK0	0x02
5592 #define ICX_UPI_REGS_ADDR_FUNCTION	0x01
5593 
discover_upi_topology(struct intel_uncore_type * type,int ubox_did,int dev_link0)5594 static int discover_upi_topology(struct intel_uncore_type *type, int ubox_did, int dev_link0)
5595 {
5596 	struct pci_dev *ubox = NULL;
5597 	struct pci_dev *dev = NULL;
5598 	u32 nid, gid;
5599 	int i, idx, ret = -EPERM;
5600 	struct intel_uncore_topology *upi;
5601 	unsigned int devfn;
5602 
5603 	/* GIDNIDMAP method supports machines which have less than 8 sockets. */
5604 	if (uncore_max_dies() > 8)
5605 		goto err;
5606 
5607 	while ((ubox = pci_get_device(PCI_VENDOR_ID_INTEL, ubox_did, ubox))) {
5608 		ret = upi_nodeid_groupid(ubox, SKX_CPUNODEID, SKX_GIDNIDMAP, &nid, &gid);
5609 		if (ret) {
5610 			ret = pcibios_err_to_errno(ret);
5611 			break;
5612 		}
5613 
5614 		for (i = 0; i < 8; i++) {
5615 			if (nid != GIDNIDMAP(gid, i))
5616 				continue;
5617 			for (idx = 0; idx < type->num_boxes; idx++) {
5618 				upi = &type->topology[nid][idx];
5619 				devfn = PCI_DEVFN(dev_link0 + idx, ICX_UPI_REGS_ADDR_FUNCTION);
5620 				dev = pci_get_domain_bus_and_slot(pci_domain_nr(ubox->bus),
5621 								  ubox->bus->number,
5622 								  devfn);
5623 				if (dev) {
5624 					ret = upi_fill_topology(dev, upi, idx);
5625 					if (ret)
5626 						goto err;
5627 				}
5628 			}
5629 		}
5630 	}
5631 err:
5632 	pci_dev_put(ubox);
5633 	pci_dev_put(dev);
5634 	return ret;
5635 }
5636 
icx_upi_get_topology(struct intel_uncore_type * type)5637 static int icx_upi_get_topology(struct intel_uncore_type *type)
5638 {
5639 	return discover_upi_topology(type, ICX_UBOX_DID, ICX_UPI_REGS_ADDR_DEVICE_LINK0);
5640 }
5641 
5642 static struct attribute_group icx_upi_mapping_group = {
5643 	.is_visible	= skx_upi_mapping_visible,
5644 };
5645 
5646 static const struct attribute_group *icx_upi_attr_update[] = {
5647 	&icx_upi_mapping_group,
5648 	NULL
5649 };
5650 
icx_upi_set_mapping(struct intel_uncore_type * type)5651 static void icx_upi_set_mapping(struct intel_uncore_type *type)
5652 {
5653 	pmu_upi_set_mapping(type, &icx_upi_mapping_group);
5654 }
5655 
icx_upi_cleanup_mapping(struct intel_uncore_type * type)5656 static void icx_upi_cleanup_mapping(struct intel_uncore_type *type)
5657 {
5658 	pmu_cleanup_mapping(type, &icx_upi_mapping_group);
5659 }
5660 
5661 static struct intel_uncore_type icx_uncore_upi = {
5662 	.name		= "upi",
5663 	.num_counters   = 4,
5664 	.num_boxes	= 3,
5665 	.perf_ctr_bits	= 48,
5666 	.perf_ctr	= ICX_UPI_PCI_PMON_CTR0,
5667 	.event_ctl	= ICX_UPI_PCI_PMON_CTL0,
5668 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
5669 	.event_mask_ext = ICX_UPI_CTL_UMASK_EXT,
5670 	.box_ctl	= ICX_UPI_PCI_PMON_BOX_CTL,
5671 	.ops		= &skx_upi_uncore_pci_ops,
5672 	.format_group	= &icx_upi_uncore_format_group,
5673 	.attr_update	= icx_upi_attr_update,
5674 	.get_topology	= icx_upi_get_topology,
5675 	.set_mapping	= icx_upi_set_mapping,
5676 	.cleanup_mapping = icx_upi_cleanup_mapping,
5677 };
5678 
5679 static struct event_constraint icx_uncore_m3upi_constraints[] = {
5680 	UNCORE_EVENT_CONSTRAINT(0x1c, 0x1),
5681 	UNCORE_EVENT_CONSTRAINT(0x1d, 0x1),
5682 	UNCORE_EVENT_CONSTRAINT(0x1e, 0x1),
5683 	UNCORE_EVENT_CONSTRAINT(0x1f, 0x1),
5684 	UNCORE_EVENT_CONSTRAINT(0x40, 0x7),
5685 	UNCORE_EVENT_CONSTRAINT(0x4e, 0x7),
5686 	UNCORE_EVENT_CONSTRAINT(0x4f, 0x7),
5687 	UNCORE_EVENT_CONSTRAINT(0x50, 0x7),
5688 	EVENT_CONSTRAINT_END
5689 };
5690 
5691 static struct intel_uncore_type icx_uncore_m3upi = {
5692 	.name		= "m3upi",
5693 	.num_counters   = 4,
5694 	.num_boxes	= 3,
5695 	.perf_ctr_bits	= 48,
5696 	.perf_ctr	= ICX_M3UPI_PCI_PMON_CTR0,
5697 	.event_ctl	= ICX_M3UPI_PCI_PMON_CTL0,
5698 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
5699 	.box_ctl	= ICX_M3UPI_PCI_PMON_BOX_CTL,
5700 	.constraints	= icx_uncore_m3upi_constraints,
5701 	.ops		= &ivbep_uncore_pci_ops,
5702 	.format_group	= &skx_uncore_format_group,
5703 };
5704 
5705 enum {
5706 	ICX_PCI_UNCORE_M2M,
5707 	ICX_PCI_UNCORE_UPI,
5708 	ICX_PCI_UNCORE_M3UPI,
5709 };
5710 
5711 static struct intel_uncore_type *icx_pci_uncores[] = {
5712 	[ICX_PCI_UNCORE_M2M]		= &icx_uncore_m2m,
5713 	[ICX_PCI_UNCORE_UPI]		= &icx_uncore_upi,
5714 	[ICX_PCI_UNCORE_M3UPI]		= &icx_uncore_m3upi,
5715 	NULL,
5716 };
5717 
5718 static const struct pci_device_id icx_uncore_pci_ids[] = {
5719 	{ /* M2M 0 */
5720 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
5721 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, ICX_PCI_UNCORE_M2M, 0),
5722 	},
5723 	{ /* M2M 1 */
5724 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
5725 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(13, 0, ICX_PCI_UNCORE_M2M, 1),
5726 	},
5727 	{ /* M2M 2 */
5728 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
5729 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(14, 0, ICX_PCI_UNCORE_M2M, 2),
5730 	},
5731 	{ /* M2M 3 */
5732 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
5733 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(15, 0, ICX_PCI_UNCORE_M2M, 3),
5734 	},
5735 	{ /* UPI Link 0 */
5736 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3441),
5737 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(2, 1, ICX_PCI_UNCORE_UPI, 0),
5738 	},
5739 	{ /* UPI Link 1 */
5740 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3441),
5741 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(3, 1, ICX_PCI_UNCORE_UPI, 1),
5742 	},
5743 	{ /* UPI Link 2 */
5744 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3441),
5745 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(4, 1, ICX_PCI_UNCORE_UPI, 2),
5746 	},
5747 	{ /* M3UPI Link 0 */
5748 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3446),
5749 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(5, 1, ICX_PCI_UNCORE_M3UPI, 0),
5750 	},
5751 	{ /* M3UPI Link 1 */
5752 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3446),
5753 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(6, 1, ICX_PCI_UNCORE_M3UPI, 1),
5754 	},
5755 	{ /* M3UPI Link 2 */
5756 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3446),
5757 		.driver_data = UNCORE_PCI_DEV_FULL_DATA(7, 1, ICX_PCI_UNCORE_M3UPI, 2),
5758 	},
5759 	{ /* end: all zeroes */ }
5760 };
5761 
5762 static struct pci_driver icx_uncore_pci_driver = {
5763 	.name		= "icx_uncore",
5764 	.id_table	= icx_uncore_pci_ids,
5765 };
5766 
icx_uncore_pci_init(void)5767 int icx_uncore_pci_init(void)
5768 {
5769 	/* ICX UBOX DID */
5770 	int ret = snbep_pci2phy_map_init(0x3450, SKX_CPUNODEID,
5771 					 SKX_GIDNIDMAP, true);
5772 
5773 	if (ret)
5774 		return ret;
5775 
5776 	uncore_pci_uncores = icx_pci_uncores;
5777 	uncore_pci_driver = &icx_uncore_pci_driver;
5778 	return 0;
5779 }
5780 
icx_uncore_imc_init_box(struct intel_uncore_box * box)5781 static void icx_uncore_imc_init_box(struct intel_uncore_box *box)
5782 {
5783 	unsigned int box_ctl = box->pmu->type->box_ctl +
5784 			       box->pmu->type->mmio_offset * (box->pmu->pmu_idx % ICX_NUMBER_IMC_CHN);
5785 	int mem_offset = (box->pmu->pmu_idx / ICX_NUMBER_IMC_CHN) * ICX_IMC_MEM_STRIDE +
5786 			 SNR_IMC_MMIO_MEM0_OFFSET;
5787 
5788 	__snr_uncore_mmio_init_box(box, box_ctl, mem_offset,
5789 				   SNR_MC_DEVICE_ID);
5790 }
5791 
5792 static struct intel_uncore_ops icx_uncore_mmio_ops = {
5793 	.init_box	= icx_uncore_imc_init_box,
5794 	.exit_box	= uncore_mmio_exit_box,
5795 	.disable_box	= snr_uncore_mmio_disable_box,
5796 	.enable_box	= snr_uncore_mmio_enable_box,
5797 	.disable_event	= snr_uncore_mmio_disable_event,
5798 	.enable_event	= snr_uncore_mmio_enable_event,
5799 	.read_counter	= uncore_mmio_read_counter,
5800 };
5801 
5802 static struct intel_uncore_type icx_uncore_imc = {
5803 	.name		= "imc",
5804 	.num_counters   = 4,
5805 	.num_boxes	= 12,
5806 	.perf_ctr_bits	= 48,
5807 	.fixed_ctr_bits	= 48,
5808 	.fixed_ctr	= SNR_IMC_MMIO_PMON_FIXED_CTR,
5809 	.fixed_ctl	= SNR_IMC_MMIO_PMON_FIXED_CTL,
5810 	.event_descs	= snr_uncore_imc_events,
5811 	.perf_ctr	= SNR_IMC_MMIO_PMON_CTR0,
5812 	.event_ctl	= SNR_IMC_MMIO_PMON_CTL0,
5813 	.event_mask	= SNBEP_PMON_RAW_EVENT_MASK,
5814 	.box_ctl	= SNR_IMC_MMIO_PMON_BOX_CTL,
5815 	.mmio_offset	= SNR_IMC_MMIO_OFFSET,
5816 	.mmio_map_size	= SNR_IMC_MMIO_SIZE,
5817 	.ops		= &icx_uncore_mmio_ops,
5818 	.format_group	= &skx_uncore_format_group,
5819 };
5820 
5821 enum perf_uncore_icx_imc_freerunning_type_id {
5822 	ICX_IMC_DCLK,
5823 	ICX_IMC_DDR,
5824 	ICX_IMC_DDRT,
5825 
5826 	ICX_IMC_FREERUNNING_TYPE_MAX,
5827 };
5828 
5829 static struct freerunning_counters icx_imc_freerunning[] = {
5830 	[ICX_IMC_DCLK]	= { 0x22b0, 0x0, 0, 1, 48 },
5831 	[ICX_IMC_DDR]	= { 0x2290, 0x8, 0, 2, 48 },
5832 	[ICX_IMC_DDRT]	= { 0x22a0, 0x8, 0, 2, 48 },
5833 };
5834 
5835 static struct uncore_event_desc icx_uncore_imc_freerunning_events[] = {
5836 	INTEL_UNCORE_EVENT_DESC(dclk,			"event=0xff,umask=0x10"),
5837 
5838 	INTEL_UNCORE_EVENT_DESC(read,			"event=0xff,umask=0x20"),
5839 	INTEL_UNCORE_EVENT_DESC(read.scale,		"6.103515625e-5"),
5840 	INTEL_UNCORE_EVENT_DESC(read.unit,		"MiB"),
5841 	INTEL_UNCORE_EVENT_DESC(write,			"event=0xff,umask=0x21"),
5842 	INTEL_UNCORE_EVENT_DESC(write.scale,		"6.103515625e-5"),
5843 	INTEL_UNCORE_EVENT_DESC(write.unit,		"MiB"),
5844 
5845 	INTEL_UNCORE_EVENT_DESC(ddrt_read,		"event=0xff,umask=0x30"),
5846 	INTEL_UNCORE_EVENT_DESC(ddrt_read.scale,	"6.103515625e-5"),
5847 	INTEL_UNCORE_EVENT_DESC(ddrt_read.unit,		"MiB"),
5848 	INTEL_UNCORE_EVENT_DESC(ddrt_write,		"event=0xff,umask=0x31"),
5849 	INTEL_UNCORE_EVENT_DESC(ddrt_write.scale,	"6.103515625e-5"),
5850 	INTEL_UNCORE_EVENT_DESC(ddrt_write.unit,	"MiB"),
5851 	{ /* end: all zeroes */ },
5852 };
5853 
icx_uncore_imc_freerunning_init_box(struct intel_uncore_box * box)5854 static void icx_uncore_imc_freerunning_init_box(struct intel_uncore_box *box)
5855 {
5856 	int mem_offset = box->pmu->pmu_idx * ICX_IMC_MEM_STRIDE +
5857 			 SNR_IMC_MMIO_MEM0_OFFSET;
5858 
5859 	snr_uncore_mmio_map(box, uncore_mmio_box_ctl(box),
5860 			    mem_offset, SNR_MC_DEVICE_ID);
5861 }
5862 
5863 static struct intel_uncore_ops icx_uncore_imc_freerunning_ops = {
5864 	.init_box	= icx_uncore_imc_freerunning_init_box,
5865 	.exit_box	= uncore_mmio_exit_box,
5866 	.read_counter	= uncore_mmio_read_counter,
5867 	.hw_config	= uncore_freerunning_hw_config,
5868 };
5869 
5870 static struct intel_uncore_type icx_uncore_imc_free_running = {
5871 	.name			= "imc_free_running",
5872 	.num_counters		= 5,
5873 	.num_boxes		= 4,
5874 	.num_freerunning_types	= ICX_IMC_FREERUNNING_TYPE_MAX,
5875 	.mmio_map_size		= SNR_IMC_MMIO_SIZE,
5876 	.freerunning		= icx_imc_freerunning,
5877 	.ops			= &icx_uncore_imc_freerunning_ops,
5878 	.event_descs		= icx_uncore_imc_freerunning_events,
5879 	.format_group		= &skx_uncore_iio_freerunning_format_group,
5880 };
5881 
5882 static struct intel_uncore_type *icx_mmio_uncores[] = {
5883 	&icx_uncore_imc,
5884 	&icx_uncore_imc_free_running,
5885 	NULL,
5886 };
5887 
icx_uncore_mmio_init(void)5888 void icx_uncore_mmio_init(void)
5889 {
5890 	uncore_mmio_uncores = icx_mmio_uncores;
5891 }
5892 
5893 /* end of ICX uncore support */
5894 
5895 /* SPR uncore support */
5896 
spr_uncore_msr_enable_event(struct intel_uncore_box * box,struct perf_event * event)5897 static void spr_uncore_msr_enable_event(struct intel_uncore_box *box,
5898 					struct perf_event *event)
5899 {
5900 	struct hw_perf_event *hwc = &event->hw;
5901 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
5902 
5903 	if (reg1->idx != EXTRA_REG_NONE)
5904 		wrmsrl(reg1->reg, reg1->config);
5905 
5906 	wrmsrl(hwc->config_base, hwc->config);
5907 }
5908 
spr_uncore_msr_disable_event(struct intel_uncore_box * box,struct perf_event * event)5909 static void spr_uncore_msr_disable_event(struct intel_uncore_box *box,
5910 					 struct perf_event *event)
5911 {
5912 	struct hw_perf_event *hwc = &event->hw;
5913 	struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
5914 
5915 	if (reg1->idx != EXTRA_REG_NONE)
5916 		wrmsrl(reg1->reg, 0);
5917 
5918 	wrmsrl(hwc->config_base, 0);
5919 }
5920 
spr_cha_hw_config(struct intel_uncore_box * box,struct perf_event * event)5921 static int spr_cha_hw_config(struct intel_uncore_box *box, struct perf_event *event)
5922 {
5923 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
5924 	bool tie_en = !!(event->hw.config & SPR_CHA_PMON_CTL_TID_EN);
5925 	struct intel_uncore_type *type = box->pmu->type;
5926 
5927 	if (tie_en) {
5928 		reg1->reg = SPR_C0_MSR_PMON_BOX_FILTER0 +
5929 			    HSWEP_CBO_MSR_OFFSET * type->box_ids[box->pmu->pmu_idx];
5930 		reg1->config = event->attr.config1 & SPR_CHA_PMON_BOX_FILTER_TID;
5931 		reg1->idx = 0;
5932 	}
5933 
5934 	return 0;
5935 }
5936 
5937 static struct intel_uncore_ops spr_uncore_chabox_ops = {
5938 	.init_box		= intel_generic_uncore_msr_init_box,
5939 	.disable_box		= intel_generic_uncore_msr_disable_box,
5940 	.enable_box		= intel_generic_uncore_msr_enable_box,
5941 	.disable_event		= spr_uncore_msr_disable_event,
5942 	.enable_event		= spr_uncore_msr_enable_event,
5943 	.read_counter		= uncore_msr_read_counter,
5944 	.hw_config		= spr_cha_hw_config,
5945 	.get_constraint		= uncore_get_constraint,
5946 	.put_constraint		= uncore_put_constraint,
5947 };
5948 
5949 static struct attribute *spr_uncore_cha_formats_attr[] = {
5950 	&format_attr_event.attr,
5951 	&format_attr_umask_ext4.attr,
5952 	&format_attr_tid_en2.attr,
5953 	&format_attr_edge.attr,
5954 	&format_attr_inv.attr,
5955 	&format_attr_thresh8.attr,
5956 	&format_attr_filter_tid5.attr,
5957 	NULL,
5958 };
5959 static const struct attribute_group spr_uncore_chabox_format_group = {
5960 	.name = "format",
5961 	.attrs = spr_uncore_cha_formats_attr,
5962 };
5963 
alias_show(struct device * dev,struct device_attribute * attr,char * buf)5964 static ssize_t alias_show(struct device *dev,
5965 			  struct device_attribute *attr,
5966 			  char *buf)
5967 {
5968 	struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(dev);
5969 	char pmu_name[UNCORE_PMU_NAME_LEN];
5970 
5971 	uncore_get_alias_name(pmu_name, pmu);
5972 	return sysfs_emit(buf, "%s\n", pmu_name);
5973 }
5974 
5975 static DEVICE_ATTR_RO(alias);
5976 
5977 static struct attribute *uncore_alias_attrs[] = {
5978 	&dev_attr_alias.attr,
5979 	NULL
5980 };
5981 
5982 ATTRIBUTE_GROUPS(uncore_alias);
5983 
5984 static struct intel_uncore_type spr_uncore_chabox = {
5985 	.name			= "cha",
5986 	.event_mask		= SPR_CHA_PMON_EVENT_MASK,
5987 	.event_mask_ext		= SPR_RAW_EVENT_MASK_EXT,
5988 	.num_shared_regs	= 1,
5989 	.constraints		= skx_uncore_chabox_constraints,
5990 	.ops			= &spr_uncore_chabox_ops,
5991 	.format_group		= &spr_uncore_chabox_format_group,
5992 	.attr_update		= uncore_alias_groups,
5993 };
5994 
5995 static struct intel_uncore_type spr_uncore_iio = {
5996 	.name			= "iio",
5997 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
5998 	.event_mask_ext		= SNR_IIO_PMON_RAW_EVENT_MASK_EXT,
5999 	.format_group		= &snr_uncore_iio_format_group,
6000 	.attr_update		= uncore_alias_groups,
6001 	.constraints		= icx_uncore_iio_constraints,
6002 };
6003 
6004 static struct attribute *spr_uncore_raw_formats_attr[] = {
6005 	&format_attr_event.attr,
6006 	&format_attr_umask_ext4.attr,
6007 	&format_attr_edge.attr,
6008 	&format_attr_inv.attr,
6009 	&format_attr_thresh8.attr,
6010 	NULL,
6011 };
6012 
6013 static const struct attribute_group spr_uncore_raw_format_group = {
6014 	.name			= "format",
6015 	.attrs			= spr_uncore_raw_formats_attr,
6016 };
6017 
6018 #define SPR_UNCORE_COMMON_FORMAT()				\
6019 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,	\
6020 	.event_mask_ext		= SPR_RAW_EVENT_MASK_EXT,	\
6021 	.format_group		= &spr_uncore_raw_format_group,	\
6022 	.attr_update		= uncore_alias_groups
6023 
6024 static struct intel_uncore_type spr_uncore_irp = {
6025 	SPR_UNCORE_COMMON_FORMAT(),
6026 	.name			= "irp",
6027 
6028 };
6029 
6030 static struct event_constraint spr_uncore_m2pcie_constraints[] = {
6031 	UNCORE_EVENT_CONSTRAINT(0x14, 0x3),
6032 	UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
6033 	EVENT_CONSTRAINT_END
6034 };
6035 
6036 static struct intel_uncore_type spr_uncore_m2pcie = {
6037 	SPR_UNCORE_COMMON_FORMAT(),
6038 	.name			= "m2pcie",
6039 	.constraints		= spr_uncore_m2pcie_constraints,
6040 };
6041 
6042 static struct intel_uncore_type spr_uncore_pcu = {
6043 	.name			= "pcu",
6044 	.attr_update		= uncore_alias_groups,
6045 };
6046 
spr_uncore_mmio_enable_event(struct intel_uncore_box * box,struct perf_event * event)6047 static void spr_uncore_mmio_enable_event(struct intel_uncore_box *box,
6048 					 struct perf_event *event)
6049 {
6050 	struct hw_perf_event *hwc = &event->hw;
6051 
6052 	if (!box->io_addr)
6053 		return;
6054 
6055 	if (uncore_pmc_fixed(hwc->idx))
6056 		writel(SNBEP_PMON_CTL_EN, box->io_addr + hwc->config_base);
6057 	else
6058 		writel(hwc->config, box->io_addr + hwc->config_base);
6059 }
6060 
6061 static struct intel_uncore_ops spr_uncore_mmio_ops = {
6062 	.init_box		= intel_generic_uncore_mmio_init_box,
6063 	.exit_box		= uncore_mmio_exit_box,
6064 	.disable_box		= intel_generic_uncore_mmio_disable_box,
6065 	.enable_box		= intel_generic_uncore_mmio_enable_box,
6066 	.disable_event		= intel_generic_uncore_mmio_disable_event,
6067 	.enable_event		= spr_uncore_mmio_enable_event,
6068 	.read_counter		= uncore_mmio_read_counter,
6069 };
6070 
6071 static struct uncore_event_desc spr_uncore_imc_events[] = {
6072 	INTEL_UNCORE_EVENT_DESC(clockticks,      "event=0x01,umask=0x00"),
6073 	INTEL_UNCORE_EVENT_DESC(cas_count_read,  "event=0x05,umask=0xcf"),
6074 	INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
6075 	INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
6076 	INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x05,umask=0xf0"),
6077 	INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
6078 	INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
6079 	{ /* end: all zeroes */ },
6080 };
6081 
6082 static struct intel_uncore_type spr_uncore_imc = {
6083 	SPR_UNCORE_COMMON_FORMAT(),
6084 	.name			= "imc",
6085 	.fixed_ctr_bits		= 48,
6086 	.fixed_ctr		= SNR_IMC_MMIO_PMON_FIXED_CTR,
6087 	.fixed_ctl		= SNR_IMC_MMIO_PMON_FIXED_CTL,
6088 	.ops			= &spr_uncore_mmio_ops,
6089 	.event_descs		= spr_uncore_imc_events,
6090 };
6091 
spr_uncore_pci_enable_event(struct intel_uncore_box * box,struct perf_event * event)6092 static void spr_uncore_pci_enable_event(struct intel_uncore_box *box,
6093 					struct perf_event *event)
6094 {
6095 	struct pci_dev *pdev = box->pci_dev;
6096 	struct hw_perf_event *hwc = &event->hw;
6097 
6098 	pci_write_config_dword(pdev, hwc->config_base + 4, (u32)(hwc->config >> 32));
6099 	pci_write_config_dword(pdev, hwc->config_base, (u32)hwc->config);
6100 }
6101 
6102 static struct intel_uncore_ops spr_uncore_pci_ops = {
6103 	.init_box		= intel_generic_uncore_pci_init_box,
6104 	.disable_box		= intel_generic_uncore_pci_disable_box,
6105 	.enable_box		= intel_generic_uncore_pci_enable_box,
6106 	.disable_event		= intel_generic_uncore_pci_disable_event,
6107 	.enable_event		= spr_uncore_pci_enable_event,
6108 	.read_counter		= intel_generic_uncore_pci_read_counter,
6109 };
6110 
6111 #define SPR_UNCORE_PCI_COMMON_FORMAT()			\
6112 	SPR_UNCORE_COMMON_FORMAT(),			\
6113 	.ops			= &spr_uncore_pci_ops
6114 
6115 static struct intel_uncore_type spr_uncore_m2m = {
6116 	SPR_UNCORE_PCI_COMMON_FORMAT(),
6117 	.name			= "m2m",
6118 };
6119 
6120 static struct attribute_group spr_upi_mapping_group = {
6121 	.is_visible	= skx_upi_mapping_visible,
6122 };
6123 
6124 static const struct attribute_group *spr_upi_attr_update[] = {
6125 	&uncore_alias_group,
6126 	&spr_upi_mapping_group,
6127 	NULL
6128 };
6129 
6130 #define SPR_UPI_REGS_ADDR_DEVICE_LINK0	0x01
6131 
spr_upi_set_mapping(struct intel_uncore_type * type)6132 static void spr_upi_set_mapping(struct intel_uncore_type *type)
6133 {
6134 	pmu_upi_set_mapping(type, &spr_upi_mapping_group);
6135 }
6136 
spr_upi_cleanup_mapping(struct intel_uncore_type * type)6137 static void spr_upi_cleanup_mapping(struct intel_uncore_type *type)
6138 {
6139 	pmu_cleanup_mapping(type, &spr_upi_mapping_group);
6140 }
6141 
spr_upi_get_topology(struct intel_uncore_type * type)6142 static int spr_upi_get_topology(struct intel_uncore_type *type)
6143 {
6144 	return discover_upi_topology(type, SPR_UBOX_DID, SPR_UPI_REGS_ADDR_DEVICE_LINK0);
6145 }
6146 
6147 static struct intel_uncore_type spr_uncore_mdf = {
6148 	SPR_UNCORE_COMMON_FORMAT(),
6149 	.name			= "mdf",
6150 };
6151 
6152 #define UNCORE_SPR_NUM_UNCORE_TYPES		12
6153 #define UNCORE_SPR_CHA				0
6154 #define UNCORE_SPR_IIO				1
6155 #define UNCORE_SPR_IMC				6
6156 #define UNCORE_SPR_UPI				8
6157 #define UNCORE_SPR_M3UPI			9
6158 
6159 /*
6160  * The uncore units, which are supported by the discovery table,
6161  * are defined here.
6162  */
6163 static struct intel_uncore_type *spr_uncores[UNCORE_SPR_NUM_UNCORE_TYPES] = {
6164 	&spr_uncore_chabox,
6165 	&spr_uncore_iio,
6166 	&spr_uncore_irp,
6167 	&spr_uncore_m2pcie,
6168 	&spr_uncore_pcu,
6169 	NULL,
6170 	&spr_uncore_imc,
6171 	&spr_uncore_m2m,
6172 	NULL,
6173 	NULL,
6174 	NULL,
6175 	&spr_uncore_mdf,
6176 };
6177 
6178 /*
6179  * The uncore units, which are not supported by the discovery table,
6180  * are implemented from here.
6181  */
6182 #define SPR_UNCORE_UPI_NUM_BOXES	4
6183 
6184 static unsigned int spr_upi_pci_offsets[SPR_UNCORE_UPI_NUM_BOXES] = {
6185 	0, 0x8000, 0x10000, 0x18000
6186 };
6187 
6188 static struct intel_uncore_type spr_uncore_upi = {
6189 	.event_mask		= SNBEP_PMON_RAW_EVENT_MASK,
6190 	.event_mask_ext		= SPR_RAW_EVENT_MASK_EXT,
6191 	.format_group		= &spr_uncore_raw_format_group,
6192 	.ops			= &spr_uncore_pci_ops,
6193 	.name			= "upi",
6194 	.attr_update		= spr_upi_attr_update,
6195 	.get_topology		= spr_upi_get_topology,
6196 	.set_mapping		= spr_upi_set_mapping,
6197 	.cleanup_mapping	= spr_upi_cleanup_mapping,
6198 	.type_id		= UNCORE_SPR_UPI,
6199 	.num_counters		= 4,
6200 	.num_boxes		= SPR_UNCORE_UPI_NUM_BOXES,
6201 	.perf_ctr_bits		= 48,
6202 	.perf_ctr		= ICX_UPI_PCI_PMON_CTR0,
6203 	.event_ctl		= ICX_UPI_PCI_PMON_CTL0,
6204 	.box_ctl		= ICX_UPI_PCI_PMON_BOX_CTL,
6205 	.pci_offsets		= spr_upi_pci_offsets,
6206 };
6207 
6208 static struct intel_uncore_type spr_uncore_m3upi = {
6209 	SPR_UNCORE_PCI_COMMON_FORMAT(),
6210 	.name			= "m3upi",
6211 	.type_id		= UNCORE_SPR_M3UPI,
6212 	.num_counters		= 4,
6213 	.num_boxes		= SPR_UNCORE_UPI_NUM_BOXES,
6214 	.perf_ctr_bits		= 48,
6215 	.perf_ctr		= ICX_M3UPI_PCI_PMON_CTR0,
6216 	.event_ctl		= ICX_M3UPI_PCI_PMON_CTL0,
6217 	.box_ctl		= ICX_M3UPI_PCI_PMON_BOX_CTL,
6218 	.pci_offsets		= spr_upi_pci_offsets,
6219 	.constraints		= icx_uncore_m3upi_constraints,
6220 };
6221 
6222 enum perf_uncore_spr_iio_freerunning_type_id {
6223 	SPR_IIO_MSR_IOCLK,
6224 	SPR_IIO_MSR_BW_IN,
6225 	SPR_IIO_MSR_BW_OUT,
6226 
6227 	SPR_IIO_FREERUNNING_TYPE_MAX,
6228 };
6229 
6230 static struct freerunning_counters spr_iio_freerunning[] = {
6231 	[SPR_IIO_MSR_IOCLK]	= { 0x340e, 0x1, 0x10, 1, 48 },
6232 	[SPR_IIO_MSR_BW_IN]	= { 0x3800, 0x1, 0x10, 8, 48 },
6233 	[SPR_IIO_MSR_BW_OUT]	= { 0x3808, 0x1, 0x10, 8, 48 },
6234 };
6235 
6236 static struct uncore_event_desc spr_uncore_iio_freerunning_events[] = {
6237 	/* Free-Running IIO CLOCKS Counter */
6238 	INTEL_UNCORE_EVENT_DESC(ioclk,			"event=0xff,umask=0x10"),
6239 	/* Free-Running IIO BANDWIDTH IN Counters */
6240 	INTEL_UNCORE_EVENT_DESC(bw_in_port0,		"event=0xff,umask=0x20"),
6241 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale,	"3.814697266e-6"),
6242 	INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit,	"MiB"),
6243 	INTEL_UNCORE_EVENT_DESC(bw_in_port1,		"event=0xff,umask=0x21"),
6244 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale,	"3.814697266e-6"),
6245 	INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit,	"MiB"),
6246 	INTEL_UNCORE_EVENT_DESC(bw_in_port2,		"event=0xff,umask=0x22"),
6247 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale,	"3.814697266e-6"),
6248 	INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit,	"MiB"),
6249 	INTEL_UNCORE_EVENT_DESC(bw_in_port3,		"event=0xff,umask=0x23"),
6250 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale,	"3.814697266e-6"),
6251 	INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit,	"MiB"),
6252 	INTEL_UNCORE_EVENT_DESC(bw_in_port4,		"event=0xff,umask=0x24"),
6253 	INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale,	"3.814697266e-6"),
6254 	INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit,	"MiB"),
6255 	INTEL_UNCORE_EVENT_DESC(bw_in_port5,		"event=0xff,umask=0x25"),
6256 	INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale,	"3.814697266e-6"),
6257 	INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit,	"MiB"),
6258 	INTEL_UNCORE_EVENT_DESC(bw_in_port6,		"event=0xff,umask=0x26"),
6259 	INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale,	"3.814697266e-6"),
6260 	INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit,	"MiB"),
6261 	INTEL_UNCORE_EVENT_DESC(bw_in_port7,		"event=0xff,umask=0x27"),
6262 	INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale,	"3.814697266e-6"),
6263 	INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit,	"MiB"),
6264 	/* Free-Running IIO BANDWIDTH OUT Counters */
6265 	INTEL_UNCORE_EVENT_DESC(bw_out_port0,		"event=0xff,umask=0x30"),
6266 	INTEL_UNCORE_EVENT_DESC(bw_out_port0.scale,	"3.814697266e-6"),
6267 	INTEL_UNCORE_EVENT_DESC(bw_out_port0.unit,	"MiB"),
6268 	INTEL_UNCORE_EVENT_DESC(bw_out_port1,		"event=0xff,umask=0x31"),
6269 	INTEL_UNCORE_EVENT_DESC(bw_out_port1.scale,	"3.814697266e-6"),
6270 	INTEL_UNCORE_EVENT_DESC(bw_out_port1.unit,	"MiB"),
6271 	INTEL_UNCORE_EVENT_DESC(bw_out_port2,		"event=0xff,umask=0x32"),
6272 	INTEL_UNCORE_EVENT_DESC(bw_out_port2.scale,	"3.814697266e-6"),
6273 	INTEL_UNCORE_EVENT_DESC(bw_out_port2.unit,	"MiB"),
6274 	INTEL_UNCORE_EVENT_DESC(bw_out_port3,		"event=0xff,umask=0x33"),
6275 	INTEL_UNCORE_EVENT_DESC(bw_out_port3.scale,	"3.814697266e-6"),
6276 	INTEL_UNCORE_EVENT_DESC(bw_out_port3.unit,	"MiB"),
6277 	INTEL_UNCORE_EVENT_DESC(bw_out_port4,		"event=0xff,umask=0x34"),
6278 	INTEL_UNCORE_EVENT_DESC(bw_out_port4.scale,	"3.814697266e-6"),
6279 	INTEL_UNCORE_EVENT_DESC(bw_out_port4.unit,	"MiB"),
6280 	INTEL_UNCORE_EVENT_DESC(bw_out_port5,		"event=0xff,umask=0x35"),
6281 	INTEL_UNCORE_EVENT_DESC(bw_out_port5.scale,	"3.814697266e-6"),
6282 	INTEL_UNCORE_EVENT_DESC(bw_out_port5.unit,	"MiB"),
6283 	INTEL_UNCORE_EVENT_DESC(bw_out_port6,		"event=0xff,umask=0x36"),
6284 	INTEL_UNCORE_EVENT_DESC(bw_out_port6.scale,	"3.814697266e-6"),
6285 	INTEL_UNCORE_EVENT_DESC(bw_out_port6.unit,	"MiB"),
6286 	INTEL_UNCORE_EVENT_DESC(bw_out_port7,		"event=0xff,umask=0x37"),
6287 	INTEL_UNCORE_EVENT_DESC(bw_out_port7.scale,	"3.814697266e-6"),
6288 	INTEL_UNCORE_EVENT_DESC(bw_out_port7.unit,	"MiB"),
6289 	{ /* end: all zeroes */ },
6290 };
6291 
6292 static struct intel_uncore_type spr_uncore_iio_free_running = {
6293 	.name			= "iio_free_running",
6294 	.num_counters		= 17,
6295 	.num_freerunning_types	= SPR_IIO_FREERUNNING_TYPE_MAX,
6296 	.freerunning		= spr_iio_freerunning,
6297 	.ops			= &skx_uncore_iio_freerunning_ops,
6298 	.event_descs		= spr_uncore_iio_freerunning_events,
6299 	.format_group		= &skx_uncore_iio_freerunning_format_group,
6300 };
6301 
6302 enum perf_uncore_spr_imc_freerunning_type_id {
6303 	SPR_IMC_DCLK,
6304 	SPR_IMC_PQ_CYCLES,
6305 
6306 	SPR_IMC_FREERUNNING_TYPE_MAX,
6307 };
6308 
6309 static struct freerunning_counters spr_imc_freerunning[] = {
6310 	[SPR_IMC_DCLK]		= { 0x22b0, 0x0, 0, 1, 48 },
6311 	[SPR_IMC_PQ_CYCLES]	= { 0x2318, 0x8, 0, 2, 48 },
6312 };
6313 
6314 static struct uncore_event_desc spr_uncore_imc_freerunning_events[] = {
6315 	INTEL_UNCORE_EVENT_DESC(dclk,			"event=0xff,umask=0x10"),
6316 
6317 	INTEL_UNCORE_EVENT_DESC(rpq_cycles,		"event=0xff,umask=0x20"),
6318 	INTEL_UNCORE_EVENT_DESC(wpq_cycles,		"event=0xff,umask=0x21"),
6319 	{ /* end: all zeroes */ },
6320 };
6321 
6322 #define SPR_MC_DEVICE_ID	0x3251
6323 
spr_uncore_imc_freerunning_init_box(struct intel_uncore_box * box)6324 static void spr_uncore_imc_freerunning_init_box(struct intel_uncore_box *box)
6325 {
6326 	int mem_offset = box->pmu->pmu_idx * ICX_IMC_MEM_STRIDE + SNR_IMC_MMIO_MEM0_OFFSET;
6327 
6328 	snr_uncore_mmio_map(box, uncore_mmio_box_ctl(box),
6329 			    mem_offset, SPR_MC_DEVICE_ID);
6330 }
6331 
6332 static struct intel_uncore_ops spr_uncore_imc_freerunning_ops = {
6333 	.init_box	= spr_uncore_imc_freerunning_init_box,
6334 	.exit_box	= uncore_mmio_exit_box,
6335 	.read_counter	= uncore_mmio_read_counter,
6336 	.hw_config	= uncore_freerunning_hw_config,
6337 };
6338 
6339 static struct intel_uncore_type spr_uncore_imc_free_running = {
6340 	.name			= "imc_free_running",
6341 	.num_counters		= 3,
6342 	.mmio_map_size		= SNR_IMC_MMIO_SIZE,
6343 	.num_freerunning_types	= SPR_IMC_FREERUNNING_TYPE_MAX,
6344 	.freerunning		= spr_imc_freerunning,
6345 	.ops			= &spr_uncore_imc_freerunning_ops,
6346 	.event_descs		= spr_uncore_imc_freerunning_events,
6347 	.format_group		= &skx_uncore_iio_freerunning_format_group,
6348 };
6349 
6350 #define UNCORE_SPR_MSR_EXTRA_UNCORES		1
6351 #define UNCORE_SPR_MMIO_EXTRA_UNCORES		1
6352 #define UNCORE_SPR_PCI_EXTRA_UNCORES		2
6353 
6354 static struct intel_uncore_type *spr_msr_uncores[UNCORE_SPR_MSR_EXTRA_UNCORES] = {
6355 	&spr_uncore_iio_free_running,
6356 };
6357 
6358 static struct intel_uncore_type *spr_mmio_uncores[UNCORE_SPR_MMIO_EXTRA_UNCORES] = {
6359 	&spr_uncore_imc_free_running,
6360 };
6361 
6362 static struct intel_uncore_type *spr_pci_uncores[UNCORE_SPR_PCI_EXTRA_UNCORES] = {
6363 	&spr_uncore_upi,
6364 	&spr_uncore_m3upi
6365 };
6366 
6367 int spr_uncore_units_ignore[] = {
6368 	UNCORE_SPR_UPI,
6369 	UNCORE_SPR_M3UPI,
6370 	UNCORE_IGNORE_END
6371 };
6372 
uncore_type_customized_copy(struct intel_uncore_type * to_type,struct intel_uncore_type * from_type)6373 static void uncore_type_customized_copy(struct intel_uncore_type *to_type,
6374 					struct intel_uncore_type *from_type)
6375 {
6376 	if (!to_type || !from_type)
6377 		return;
6378 
6379 	if (from_type->name)
6380 		to_type->name = from_type->name;
6381 	if (from_type->fixed_ctr_bits)
6382 		to_type->fixed_ctr_bits = from_type->fixed_ctr_bits;
6383 	if (from_type->event_mask)
6384 		to_type->event_mask = from_type->event_mask;
6385 	if (from_type->event_mask_ext)
6386 		to_type->event_mask_ext = from_type->event_mask_ext;
6387 	if (from_type->fixed_ctr)
6388 		to_type->fixed_ctr = from_type->fixed_ctr;
6389 	if (from_type->fixed_ctl)
6390 		to_type->fixed_ctl = from_type->fixed_ctl;
6391 	if (from_type->fixed_ctr_bits)
6392 		to_type->fixed_ctr_bits = from_type->fixed_ctr_bits;
6393 	if (from_type->num_shared_regs)
6394 		to_type->num_shared_regs = from_type->num_shared_regs;
6395 	if (from_type->constraints)
6396 		to_type->constraints = from_type->constraints;
6397 	if (from_type->ops)
6398 		to_type->ops = from_type->ops;
6399 	if (from_type->event_descs)
6400 		to_type->event_descs = from_type->event_descs;
6401 	if (from_type->format_group)
6402 		to_type->format_group = from_type->format_group;
6403 	if (from_type->attr_update)
6404 		to_type->attr_update = from_type->attr_update;
6405 	if (from_type->set_mapping)
6406 		to_type->set_mapping = from_type->set_mapping;
6407 	if (from_type->get_topology)
6408 		to_type->get_topology = from_type->get_topology;
6409 	if (from_type->cleanup_mapping)
6410 		to_type->cleanup_mapping = from_type->cleanup_mapping;
6411 }
6412 
6413 static struct intel_uncore_type **
uncore_get_uncores(enum uncore_access_type type_id,int num_extra,struct intel_uncore_type ** extra)6414 uncore_get_uncores(enum uncore_access_type type_id, int num_extra,
6415 		    struct intel_uncore_type **extra)
6416 {
6417 	struct intel_uncore_type **types, **start_types;
6418 	int i;
6419 
6420 	start_types = types = intel_uncore_generic_init_uncores(type_id, num_extra);
6421 
6422 	/* Only copy the customized features */
6423 	for (; *types; types++) {
6424 		if ((*types)->type_id >= UNCORE_SPR_NUM_UNCORE_TYPES)
6425 			continue;
6426 		uncore_type_customized_copy(*types, spr_uncores[(*types)->type_id]);
6427 	}
6428 
6429 	for (i = 0; i < num_extra; i++, types++)
6430 		*types = extra[i];
6431 
6432 	return start_types;
6433 }
6434 
6435 static struct intel_uncore_type *
uncore_find_type_by_id(struct intel_uncore_type ** types,int type_id)6436 uncore_find_type_by_id(struct intel_uncore_type **types, int type_id)
6437 {
6438 	for (; *types; types++) {
6439 		if (type_id == (*types)->type_id)
6440 			return *types;
6441 	}
6442 
6443 	return NULL;
6444 }
6445 
uncore_type_max_boxes(struct intel_uncore_type ** types,int type_id)6446 static int uncore_type_max_boxes(struct intel_uncore_type **types,
6447 				 int type_id)
6448 {
6449 	struct intel_uncore_type *type;
6450 	int i, max = 0;
6451 
6452 	type = uncore_find_type_by_id(types, type_id);
6453 	if (!type)
6454 		return 0;
6455 
6456 	for (i = 0; i < type->num_boxes; i++) {
6457 		if (type->box_ids[i] > max)
6458 			max = type->box_ids[i];
6459 	}
6460 
6461 	return max + 1;
6462 }
6463 
6464 #define SPR_MSR_UNC_CBO_CONFIG		0x2FFE
6465 
spr_uncore_cpu_init(void)6466 void spr_uncore_cpu_init(void)
6467 {
6468 	struct intel_uncore_type *type;
6469 	u64 num_cbo;
6470 
6471 	uncore_msr_uncores = uncore_get_uncores(UNCORE_ACCESS_MSR,
6472 						UNCORE_SPR_MSR_EXTRA_UNCORES,
6473 						spr_msr_uncores);
6474 
6475 	type = uncore_find_type_by_id(uncore_msr_uncores, UNCORE_SPR_CHA);
6476 	if (type) {
6477 		/*
6478 		 * The value from the discovery table (stored in the type->num_boxes
6479 		 * of UNCORE_SPR_CHA) is incorrect on some SPR variants because of a
6480 		 * firmware bug. Using the value from SPR_MSR_UNC_CBO_CONFIG to replace it.
6481 		 */
6482 		rdmsrl(SPR_MSR_UNC_CBO_CONFIG, num_cbo);
6483 		/*
6484 		 * The MSR doesn't work on the EMR XCC, but the firmware bug doesn't impact
6485 		 * the EMR XCC. Don't let the value from the MSR replace the existing value.
6486 		 */
6487 		if (num_cbo)
6488 			type->num_boxes = num_cbo;
6489 	}
6490 	spr_uncore_iio_free_running.num_boxes = uncore_type_max_boxes(uncore_msr_uncores, UNCORE_SPR_IIO);
6491 }
6492 
6493 #define SPR_UNCORE_UPI_PCIID		0x3241
6494 #define SPR_UNCORE_UPI0_DEVFN		0x9
6495 #define SPR_UNCORE_M3UPI_PCIID		0x3246
6496 #define SPR_UNCORE_M3UPI0_DEVFN		0x29
6497 
spr_update_device_location(int type_id)6498 static void spr_update_device_location(int type_id)
6499 {
6500 	struct intel_uncore_type *type;
6501 	struct pci_dev *dev = NULL;
6502 	u32 device, devfn;
6503 	u64 *ctls;
6504 	int die;
6505 
6506 	if (type_id == UNCORE_SPR_UPI) {
6507 		type = &spr_uncore_upi;
6508 		device = SPR_UNCORE_UPI_PCIID;
6509 		devfn = SPR_UNCORE_UPI0_DEVFN;
6510 	} else if (type_id == UNCORE_SPR_M3UPI) {
6511 		type = &spr_uncore_m3upi;
6512 		device = SPR_UNCORE_M3UPI_PCIID;
6513 		devfn = SPR_UNCORE_M3UPI0_DEVFN;
6514 	} else
6515 		return;
6516 
6517 	ctls = kcalloc(__uncore_max_dies, sizeof(u64), GFP_KERNEL);
6518 	if (!ctls) {
6519 		type->num_boxes = 0;
6520 		return;
6521 	}
6522 
6523 	while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL, device, dev)) != NULL) {
6524 		if (devfn != dev->devfn)
6525 			continue;
6526 
6527 		die = uncore_device_to_die(dev);
6528 		if (die < 0)
6529 			continue;
6530 
6531 		ctls[die] = pci_domain_nr(dev->bus) << UNCORE_DISCOVERY_PCI_DOMAIN_OFFSET |
6532 			    dev->bus->number << UNCORE_DISCOVERY_PCI_BUS_OFFSET |
6533 			    devfn << UNCORE_DISCOVERY_PCI_DEVFN_OFFSET |
6534 			    type->box_ctl;
6535 	}
6536 
6537 	type->box_ctls = ctls;
6538 }
6539 
spr_uncore_pci_init(void)6540 int spr_uncore_pci_init(void)
6541 {
6542 	/*
6543 	 * The discovery table of UPI on some SPR variant is broken,
6544 	 * which impacts the detection of both UPI and M3UPI uncore PMON.
6545 	 * Use the pre-defined UPI and M3UPI table to replace.
6546 	 *
6547 	 * The accurate location, e.g., domain and BUS number,
6548 	 * can only be retrieved at load time.
6549 	 * Update the location of UPI and M3UPI.
6550 	 */
6551 	spr_update_device_location(UNCORE_SPR_UPI);
6552 	spr_update_device_location(UNCORE_SPR_M3UPI);
6553 	uncore_pci_uncores = uncore_get_uncores(UNCORE_ACCESS_PCI,
6554 						UNCORE_SPR_PCI_EXTRA_UNCORES,
6555 						spr_pci_uncores);
6556 	return 0;
6557 }
6558 
spr_uncore_mmio_init(void)6559 void spr_uncore_mmio_init(void)
6560 {
6561 	int ret = snbep_pci2phy_map_init(0x3250, SKX_CPUNODEID, SKX_GIDNIDMAP, true);
6562 
6563 	if (ret)
6564 		uncore_mmio_uncores = uncore_get_uncores(UNCORE_ACCESS_MMIO, 0, NULL);
6565 	else {
6566 		uncore_mmio_uncores = uncore_get_uncores(UNCORE_ACCESS_MMIO,
6567 							 UNCORE_SPR_MMIO_EXTRA_UNCORES,
6568 							 spr_mmio_uncores);
6569 
6570 		spr_uncore_imc_free_running.num_boxes = uncore_type_max_boxes(uncore_mmio_uncores, UNCORE_SPR_IMC) / 2;
6571 	}
6572 }
6573 
6574 /* end of SPR uncore support */
6575