Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0
2 : : /* SandyBridge-EP/IvyTown uncore support */
3 : : #include "uncore.h"
4 : :
5 : : /* SNB-EP pci bus to socket mapping */
6 : : #define SNBEP_CPUNODEID 0x40
7 : : #define SNBEP_GIDNIDMAP 0x54
8 : :
9 : : /* SNB-EP Box level control */
10 : : #define SNBEP_PMON_BOX_CTL_RST_CTRL (1 << 0)
11 : : #define SNBEP_PMON_BOX_CTL_RST_CTRS (1 << 1)
12 : : #define SNBEP_PMON_BOX_CTL_FRZ (1 << 8)
13 : : #define SNBEP_PMON_BOX_CTL_FRZ_EN (1 << 16)
14 : : #define SNBEP_PMON_BOX_CTL_INT (SNBEP_PMON_BOX_CTL_RST_CTRL | \
15 : : SNBEP_PMON_BOX_CTL_RST_CTRS | \
16 : : SNBEP_PMON_BOX_CTL_FRZ_EN)
17 : : /* SNB-EP event control */
18 : : #define SNBEP_PMON_CTL_EV_SEL_MASK 0x000000ff
19 : : #define SNBEP_PMON_CTL_UMASK_MASK 0x0000ff00
20 : : #define SNBEP_PMON_CTL_RST (1 << 17)
21 : : #define SNBEP_PMON_CTL_EDGE_DET (1 << 18)
22 : : #define SNBEP_PMON_CTL_EV_SEL_EXT (1 << 21)
23 : : #define SNBEP_PMON_CTL_EN (1 << 22)
24 : : #define SNBEP_PMON_CTL_INVERT (1 << 23)
25 : : #define SNBEP_PMON_CTL_TRESH_MASK 0xff000000
26 : : #define SNBEP_PMON_RAW_EVENT_MASK (SNBEP_PMON_CTL_EV_SEL_MASK | \
27 : : SNBEP_PMON_CTL_UMASK_MASK | \
28 : : SNBEP_PMON_CTL_EDGE_DET | \
29 : : SNBEP_PMON_CTL_INVERT | \
30 : : SNBEP_PMON_CTL_TRESH_MASK)
31 : :
32 : : /* SNB-EP Ubox event control */
33 : : #define SNBEP_U_MSR_PMON_CTL_TRESH_MASK 0x1f000000
34 : : #define SNBEP_U_MSR_PMON_RAW_EVENT_MASK \
35 : : (SNBEP_PMON_CTL_EV_SEL_MASK | \
36 : : SNBEP_PMON_CTL_UMASK_MASK | \
37 : : SNBEP_PMON_CTL_EDGE_DET | \
38 : : SNBEP_PMON_CTL_INVERT | \
39 : : SNBEP_U_MSR_PMON_CTL_TRESH_MASK)
40 : :
41 : : #define SNBEP_CBO_PMON_CTL_TID_EN (1 << 19)
42 : : #define SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK (SNBEP_PMON_RAW_EVENT_MASK | \
43 : : SNBEP_CBO_PMON_CTL_TID_EN)
44 : :
45 : : /* SNB-EP PCU event control */
46 : : #define SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK 0x0000c000
47 : : #define SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK 0x1f000000
48 : : #define SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT (1 << 30)
49 : : #define SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET (1 << 31)
50 : : #define SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK \
51 : : (SNBEP_PMON_CTL_EV_SEL_MASK | \
52 : : SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
53 : : SNBEP_PMON_CTL_EDGE_DET | \
54 : : SNBEP_PMON_CTL_INVERT | \
55 : : SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK | \
56 : : SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
57 : : SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET)
58 : :
59 : : #define SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK \
60 : : (SNBEP_PMON_RAW_EVENT_MASK | \
61 : : SNBEP_PMON_CTL_EV_SEL_EXT)
62 : :
63 : : /* SNB-EP pci control register */
64 : : #define SNBEP_PCI_PMON_BOX_CTL 0xf4
65 : : #define SNBEP_PCI_PMON_CTL0 0xd8
66 : : /* SNB-EP pci counter register */
67 : : #define SNBEP_PCI_PMON_CTR0 0xa0
68 : :
69 : : /* SNB-EP home agent register */
70 : : #define SNBEP_HA_PCI_PMON_BOX_ADDRMATCH0 0x40
71 : : #define SNBEP_HA_PCI_PMON_BOX_ADDRMATCH1 0x44
72 : : #define SNBEP_HA_PCI_PMON_BOX_OPCODEMATCH 0x48
73 : : /* SNB-EP memory controller register */
74 : : #define SNBEP_MC_CHy_PCI_PMON_FIXED_CTL 0xf0
75 : : #define SNBEP_MC_CHy_PCI_PMON_FIXED_CTR 0xd0
76 : : /* SNB-EP QPI register */
77 : : #define SNBEP_Q_Py_PCI_PMON_PKT_MATCH0 0x228
78 : : #define SNBEP_Q_Py_PCI_PMON_PKT_MATCH1 0x22c
79 : : #define SNBEP_Q_Py_PCI_PMON_PKT_MASK0 0x238
80 : : #define SNBEP_Q_Py_PCI_PMON_PKT_MASK1 0x23c
81 : :
82 : : /* SNB-EP Ubox register */
83 : : #define SNBEP_U_MSR_PMON_CTR0 0xc16
84 : : #define SNBEP_U_MSR_PMON_CTL0 0xc10
85 : :
86 : : #define SNBEP_U_MSR_PMON_UCLK_FIXED_CTL 0xc08
87 : : #define SNBEP_U_MSR_PMON_UCLK_FIXED_CTR 0xc09
88 : :
89 : : /* SNB-EP Cbo register */
90 : : #define SNBEP_C0_MSR_PMON_CTR0 0xd16
91 : : #define SNBEP_C0_MSR_PMON_CTL0 0xd10
92 : : #define SNBEP_C0_MSR_PMON_BOX_CTL 0xd04
93 : : #define SNBEP_C0_MSR_PMON_BOX_FILTER 0xd14
94 : : #define SNBEP_CBO_MSR_OFFSET 0x20
95 : :
96 : : #define SNBEP_CB0_MSR_PMON_BOX_FILTER_TID 0x1f
97 : : #define SNBEP_CB0_MSR_PMON_BOX_FILTER_NID 0x3fc00
98 : : #define SNBEP_CB0_MSR_PMON_BOX_FILTER_STATE 0x7c0000
99 : : #define SNBEP_CB0_MSR_PMON_BOX_FILTER_OPC 0xff800000
100 : :
101 : : #define SNBEP_CBO_EVENT_EXTRA_REG(e, m, i) { \
102 : : .event = (e), \
103 : : .msr = SNBEP_C0_MSR_PMON_BOX_FILTER, \
104 : : .config_mask = (m), \
105 : : .idx = (i) \
106 : : }
107 : :
108 : : /* SNB-EP PCU register */
109 : : #define SNBEP_PCU_MSR_PMON_CTR0 0xc36
110 : : #define SNBEP_PCU_MSR_PMON_CTL0 0xc30
111 : : #define SNBEP_PCU_MSR_PMON_BOX_CTL 0xc24
112 : : #define SNBEP_PCU_MSR_PMON_BOX_FILTER 0xc34
113 : : #define SNBEP_PCU_MSR_PMON_BOX_FILTER_MASK 0xffffffff
114 : : #define SNBEP_PCU_MSR_CORE_C3_CTR 0x3fc
115 : : #define SNBEP_PCU_MSR_CORE_C6_CTR 0x3fd
116 : :
117 : : /* IVBEP event control */
118 : : #define IVBEP_PMON_BOX_CTL_INT (SNBEP_PMON_BOX_CTL_RST_CTRL | \
119 : : SNBEP_PMON_BOX_CTL_RST_CTRS)
120 : : #define IVBEP_PMON_RAW_EVENT_MASK (SNBEP_PMON_CTL_EV_SEL_MASK | \
121 : : SNBEP_PMON_CTL_UMASK_MASK | \
122 : : SNBEP_PMON_CTL_EDGE_DET | \
123 : : SNBEP_PMON_CTL_TRESH_MASK)
124 : : /* IVBEP Ubox */
125 : : #define IVBEP_U_MSR_PMON_GLOBAL_CTL 0xc00
126 : : #define IVBEP_U_PMON_GLOBAL_FRZ_ALL (1 << 31)
127 : : #define IVBEP_U_PMON_GLOBAL_UNFRZ_ALL (1 << 29)
128 : :
129 : : #define IVBEP_U_MSR_PMON_RAW_EVENT_MASK \
130 : : (SNBEP_PMON_CTL_EV_SEL_MASK | \
131 : : SNBEP_PMON_CTL_UMASK_MASK | \
132 : : SNBEP_PMON_CTL_EDGE_DET | \
133 : : SNBEP_U_MSR_PMON_CTL_TRESH_MASK)
134 : : /* IVBEP Cbo */
135 : : #define IVBEP_CBO_MSR_PMON_RAW_EVENT_MASK (IVBEP_PMON_RAW_EVENT_MASK | \
136 : : SNBEP_CBO_PMON_CTL_TID_EN)
137 : :
138 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_TID (0x1fULL << 0)
139 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_LINK (0xfULL << 5)
140 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_STATE (0x3fULL << 17)
141 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_NID (0xffffULL << 32)
142 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_OPC (0x1ffULL << 52)
143 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_C6 (0x1ULL << 61)
144 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_NC (0x1ULL << 62)
145 : : #define IVBEP_CB0_MSR_PMON_BOX_FILTER_ISOC (0x1ULL << 63)
146 : :
147 : : /* IVBEP home agent */
148 : : #define IVBEP_HA_PCI_PMON_CTL_Q_OCC_RST (1 << 16)
149 : : #define IVBEP_HA_PCI_PMON_RAW_EVENT_MASK \
150 : : (IVBEP_PMON_RAW_EVENT_MASK | \
151 : : IVBEP_HA_PCI_PMON_CTL_Q_OCC_RST)
152 : : /* IVBEP PCU */
153 : : #define IVBEP_PCU_MSR_PMON_RAW_EVENT_MASK \
154 : : (SNBEP_PMON_CTL_EV_SEL_MASK | \
155 : : SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
156 : : SNBEP_PMON_CTL_EDGE_DET | \
157 : : SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK | \
158 : : SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
159 : : SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET)
160 : : /* IVBEP QPI */
161 : : #define IVBEP_QPI_PCI_PMON_RAW_EVENT_MASK \
162 : : (IVBEP_PMON_RAW_EVENT_MASK | \
163 : : SNBEP_PMON_CTL_EV_SEL_EXT)
164 : :
165 : : #define __BITS_VALUE(x, i, n) ((typeof(x))(((x) >> ((i) * (n))) & \
166 : : ((1ULL << (n)) - 1)))
167 : :
168 : : /* Haswell-EP Ubox */
169 : : #define HSWEP_U_MSR_PMON_CTR0 0x709
170 : : #define HSWEP_U_MSR_PMON_CTL0 0x705
171 : : #define HSWEP_U_MSR_PMON_FILTER 0x707
172 : :
173 : : #define HSWEP_U_MSR_PMON_UCLK_FIXED_CTL 0x703
174 : : #define HSWEP_U_MSR_PMON_UCLK_FIXED_CTR 0x704
175 : :
176 : : #define HSWEP_U_MSR_PMON_BOX_FILTER_TID (0x1 << 0)
177 : : #define HSWEP_U_MSR_PMON_BOX_FILTER_CID (0x1fULL << 1)
178 : : #define HSWEP_U_MSR_PMON_BOX_FILTER_MASK \
179 : : (HSWEP_U_MSR_PMON_BOX_FILTER_TID | \
180 : : HSWEP_U_MSR_PMON_BOX_FILTER_CID)
181 : :
182 : : /* Haswell-EP CBo */
183 : : #define HSWEP_C0_MSR_PMON_CTR0 0xe08
184 : : #define HSWEP_C0_MSR_PMON_CTL0 0xe01
185 : : #define HSWEP_C0_MSR_PMON_BOX_CTL 0xe00
186 : : #define HSWEP_C0_MSR_PMON_BOX_FILTER0 0xe05
187 : : #define HSWEP_CBO_MSR_OFFSET 0x10
188 : :
189 : :
190 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_TID (0x3fULL << 0)
191 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_LINK (0xfULL << 6)
192 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_STATE (0x7fULL << 17)
193 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_NID (0xffffULL << 32)
194 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_OPC (0x1ffULL << 52)
195 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_C6 (0x1ULL << 61)
196 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_NC (0x1ULL << 62)
197 : : #define HSWEP_CB0_MSR_PMON_BOX_FILTER_ISOC (0x1ULL << 63)
198 : :
199 : :
200 : : /* Haswell-EP Sbox */
201 : : #define HSWEP_S0_MSR_PMON_CTR0 0x726
202 : : #define HSWEP_S0_MSR_PMON_CTL0 0x721
203 : : #define HSWEP_S0_MSR_PMON_BOX_CTL 0x720
204 : : #define HSWEP_SBOX_MSR_OFFSET 0xa
205 : : #define HSWEP_S_MSR_PMON_RAW_EVENT_MASK (SNBEP_PMON_RAW_EVENT_MASK | \
206 : : SNBEP_CBO_PMON_CTL_TID_EN)
207 : :
208 : : /* Haswell-EP PCU */
209 : : #define HSWEP_PCU_MSR_PMON_CTR0 0x717
210 : : #define HSWEP_PCU_MSR_PMON_CTL0 0x711
211 : : #define HSWEP_PCU_MSR_PMON_BOX_CTL 0x710
212 : : #define HSWEP_PCU_MSR_PMON_BOX_FILTER 0x715
213 : :
214 : : /* KNL Ubox */
215 : : #define KNL_U_MSR_PMON_RAW_EVENT_MASK \
216 : : (SNBEP_U_MSR_PMON_RAW_EVENT_MASK | \
217 : : SNBEP_CBO_PMON_CTL_TID_EN)
218 : : /* KNL CHA */
219 : : #define KNL_CHA_MSR_OFFSET 0xc
220 : : #define KNL_CHA_MSR_PMON_CTL_QOR (1 << 16)
221 : : #define KNL_CHA_MSR_PMON_RAW_EVENT_MASK \
222 : : (SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK | \
223 : : KNL_CHA_MSR_PMON_CTL_QOR)
224 : : #define KNL_CHA_MSR_PMON_BOX_FILTER_TID 0x1ff
225 : : #define KNL_CHA_MSR_PMON_BOX_FILTER_STATE (7 << 18)
226 : : #define KNL_CHA_MSR_PMON_BOX_FILTER_OP (0xfffffe2aULL << 32)
227 : : #define KNL_CHA_MSR_PMON_BOX_FILTER_REMOTE_NODE (0x1ULL << 32)
228 : : #define KNL_CHA_MSR_PMON_BOX_FILTER_LOCAL_NODE (0x1ULL << 33)
229 : : #define KNL_CHA_MSR_PMON_BOX_FILTER_NNC (0x1ULL << 37)
230 : :
231 : : /* KNL EDC/MC UCLK */
232 : : #define KNL_UCLK_MSR_PMON_CTR0_LOW 0x400
233 : : #define KNL_UCLK_MSR_PMON_CTL0 0x420
234 : : #define KNL_UCLK_MSR_PMON_BOX_CTL 0x430
235 : : #define KNL_UCLK_MSR_PMON_UCLK_FIXED_LOW 0x44c
236 : : #define KNL_UCLK_MSR_PMON_UCLK_FIXED_CTL 0x454
237 : : #define KNL_PMON_FIXED_CTL_EN 0x1
238 : :
239 : : /* KNL EDC */
240 : : #define KNL_EDC0_ECLK_MSR_PMON_CTR0_LOW 0xa00
241 : : #define KNL_EDC0_ECLK_MSR_PMON_CTL0 0xa20
242 : : #define KNL_EDC0_ECLK_MSR_PMON_BOX_CTL 0xa30
243 : : #define KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_LOW 0xa3c
244 : : #define KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_CTL 0xa44
245 : :
246 : : /* KNL MC */
247 : : #define KNL_MC0_CH0_MSR_PMON_CTR0_LOW 0xb00
248 : : #define KNL_MC0_CH0_MSR_PMON_CTL0 0xb20
249 : : #define KNL_MC0_CH0_MSR_PMON_BOX_CTL 0xb30
250 : : #define KNL_MC0_CH0_MSR_PMON_FIXED_LOW 0xb3c
251 : : #define KNL_MC0_CH0_MSR_PMON_FIXED_CTL 0xb44
252 : :
253 : : /* KNL IRP */
254 : : #define KNL_IRP_PCI_PMON_BOX_CTL 0xf0
255 : : #define KNL_IRP_PCI_PMON_RAW_EVENT_MASK (SNBEP_PMON_RAW_EVENT_MASK | \
256 : : KNL_CHA_MSR_PMON_CTL_QOR)
257 : : /* KNL PCU */
258 : : #define KNL_PCU_PMON_CTL_EV_SEL_MASK 0x0000007f
259 : : #define KNL_PCU_PMON_CTL_USE_OCC_CTR (1 << 7)
260 : : #define KNL_PCU_MSR_PMON_CTL_TRESH_MASK 0x3f000000
261 : : #define KNL_PCU_MSR_PMON_RAW_EVENT_MASK \
262 : : (KNL_PCU_PMON_CTL_EV_SEL_MASK | \
263 : : KNL_PCU_PMON_CTL_USE_OCC_CTR | \
264 : : SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
265 : : SNBEP_PMON_CTL_EDGE_DET | \
266 : : SNBEP_CBO_PMON_CTL_TID_EN | \
267 : : SNBEP_PMON_CTL_INVERT | \
268 : : KNL_PCU_MSR_PMON_CTL_TRESH_MASK | \
269 : : SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
270 : : SNBEP_PCU_MSR_PMON_CTL_OCC_EDGE_DET)
271 : :
272 : : /* SKX pci bus to socket mapping */
273 : : #define SKX_CPUNODEID 0xc0
274 : : #define SKX_GIDNIDMAP 0xd4
275 : :
276 : : /* SKX CHA */
277 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_TID (0x1ffULL << 0)
278 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_LINK (0xfULL << 9)
279 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_STATE (0x3ffULL << 17)
280 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_REM (0x1ULL << 32)
281 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_LOC (0x1ULL << 33)
282 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_ALL_OPC (0x1ULL << 35)
283 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_NM (0x1ULL << 36)
284 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_NOT_NM (0x1ULL << 37)
285 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_OPC0 (0x3ffULL << 41)
286 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_OPC1 (0x3ffULL << 51)
287 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_C6 (0x1ULL << 61)
288 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_NC (0x1ULL << 62)
289 : : #define SKX_CHA_MSR_PMON_BOX_FILTER_ISOC (0x1ULL << 63)
290 : :
291 : : /* SKX IIO */
292 : : #define SKX_IIO0_MSR_PMON_CTL0 0xa48
293 : : #define SKX_IIO0_MSR_PMON_CTR0 0xa41
294 : : #define SKX_IIO0_MSR_PMON_BOX_CTL 0xa40
295 : : #define SKX_IIO_MSR_OFFSET 0x20
296 : :
297 : : #define SKX_PMON_CTL_TRESH_MASK (0xff << 24)
298 : : #define SKX_PMON_CTL_TRESH_MASK_EXT (0xf)
299 : : #define SKX_PMON_CTL_CH_MASK (0xff << 4)
300 : : #define SKX_PMON_CTL_FC_MASK (0x7 << 12)
301 : : #define SKX_IIO_PMON_RAW_EVENT_MASK (SNBEP_PMON_CTL_EV_SEL_MASK | \
302 : : SNBEP_PMON_CTL_UMASK_MASK | \
303 : : SNBEP_PMON_CTL_EDGE_DET | \
304 : : SNBEP_PMON_CTL_INVERT | \
305 : : SKX_PMON_CTL_TRESH_MASK)
306 : : #define SKX_IIO_PMON_RAW_EVENT_MASK_EXT (SKX_PMON_CTL_TRESH_MASK_EXT | \
307 : : SKX_PMON_CTL_CH_MASK | \
308 : : SKX_PMON_CTL_FC_MASK)
309 : :
310 : : /* SKX IRP */
311 : : #define SKX_IRP0_MSR_PMON_CTL0 0xa5b
312 : : #define SKX_IRP0_MSR_PMON_CTR0 0xa59
313 : : #define SKX_IRP0_MSR_PMON_BOX_CTL 0xa58
314 : : #define SKX_IRP_MSR_OFFSET 0x20
315 : :
316 : : /* SKX UPI */
317 : : #define SKX_UPI_PCI_PMON_CTL0 0x350
318 : : #define SKX_UPI_PCI_PMON_CTR0 0x318
319 : : #define SKX_UPI_PCI_PMON_BOX_CTL 0x378
320 : : #define SKX_UPI_CTL_UMASK_EXT 0xffefff
321 : :
322 : : /* SKX M2M */
323 : : #define SKX_M2M_PCI_PMON_CTL0 0x228
324 : : #define SKX_M2M_PCI_PMON_CTR0 0x200
325 : : #define SKX_M2M_PCI_PMON_BOX_CTL 0x258
326 : :
327 : : /* SNR Ubox */
328 : : #define SNR_U_MSR_PMON_CTR0 0x1f98
329 : : #define SNR_U_MSR_PMON_CTL0 0x1f91
330 : : #define SNR_U_MSR_PMON_UCLK_FIXED_CTL 0x1f93
331 : : #define SNR_U_MSR_PMON_UCLK_FIXED_CTR 0x1f94
332 : :
333 : : /* SNR CHA */
334 : : #define SNR_CHA_RAW_EVENT_MASK_EXT 0x3ffffff
335 : : #define SNR_CHA_MSR_PMON_CTL0 0x1c01
336 : : #define SNR_CHA_MSR_PMON_CTR0 0x1c08
337 : : #define SNR_CHA_MSR_PMON_BOX_CTL 0x1c00
338 : : #define SNR_C0_MSR_PMON_BOX_FILTER0 0x1c05
339 : :
340 : :
341 : : /* SNR IIO */
342 : : #define SNR_IIO_MSR_PMON_CTL0 0x1e08
343 : : #define SNR_IIO_MSR_PMON_CTR0 0x1e01
344 : : #define SNR_IIO_MSR_PMON_BOX_CTL 0x1e00
345 : : #define SNR_IIO_MSR_OFFSET 0x10
346 : : #define SNR_IIO_PMON_RAW_EVENT_MASK_EXT 0x7ffff
347 : :
348 : : /* SNR IRP */
349 : : #define SNR_IRP0_MSR_PMON_CTL0 0x1ea8
350 : : #define SNR_IRP0_MSR_PMON_CTR0 0x1ea1
351 : : #define SNR_IRP0_MSR_PMON_BOX_CTL 0x1ea0
352 : : #define SNR_IRP_MSR_OFFSET 0x10
353 : :
354 : : /* SNR M2PCIE */
355 : : #define SNR_M2PCIE_MSR_PMON_CTL0 0x1e58
356 : : #define SNR_M2PCIE_MSR_PMON_CTR0 0x1e51
357 : : #define SNR_M2PCIE_MSR_PMON_BOX_CTL 0x1e50
358 : : #define SNR_M2PCIE_MSR_OFFSET 0x10
359 : :
360 : : /* SNR PCU */
361 : : #define SNR_PCU_MSR_PMON_CTL0 0x1ef1
362 : : #define SNR_PCU_MSR_PMON_CTR0 0x1ef8
363 : : #define SNR_PCU_MSR_PMON_BOX_CTL 0x1ef0
364 : : #define SNR_PCU_MSR_PMON_BOX_FILTER 0x1efc
365 : :
366 : : /* SNR M2M */
367 : : #define SNR_M2M_PCI_PMON_CTL0 0x468
368 : : #define SNR_M2M_PCI_PMON_CTR0 0x440
369 : : #define SNR_M2M_PCI_PMON_BOX_CTL 0x438
370 : : #define SNR_M2M_PCI_PMON_UMASK_EXT 0xff
371 : :
372 : : /* SNR IMC */
373 : : #define SNR_IMC_MMIO_PMON_FIXED_CTL 0x54
374 : : #define SNR_IMC_MMIO_PMON_FIXED_CTR 0x38
375 : : #define SNR_IMC_MMIO_PMON_CTL0 0x40
376 : : #define SNR_IMC_MMIO_PMON_CTR0 0x8
377 : : #define SNR_IMC_MMIO_PMON_BOX_CTL 0x22800
378 : : #define SNR_IMC_MMIO_OFFSET 0x4000
379 : : #define SNR_IMC_MMIO_SIZE 0x4000
380 : : #define SNR_IMC_MMIO_BASE_OFFSET 0xd0
381 : : #define SNR_IMC_MMIO_BASE_MASK 0x1FFFFFFF
382 : : #define SNR_IMC_MMIO_MEM0_OFFSET 0xd8
383 : : #define SNR_IMC_MMIO_MEM0_MASK 0x7FF
384 : :
385 : 0 : DEFINE_UNCORE_FORMAT_ATTR(event, event, "config:0-7");
386 : 0 : DEFINE_UNCORE_FORMAT_ATTR(event2, event, "config:0-6");
387 : 0 : DEFINE_UNCORE_FORMAT_ATTR(event_ext, event, "config:0-7,21");
388 : 0 : DEFINE_UNCORE_FORMAT_ATTR(use_occ_ctr, use_occ_ctr, "config:7");
389 : 0 : DEFINE_UNCORE_FORMAT_ATTR(umask, umask, "config:8-15");
390 : 0 : DEFINE_UNCORE_FORMAT_ATTR(umask_ext, umask, "config:8-15,32-43,45-55");
391 : 0 : DEFINE_UNCORE_FORMAT_ATTR(umask_ext2, umask, "config:8-15,32-57");
392 : 0 : DEFINE_UNCORE_FORMAT_ATTR(umask_ext3, umask, "config:8-15,32-39");
393 : 0 : DEFINE_UNCORE_FORMAT_ATTR(qor, qor, "config:16");
394 : 0 : DEFINE_UNCORE_FORMAT_ATTR(edge, edge, "config:18");
395 : 0 : DEFINE_UNCORE_FORMAT_ATTR(tid_en, tid_en, "config:19");
396 : 0 : DEFINE_UNCORE_FORMAT_ATTR(inv, inv, "config:23");
397 : 0 : DEFINE_UNCORE_FORMAT_ATTR(thresh9, thresh, "config:24-35");
398 : 0 : DEFINE_UNCORE_FORMAT_ATTR(thresh8, thresh, "config:24-31");
399 : 0 : DEFINE_UNCORE_FORMAT_ATTR(thresh6, thresh, "config:24-29");
400 : 0 : DEFINE_UNCORE_FORMAT_ATTR(thresh5, thresh, "config:24-28");
401 : 0 : DEFINE_UNCORE_FORMAT_ATTR(occ_sel, occ_sel, "config:14-15");
402 : 0 : DEFINE_UNCORE_FORMAT_ATTR(occ_invert, occ_invert, "config:30");
403 : 0 : DEFINE_UNCORE_FORMAT_ATTR(occ_edge, occ_edge, "config:14-51");
404 : 0 : DEFINE_UNCORE_FORMAT_ATTR(occ_edge_det, occ_edge_det, "config:31");
405 : 0 : DEFINE_UNCORE_FORMAT_ATTR(ch_mask, ch_mask, "config:36-43");
406 : 0 : DEFINE_UNCORE_FORMAT_ATTR(ch_mask2, ch_mask, "config:36-47");
407 : 0 : DEFINE_UNCORE_FORMAT_ATTR(fc_mask, fc_mask, "config:44-46");
408 : 0 : DEFINE_UNCORE_FORMAT_ATTR(fc_mask2, fc_mask, "config:48-50");
409 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_tid, filter_tid, "config1:0-4");
410 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_tid2, filter_tid, "config1:0");
411 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_tid3, filter_tid, "config1:0-5");
412 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_tid4, filter_tid, "config1:0-8");
413 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_tid5, filter_tid, "config1:0-9");
414 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_cid, filter_cid, "config1:5");
415 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_link, filter_link, "config1:5-8");
416 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_link2, filter_link, "config1:6-8");
417 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_link3, filter_link, "config1:12");
418 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_nid, filter_nid, "config1:10-17");
419 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_nid2, filter_nid, "config1:32-47");
420 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_state, filter_state, "config1:18-22");
421 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_state2, filter_state, "config1:17-22");
422 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_state3, filter_state, "config1:17-23");
423 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_state4, filter_state, "config1:18-20");
424 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_state5, filter_state, "config1:17-26");
425 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_rem, filter_rem, "config1:32");
426 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_loc, filter_loc, "config1:33");
427 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_nm, filter_nm, "config1:36");
428 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_not_nm, filter_not_nm, "config1:37");
429 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_local, filter_local, "config1:33");
430 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_all_op, filter_all_op, "config1:35");
431 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_nnm, filter_nnm, "config1:37");
432 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_opc, filter_opc, "config1:23-31");
433 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_opc2, filter_opc, "config1:52-60");
434 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_opc3, filter_opc, "config1:41-60");
435 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_opc_0, filter_opc0, "config1:41-50");
436 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_opc_1, filter_opc1, "config1:51-60");
437 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_nc, filter_nc, "config1:62");
438 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_c6, filter_c6, "config1:61");
439 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_isoc, filter_isoc, "config1:63");
440 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_band0, filter_band0, "config1:0-7");
441 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_band1, filter_band1, "config1:8-15");
442 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_band2, filter_band2, "config1:16-23");
443 : 0 : DEFINE_UNCORE_FORMAT_ATTR(filter_band3, filter_band3, "config1:24-31");
444 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_rds, match_rds, "config1:48-51");
445 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_rnid30, match_rnid30, "config1:32-35");
446 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_rnid4, match_rnid4, "config1:31");
447 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_dnid, match_dnid, "config1:13-17");
448 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_mc, match_mc, "config1:9-12");
449 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_opc, match_opc, "config1:5-8");
450 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match_vnw, match_vnw, "config1:3-4");
451 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match0, match0, "config1:0-31");
452 : 0 : DEFINE_UNCORE_FORMAT_ATTR(match1, match1, "config1:32-63");
453 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_rds, mask_rds, "config2:48-51");
454 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_rnid30, mask_rnid30, "config2:32-35");
455 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_rnid4, mask_rnid4, "config2:31");
456 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_dnid, mask_dnid, "config2:13-17");
457 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_mc, mask_mc, "config2:9-12");
458 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_opc, mask_opc, "config2:5-8");
459 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask_vnw, mask_vnw, "config2:3-4");
460 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask0, mask0, "config2:0-31");
461 : 0 : DEFINE_UNCORE_FORMAT_ATTR(mask1, mask1, "config2:32-63");
462 : :
463 : 0 : static void snbep_uncore_pci_disable_box(struct intel_uncore_box *box)
464 : : {
465 : 0 : struct pci_dev *pdev = box->pci_dev;
466 : 0 : int box_ctl = uncore_pci_box_ctl(box);
467 : 0 : u32 config = 0;
468 : :
469 [ # # ]: 0 : if (!pci_read_config_dword(pdev, box_ctl, &config)) {
470 : 0 : config |= SNBEP_PMON_BOX_CTL_FRZ;
471 : 0 : pci_write_config_dword(pdev, box_ctl, config);
472 : : }
473 : 0 : }
474 : :
475 : 0 : static void snbep_uncore_pci_enable_box(struct intel_uncore_box *box)
476 : : {
477 : 0 : struct pci_dev *pdev = box->pci_dev;
478 : 0 : int box_ctl = uncore_pci_box_ctl(box);
479 : 0 : u32 config = 0;
480 : :
481 [ # # ]: 0 : if (!pci_read_config_dword(pdev, box_ctl, &config)) {
482 : 0 : config &= ~SNBEP_PMON_BOX_CTL_FRZ;
483 : 0 : pci_write_config_dword(pdev, box_ctl, config);
484 : : }
485 : 0 : }
486 : :
487 : 0 : static void snbep_uncore_pci_enable_event(struct intel_uncore_box *box, struct perf_event *event)
488 : : {
489 : 0 : struct pci_dev *pdev = box->pci_dev;
490 : 0 : struct hw_perf_event *hwc = &event->hw;
491 : :
492 : 0 : pci_write_config_dword(pdev, hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
493 : 0 : }
494 : :
495 : 0 : static void snbep_uncore_pci_disable_event(struct intel_uncore_box *box, struct perf_event *event)
496 : : {
497 : 0 : struct pci_dev *pdev = box->pci_dev;
498 : 0 : struct hw_perf_event *hwc = &event->hw;
499 : :
500 : 0 : pci_write_config_dword(pdev, hwc->config_base, hwc->config);
501 : 0 : }
502 : :
503 : 0 : static u64 snbep_uncore_pci_read_counter(struct intel_uncore_box *box, struct perf_event *event)
504 : : {
505 : 0 : struct pci_dev *pdev = box->pci_dev;
506 : 0 : struct hw_perf_event *hwc = &event->hw;
507 : 0 : u64 count = 0;
508 : :
509 : 0 : pci_read_config_dword(pdev, hwc->event_base, (u32 *)&count);
510 : 0 : pci_read_config_dword(pdev, hwc->event_base + 4, (u32 *)&count + 1);
511 : :
512 : 0 : return count;
513 : : }
514 : :
515 : 0 : static void snbep_uncore_pci_init_box(struct intel_uncore_box *box)
516 : : {
517 : 0 : struct pci_dev *pdev = box->pci_dev;
518 : 0 : int box_ctl = uncore_pci_box_ctl(box);
519 : :
520 : 0 : pci_write_config_dword(pdev, box_ctl, SNBEP_PMON_BOX_CTL_INT);
521 : 0 : }
522 : :
523 : 0 : static void snbep_uncore_msr_disable_box(struct intel_uncore_box *box)
524 : : {
525 : 0 : u64 config;
526 : 0 : unsigned msr;
527 : :
528 [ # # ]: 0 : msr = uncore_msr_box_ctl(box);
529 [ # # ]: 0 : if (msr) {
530 : 0 : rdmsrl(msr, config);
531 : 0 : config |= SNBEP_PMON_BOX_CTL_FRZ;
532 : 0 : wrmsrl(msr, config);
533 : : }
534 : 0 : }
535 : :
536 : 0 : static void snbep_uncore_msr_enable_box(struct intel_uncore_box *box)
537 : : {
538 : 0 : u64 config;
539 : 0 : unsigned msr;
540 : :
541 [ # # ]: 0 : msr = uncore_msr_box_ctl(box);
542 [ # # ]: 0 : if (msr) {
543 : 0 : rdmsrl(msr, config);
544 : 0 : config &= ~SNBEP_PMON_BOX_CTL_FRZ;
545 : 0 : wrmsrl(msr, config);
546 : : }
547 : 0 : }
548 : :
549 : 0 : static void snbep_uncore_msr_enable_event(struct intel_uncore_box *box, struct perf_event *event)
550 : : {
551 : 0 : struct hw_perf_event *hwc = &event->hw;
552 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
553 : :
554 [ # # ]: 0 : if (reg1->idx != EXTRA_REG_NONE)
555 : 0 : wrmsrl(reg1->reg, uncore_shared_reg_config(box, 0));
556 : :
557 : 0 : wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
558 : 0 : }
559 : :
560 : 0 : static void snbep_uncore_msr_disable_event(struct intel_uncore_box *box,
561 : : struct perf_event *event)
562 : : {
563 : 0 : struct hw_perf_event *hwc = &event->hw;
564 : :
565 : 0 : wrmsrl(hwc->config_base, hwc->config);
566 : 0 : }
567 : :
568 : 0 : static void snbep_uncore_msr_init_box(struct intel_uncore_box *box)
569 : : {
570 [ # # ]: 0 : unsigned msr = uncore_msr_box_ctl(box);
571 : :
572 [ # # ]: 0 : if (msr)
573 : 0 : wrmsrl(msr, SNBEP_PMON_BOX_CTL_INT);
574 : 0 : }
575 : :
576 : : static struct attribute *snbep_uncore_formats_attr[] = {
577 : : &format_attr_event.attr,
578 : : &format_attr_umask.attr,
579 : : &format_attr_edge.attr,
580 : : &format_attr_inv.attr,
581 : : &format_attr_thresh8.attr,
582 : : NULL,
583 : : };
584 : :
585 : : static struct attribute *snbep_uncore_ubox_formats_attr[] = {
586 : : &format_attr_event.attr,
587 : : &format_attr_umask.attr,
588 : : &format_attr_edge.attr,
589 : : &format_attr_inv.attr,
590 : : &format_attr_thresh5.attr,
591 : : NULL,
592 : : };
593 : :
594 : : static struct attribute *snbep_uncore_cbox_formats_attr[] = {
595 : : &format_attr_event.attr,
596 : : &format_attr_umask.attr,
597 : : &format_attr_edge.attr,
598 : : &format_attr_tid_en.attr,
599 : : &format_attr_inv.attr,
600 : : &format_attr_thresh8.attr,
601 : : &format_attr_filter_tid.attr,
602 : : &format_attr_filter_nid.attr,
603 : : &format_attr_filter_state.attr,
604 : : &format_attr_filter_opc.attr,
605 : : NULL,
606 : : };
607 : :
608 : : static struct attribute *snbep_uncore_pcu_formats_attr[] = {
609 : : &format_attr_event.attr,
610 : : &format_attr_occ_sel.attr,
611 : : &format_attr_edge.attr,
612 : : &format_attr_inv.attr,
613 : : &format_attr_thresh5.attr,
614 : : &format_attr_occ_invert.attr,
615 : : &format_attr_occ_edge.attr,
616 : : &format_attr_filter_band0.attr,
617 : : &format_attr_filter_band1.attr,
618 : : &format_attr_filter_band2.attr,
619 : : &format_attr_filter_band3.attr,
620 : : NULL,
621 : : };
622 : :
623 : : static struct attribute *snbep_uncore_qpi_formats_attr[] = {
624 : : &format_attr_event_ext.attr,
625 : : &format_attr_umask.attr,
626 : : &format_attr_edge.attr,
627 : : &format_attr_inv.attr,
628 : : &format_attr_thresh8.attr,
629 : : &format_attr_match_rds.attr,
630 : : &format_attr_match_rnid30.attr,
631 : : &format_attr_match_rnid4.attr,
632 : : &format_attr_match_dnid.attr,
633 : : &format_attr_match_mc.attr,
634 : : &format_attr_match_opc.attr,
635 : : &format_attr_match_vnw.attr,
636 : : &format_attr_match0.attr,
637 : : &format_attr_match1.attr,
638 : : &format_attr_mask_rds.attr,
639 : : &format_attr_mask_rnid30.attr,
640 : : &format_attr_mask_rnid4.attr,
641 : : &format_attr_mask_dnid.attr,
642 : : &format_attr_mask_mc.attr,
643 : : &format_attr_mask_opc.attr,
644 : : &format_attr_mask_vnw.attr,
645 : : &format_attr_mask0.attr,
646 : : &format_attr_mask1.attr,
647 : : NULL,
648 : : };
649 : :
650 : : static struct uncore_event_desc snbep_uncore_imc_events[] = {
651 : : INTEL_UNCORE_EVENT_DESC(clockticks, "event=0xff,umask=0x00"),
652 : : INTEL_UNCORE_EVENT_DESC(cas_count_read, "event=0x04,umask=0x03"),
653 : : INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
654 : : INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
655 : : INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x0c"),
656 : : INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
657 : : INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
658 : : { /* end: all zeroes */ },
659 : : };
660 : :
661 : : static struct uncore_event_desc snbep_uncore_qpi_events[] = {
662 : : INTEL_UNCORE_EVENT_DESC(clockticks, "event=0x14"),
663 : : INTEL_UNCORE_EVENT_DESC(txl_flits_active, "event=0x00,umask=0x06"),
664 : : INTEL_UNCORE_EVENT_DESC(drs_data, "event=0x102,umask=0x08"),
665 : : INTEL_UNCORE_EVENT_DESC(ncb_data, "event=0x103,umask=0x04"),
666 : : { /* end: all zeroes */ },
667 : : };
668 : :
669 : : static const struct attribute_group snbep_uncore_format_group = {
670 : : .name = "format",
671 : : .attrs = snbep_uncore_formats_attr,
672 : : };
673 : :
674 : : static const struct attribute_group snbep_uncore_ubox_format_group = {
675 : : .name = "format",
676 : : .attrs = snbep_uncore_ubox_formats_attr,
677 : : };
678 : :
679 : : static const struct attribute_group snbep_uncore_cbox_format_group = {
680 : : .name = "format",
681 : : .attrs = snbep_uncore_cbox_formats_attr,
682 : : };
683 : :
684 : : static const struct attribute_group snbep_uncore_pcu_format_group = {
685 : : .name = "format",
686 : : .attrs = snbep_uncore_pcu_formats_attr,
687 : : };
688 : :
689 : : static const struct attribute_group snbep_uncore_qpi_format_group = {
690 : : .name = "format",
691 : : .attrs = snbep_uncore_qpi_formats_attr,
692 : : };
693 : :
694 : : #define __SNBEP_UNCORE_MSR_OPS_COMMON_INIT() \
695 : : .disable_box = snbep_uncore_msr_disable_box, \
696 : : .enable_box = snbep_uncore_msr_enable_box, \
697 : : .disable_event = snbep_uncore_msr_disable_event, \
698 : : .enable_event = snbep_uncore_msr_enable_event, \
699 : : .read_counter = uncore_msr_read_counter
700 : :
701 : : #define SNBEP_UNCORE_MSR_OPS_COMMON_INIT() \
702 : : __SNBEP_UNCORE_MSR_OPS_COMMON_INIT(), \
703 : : .init_box = snbep_uncore_msr_init_box \
704 : :
705 : : static struct intel_uncore_ops snbep_uncore_msr_ops = {
706 : : SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
707 : : };
708 : :
709 : : #define SNBEP_UNCORE_PCI_OPS_COMMON_INIT() \
710 : : .init_box = snbep_uncore_pci_init_box, \
711 : : .disable_box = snbep_uncore_pci_disable_box, \
712 : : .enable_box = snbep_uncore_pci_enable_box, \
713 : : .disable_event = snbep_uncore_pci_disable_event, \
714 : : .read_counter = snbep_uncore_pci_read_counter
715 : :
716 : : static struct intel_uncore_ops snbep_uncore_pci_ops = {
717 : : SNBEP_UNCORE_PCI_OPS_COMMON_INIT(),
718 : : .enable_event = snbep_uncore_pci_enable_event, \
719 : : };
720 : :
721 : : static struct event_constraint snbep_uncore_cbox_constraints[] = {
722 : : UNCORE_EVENT_CONSTRAINT(0x01, 0x1),
723 : : UNCORE_EVENT_CONSTRAINT(0x02, 0x3),
724 : : UNCORE_EVENT_CONSTRAINT(0x04, 0x3),
725 : : UNCORE_EVENT_CONSTRAINT(0x05, 0x3),
726 : : UNCORE_EVENT_CONSTRAINT(0x07, 0x3),
727 : : UNCORE_EVENT_CONSTRAINT(0x09, 0x3),
728 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
729 : : UNCORE_EVENT_CONSTRAINT(0x12, 0x3),
730 : : UNCORE_EVENT_CONSTRAINT(0x13, 0x3),
731 : : UNCORE_EVENT_CONSTRAINT(0x1b, 0xc),
732 : : UNCORE_EVENT_CONSTRAINT(0x1c, 0xc),
733 : : UNCORE_EVENT_CONSTRAINT(0x1d, 0xc),
734 : : UNCORE_EVENT_CONSTRAINT(0x1e, 0xc),
735 : : UNCORE_EVENT_CONSTRAINT(0x1f, 0xe),
736 : : UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
737 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
738 : : UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
739 : : UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
740 : : UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
741 : : UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
742 : : UNCORE_EVENT_CONSTRAINT(0x35, 0x3),
743 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
744 : : UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
745 : : UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
746 : : UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
747 : : UNCORE_EVENT_CONSTRAINT(0x3b, 0x1),
748 : : EVENT_CONSTRAINT_END
749 : : };
750 : :
751 : : static struct event_constraint snbep_uncore_r2pcie_constraints[] = {
752 : : UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
753 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
754 : : UNCORE_EVENT_CONSTRAINT(0x12, 0x1),
755 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
756 : : UNCORE_EVENT_CONSTRAINT(0x24, 0x3),
757 : : UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
758 : : UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
759 : : UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
760 : : UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
761 : : UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
762 : : EVENT_CONSTRAINT_END
763 : : };
764 : :
765 : : static struct event_constraint snbep_uncore_r3qpi_constraints[] = {
766 : : UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
767 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
768 : : UNCORE_EVENT_CONSTRAINT(0x12, 0x3),
769 : : UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
770 : : UNCORE_EVENT_CONSTRAINT(0x20, 0x3),
771 : : UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
772 : : UNCORE_EVENT_CONSTRAINT(0x22, 0x3),
773 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
774 : : UNCORE_EVENT_CONSTRAINT(0x24, 0x3),
775 : : UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
776 : : UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
777 : : UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
778 : : UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
779 : : UNCORE_EVENT_CONSTRAINT(0x2a, 0x3),
780 : : UNCORE_EVENT_CONSTRAINT(0x2b, 0x3),
781 : : UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
782 : : UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
783 : : UNCORE_EVENT_CONSTRAINT(0x2e, 0x3),
784 : : UNCORE_EVENT_CONSTRAINT(0x2f, 0x3),
785 : : UNCORE_EVENT_CONSTRAINT(0x30, 0x3),
786 : : UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
787 : : UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
788 : : UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
789 : : UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
790 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x3),
791 : : UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
792 : : UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
793 : : UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
794 : : EVENT_CONSTRAINT_END
795 : : };
796 : :
797 : : static struct intel_uncore_type snbep_uncore_ubox = {
798 : : .name = "ubox",
799 : : .num_counters = 2,
800 : : .num_boxes = 1,
801 : : .perf_ctr_bits = 44,
802 : : .fixed_ctr_bits = 48,
803 : : .perf_ctr = SNBEP_U_MSR_PMON_CTR0,
804 : : .event_ctl = SNBEP_U_MSR_PMON_CTL0,
805 : : .event_mask = SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
806 : : .fixed_ctr = SNBEP_U_MSR_PMON_UCLK_FIXED_CTR,
807 : : .fixed_ctl = SNBEP_U_MSR_PMON_UCLK_FIXED_CTL,
808 : : .ops = &snbep_uncore_msr_ops,
809 : : .format_group = &snbep_uncore_ubox_format_group,
810 : : };
811 : :
812 : : static struct extra_reg snbep_uncore_cbox_extra_regs[] = {
813 : : SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
814 : : SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
815 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
816 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0x6),
817 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
818 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0x6),
819 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
820 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0x6),
821 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6),
822 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8),
823 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8),
824 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0xa),
825 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0xa),
826 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x2),
827 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x2),
828 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x2),
829 : : SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x2),
830 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x8),
831 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x8),
832 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0xa),
833 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0xa),
834 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x2),
835 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x2),
836 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x2),
837 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4037, 0x40ff, 0x2),
838 : : EVENT_EXTRA_END
839 : : };
840 : :
841 : 0 : static void snbep_cbox_put_constraint(struct intel_uncore_box *box, struct perf_event *event)
842 : : {
843 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
844 : 0 : struct intel_uncore_extra_reg *er = &box->shared_regs[0];
845 : 0 : int i;
846 : :
847 [ # # ]: 0 : if (uncore_box_is_fake(box))
848 : : return;
849 : :
850 [ # # ]: 0 : for (i = 0; i < 5; i++) {
851 [ # # ]: 0 : if (reg1->alloc & (0x1 << i))
852 : 0 : atomic_sub(1 << (i * 6), &er->ref);
853 : : }
854 : 0 : reg1->alloc = 0;
855 : : }
856 : :
857 : : static struct event_constraint *
858 : 0 : __snbep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event,
859 : : u64 (*cbox_filter_mask)(int fields))
860 : : {
861 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
862 : 0 : struct intel_uncore_extra_reg *er = &box->shared_regs[0];
863 : 0 : int i, alloc = 0;
864 : 0 : unsigned long flags;
865 : 0 : u64 mask;
866 : :
867 [ # # ]: 0 : if (reg1->idx == EXTRA_REG_NONE)
868 : : return NULL;
869 : :
870 : 0 : raw_spin_lock_irqsave(&er->lock, flags);
871 [ # # ]: 0 : for (i = 0; i < 5; i++) {
872 [ # # ]: 0 : if (!(reg1->idx & (0x1 << i)))
873 : 0 : continue;
874 [ # # # # ]: 0 : if (!uncore_box_is_fake(box) && (reg1->alloc & (0x1 << i)))
875 : 0 : continue;
876 : :
877 : 0 : mask = cbox_filter_mask(0x1 << i);
878 [ # # ]: 0 : if (!__BITS_VALUE(atomic_read(&er->ref), i, 6) ||
879 [ # # ]: 0 : !((reg1->config ^ er->config) & mask)) {
880 : 0 : atomic_add(1 << (i * 6), &er->ref);
881 : 0 : er->config &= ~mask;
882 : 0 : er->config |= reg1->config & mask;
883 : 0 : alloc |= (0x1 << i);
884 : : } else {
885 : : break;
886 : : }
887 : : }
888 : 0 : raw_spin_unlock_irqrestore(&er->lock, flags);
889 [ # # ]: 0 : if (i < 5)
890 : 0 : goto fail;
891 : :
892 [ # # ]: 0 : if (!uncore_box_is_fake(box))
893 : 0 : reg1->alloc |= alloc;
894 : :
895 : : return NULL;
896 : : fail:
897 [ # # ]: 0 : for (; i >= 0; i--) {
898 [ # # ]: 0 : if (alloc & (0x1 << i))
899 : 0 : atomic_sub(1 << (i * 6), &er->ref);
900 : : }
901 : : return &uncore_constraint_empty;
902 : : }
903 : :
904 : 0 : static u64 snbep_cbox_filter_mask(int fields)
905 : : {
906 : 0 : u64 mask = 0;
907 : :
908 [ # # ]: 0 : if (fields & 0x1)
909 : 0 : mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_TID;
910 [ # # # # ]: 0 : if (fields & 0x2)
911 : 0 : mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_NID;
912 [ # # # # ]: 0 : if (fields & 0x4)
913 : 0 : mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_STATE;
914 [ # # # # ]: 0 : if (fields & 0x8)
915 : 0 : mask |= SNBEP_CB0_MSR_PMON_BOX_FILTER_OPC;
916 : :
917 : 0 : return mask;
918 : : }
919 : :
920 : : static struct event_constraint *
921 : 0 : snbep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
922 : : {
923 : 0 : return __snbep_cbox_get_constraint(box, event, snbep_cbox_filter_mask);
924 : : }
925 : :
926 : 0 : static int snbep_cbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
927 : : {
928 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
929 : 0 : struct extra_reg *er;
930 : 0 : int idx = 0;
931 : :
932 [ # # ]: 0 : for (er = snbep_uncore_cbox_extra_regs; er->msr; er++) {
933 [ # # ]: 0 : if (er->event != (event->hw.config & er->config_mask))
934 : 0 : continue;
935 : 0 : idx |= er->idx;
936 : : }
937 : :
938 [ # # ]: 0 : if (idx) {
939 : 0 : reg1->reg = SNBEP_C0_MSR_PMON_BOX_FILTER +
940 : 0 : SNBEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
941 [ # # ]: 0 : reg1->config = event->attr.config1 & snbep_cbox_filter_mask(idx);
942 : 0 : reg1->idx = idx;
943 : : }
944 : 0 : return 0;
945 : : }
946 : :
947 : : static struct intel_uncore_ops snbep_uncore_cbox_ops = {
948 : : SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
949 : : .hw_config = snbep_cbox_hw_config,
950 : : .get_constraint = snbep_cbox_get_constraint,
951 : : .put_constraint = snbep_cbox_put_constraint,
952 : : };
953 : :
954 : : static struct intel_uncore_type snbep_uncore_cbox = {
955 : : .name = "cbox",
956 : : .num_counters = 4,
957 : : .num_boxes = 8,
958 : : .perf_ctr_bits = 44,
959 : : .event_ctl = SNBEP_C0_MSR_PMON_CTL0,
960 : : .perf_ctr = SNBEP_C0_MSR_PMON_CTR0,
961 : : .event_mask = SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
962 : : .box_ctl = SNBEP_C0_MSR_PMON_BOX_CTL,
963 : : .msr_offset = SNBEP_CBO_MSR_OFFSET,
964 : : .num_shared_regs = 1,
965 : : .constraints = snbep_uncore_cbox_constraints,
966 : : .ops = &snbep_uncore_cbox_ops,
967 : : .format_group = &snbep_uncore_cbox_format_group,
968 : : };
969 : :
970 : 0 : static u64 snbep_pcu_alter_er(struct perf_event *event, int new_idx, bool modify)
971 : : {
972 : 0 : struct hw_perf_event *hwc = &event->hw;
973 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
974 : 0 : u64 config = reg1->config;
975 : :
976 : 0 : if (new_idx > reg1->idx)
977 : 0 : config <<= 8 * (new_idx - reg1->idx);
978 : : else
979 : 0 : config >>= 8 * (reg1->idx - new_idx);
980 : :
981 : 0 : if (modify) {
982 : 0 : hwc->config += new_idx - reg1->idx;
983 : 0 : reg1->config = config;
984 : 0 : reg1->idx = new_idx;
985 : : }
986 : 0 : return config;
987 : : }
988 : :
989 : : static struct event_constraint *
990 : 0 : snbep_pcu_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
991 : : {
992 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
993 : 0 : struct intel_uncore_extra_reg *er = &box->shared_regs[0];
994 : 0 : unsigned long flags;
995 : 0 : int idx = reg1->idx;
996 : 0 : u64 mask, config1 = reg1->config;
997 : 0 : bool ok = false;
998 : :
999 [ # # # # ]: 0 : if (reg1->idx == EXTRA_REG_NONE ||
1000 [ # # # # ]: 0 : (!uncore_box_is_fake(box) && reg1->alloc))
1001 : : return NULL;
1002 : 0 : again:
1003 : 0 : mask = 0xffULL << (idx * 8);
1004 : 0 : raw_spin_lock_irqsave(&er->lock, flags);
1005 [ # # ]: 0 : if (!__BITS_VALUE(atomic_read(&er->ref), idx, 8) ||
1006 [ # # ]: 0 : !((config1 ^ er->config) & mask)) {
1007 : 0 : atomic_add(1 << (idx * 8), &er->ref);
1008 : 0 : er->config &= ~mask;
1009 : 0 : er->config |= config1 & mask;
1010 : 0 : ok = true;
1011 : : }
1012 : 0 : raw_spin_unlock_irqrestore(&er->lock, flags);
1013 : :
1014 [ # # ]: 0 : if (!ok) {
1015 : 0 : idx = (idx + 1) % 4;
1016 [ # # ]: 0 : if (idx != reg1->idx) {
1017 [ # # ]: 0 : config1 = snbep_pcu_alter_er(event, idx, false);
1018 : 0 : goto again;
1019 : : }
1020 : : return &uncore_constraint_empty;
1021 : : }
1022 : :
1023 [ # # ]: 0 : if (!uncore_box_is_fake(box)) {
1024 [ # # ]: 0 : if (idx != reg1->idx)
1025 [ # # ]: 0 : snbep_pcu_alter_er(event, idx, true);
1026 : 0 : reg1->alloc = 1;
1027 : : }
1028 : : return NULL;
1029 : : }
1030 : :
1031 : 0 : static void snbep_pcu_put_constraint(struct intel_uncore_box *box, struct perf_event *event)
1032 : : {
1033 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
1034 : 0 : struct intel_uncore_extra_reg *er = &box->shared_regs[0];
1035 : :
1036 [ # # # # ]: 0 : if (uncore_box_is_fake(box) || !reg1->alloc)
1037 : : return;
1038 : :
1039 : 0 : atomic_sub(1 << (reg1->idx * 8), &er->ref);
1040 : 0 : reg1->alloc = 0;
1041 : : }
1042 : :
1043 : 0 : static int snbep_pcu_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1044 : : {
1045 : 0 : struct hw_perf_event *hwc = &event->hw;
1046 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1047 : 0 : int ev_sel = hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK;
1048 : :
1049 [ # # ]: 0 : if (ev_sel >= 0xb && ev_sel <= 0xe) {
1050 : 0 : reg1->reg = SNBEP_PCU_MSR_PMON_BOX_FILTER;
1051 : 0 : reg1->idx = ev_sel - 0xb;
1052 : 0 : reg1->config = event->attr.config1 & (0xff << (reg1->idx * 8));
1053 : : }
1054 : 0 : return 0;
1055 : : }
1056 : :
1057 : : static struct intel_uncore_ops snbep_uncore_pcu_ops = {
1058 : : SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1059 : : .hw_config = snbep_pcu_hw_config,
1060 : : .get_constraint = snbep_pcu_get_constraint,
1061 : : .put_constraint = snbep_pcu_put_constraint,
1062 : : };
1063 : :
1064 : : static struct intel_uncore_type snbep_uncore_pcu = {
1065 : : .name = "pcu",
1066 : : .num_counters = 4,
1067 : : .num_boxes = 1,
1068 : : .perf_ctr_bits = 48,
1069 : : .perf_ctr = SNBEP_PCU_MSR_PMON_CTR0,
1070 : : .event_ctl = SNBEP_PCU_MSR_PMON_CTL0,
1071 : : .event_mask = SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
1072 : : .box_ctl = SNBEP_PCU_MSR_PMON_BOX_CTL,
1073 : : .num_shared_regs = 1,
1074 : : .ops = &snbep_uncore_pcu_ops,
1075 : : .format_group = &snbep_uncore_pcu_format_group,
1076 : : };
1077 : :
1078 : : static struct intel_uncore_type *snbep_msr_uncores[] = {
1079 : : &snbep_uncore_ubox,
1080 : : &snbep_uncore_cbox,
1081 : : &snbep_uncore_pcu,
1082 : : NULL,
1083 : : };
1084 : :
1085 : 0 : void snbep_uncore_cpu_init(void)
1086 : : {
1087 [ # # ]: 0 : if (snbep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
1088 : 0 : snbep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
1089 : 0 : uncore_msr_uncores = snbep_msr_uncores;
1090 : 0 : }
1091 : :
1092 : : enum {
1093 : : SNBEP_PCI_QPI_PORT0_FILTER,
1094 : : SNBEP_PCI_QPI_PORT1_FILTER,
1095 : : BDX_PCI_QPI_PORT2_FILTER,
1096 : : HSWEP_PCI_PCU_3,
1097 : : };
1098 : :
1099 : 0 : static int snbep_qpi_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1100 : : {
1101 : 0 : struct hw_perf_event *hwc = &event->hw;
1102 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1103 : 0 : struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
1104 : :
1105 [ # # ]: 0 : if ((hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK) == 0x38) {
1106 : 0 : reg1->idx = 0;
1107 : 0 : reg1->reg = SNBEP_Q_Py_PCI_PMON_PKT_MATCH0;
1108 : 0 : reg1->config = event->attr.config1;
1109 : 0 : reg2->reg = SNBEP_Q_Py_PCI_PMON_PKT_MASK0;
1110 : 0 : reg2->config = event->attr.config2;
1111 : : }
1112 : 0 : return 0;
1113 : : }
1114 : :
1115 : 0 : static void snbep_qpi_enable_event(struct intel_uncore_box *box, struct perf_event *event)
1116 : : {
1117 : 0 : struct pci_dev *pdev = box->pci_dev;
1118 : 0 : struct hw_perf_event *hwc = &event->hw;
1119 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1120 : 0 : struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
1121 : :
1122 [ # # ]: 0 : if (reg1->idx != EXTRA_REG_NONE) {
1123 : 0 : int idx = box->pmu->pmu_idx + SNBEP_PCI_QPI_PORT0_FILTER;
1124 : 0 : int die = box->dieid;
1125 : 0 : struct pci_dev *filter_pdev = uncore_extra_pci_dev[die].dev[idx];
1126 : :
1127 [ # # ]: 0 : if (filter_pdev) {
1128 : 0 : pci_write_config_dword(filter_pdev, reg1->reg,
1129 : 0 : (u32)reg1->config);
1130 : 0 : pci_write_config_dword(filter_pdev, reg1->reg + 4,
1131 : 0 : (u32)(reg1->config >> 32));
1132 : 0 : pci_write_config_dword(filter_pdev, reg2->reg,
1133 : 0 : (u32)reg2->config);
1134 : 0 : pci_write_config_dword(filter_pdev, reg2->reg + 4,
1135 : 0 : (u32)(reg2->config >> 32));
1136 : : }
1137 : : }
1138 : :
1139 : 0 : pci_write_config_dword(pdev, hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
1140 : 0 : }
1141 : :
1142 : : static struct intel_uncore_ops snbep_uncore_qpi_ops = {
1143 : : SNBEP_UNCORE_PCI_OPS_COMMON_INIT(),
1144 : : .enable_event = snbep_qpi_enable_event,
1145 : : .hw_config = snbep_qpi_hw_config,
1146 : : .get_constraint = uncore_get_constraint,
1147 : : .put_constraint = uncore_put_constraint,
1148 : : };
1149 : :
1150 : : #define SNBEP_UNCORE_PCI_COMMON_INIT() \
1151 : : .perf_ctr = SNBEP_PCI_PMON_CTR0, \
1152 : : .event_ctl = SNBEP_PCI_PMON_CTL0, \
1153 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK, \
1154 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL, \
1155 : : .ops = &snbep_uncore_pci_ops, \
1156 : : .format_group = &snbep_uncore_format_group
1157 : :
1158 : : static struct intel_uncore_type snbep_uncore_ha = {
1159 : : .name = "ha",
1160 : : .num_counters = 4,
1161 : : .num_boxes = 1,
1162 : : .perf_ctr_bits = 48,
1163 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
1164 : : };
1165 : :
1166 : : static struct intel_uncore_type snbep_uncore_imc = {
1167 : : .name = "imc",
1168 : : .num_counters = 4,
1169 : : .num_boxes = 4,
1170 : : .perf_ctr_bits = 48,
1171 : : .fixed_ctr_bits = 48,
1172 : : .fixed_ctr = SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
1173 : : .fixed_ctl = SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
1174 : : .event_descs = snbep_uncore_imc_events,
1175 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
1176 : : };
1177 : :
1178 : : static struct intel_uncore_type snbep_uncore_qpi = {
1179 : : .name = "qpi",
1180 : : .num_counters = 4,
1181 : : .num_boxes = 2,
1182 : : .perf_ctr_bits = 48,
1183 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
1184 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
1185 : : .event_mask = SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
1186 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
1187 : : .num_shared_regs = 1,
1188 : : .ops = &snbep_uncore_qpi_ops,
1189 : : .event_descs = snbep_uncore_qpi_events,
1190 : : .format_group = &snbep_uncore_qpi_format_group,
1191 : : };
1192 : :
1193 : :
1194 : : static struct intel_uncore_type snbep_uncore_r2pcie = {
1195 : : .name = "r2pcie",
1196 : : .num_counters = 4,
1197 : : .num_boxes = 1,
1198 : : .perf_ctr_bits = 44,
1199 : : .constraints = snbep_uncore_r2pcie_constraints,
1200 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
1201 : : };
1202 : :
1203 : : static struct intel_uncore_type snbep_uncore_r3qpi = {
1204 : : .name = "r3qpi",
1205 : : .num_counters = 3,
1206 : : .num_boxes = 2,
1207 : : .perf_ctr_bits = 44,
1208 : : .constraints = snbep_uncore_r3qpi_constraints,
1209 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
1210 : : };
1211 : :
1212 : : enum {
1213 : : SNBEP_PCI_UNCORE_HA,
1214 : : SNBEP_PCI_UNCORE_IMC,
1215 : : SNBEP_PCI_UNCORE_QPI,
1216 : : SNBEP_PCI_UNCORE_R2PCIE,
1217 : : SNBEP_PCI_UNCORE_R3QPI,
1218 : : };
1219 : :
1220 : : static struct intel_uncore_type *snbep_pci_uncores[] = {
1221 : : [SNBEP_PCI_UNCORE_HA] = &snbep_uncore_ha,
1222 : : [SNBEP_PCI_UNCORE_IMC] = &snbep_uncore_imc,
1223 : : [SNBEP_PCI_UNCORE_QPI] = &snbep_uncore_qpi,
1224 : : [SNBEP_PCI_UNCORE_R2PCIE] = &snbep_uncore_r2pcie,
1225 : : [SNBEP_PCI_UNCORE_R3QPI] = &snbep_uncore_r3qpi,
1226 : : NULL,
1227 : : };
1228 : :
1229 : : static const struct pci_device_id snbep_uncore_pci_ids[] = {
1230 : : { /* Home Agent */
1231 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_HA),
1232 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_HA, 0),
1233 : : },
1234 : : { /* MC Channel 0 */
1235 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC0),
1236 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 0),
1237 : : },
1238 : : { /* MC Channel 1 */
1239 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC1),
1240 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 1),
1241 : : },
1242 : : { /* MC Channel 2 */
1243 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC2),
1244 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 2),
1245 : : },
1246 : : { /* MC Channel 3 */
1247 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC3),
1248 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 3),
1249 : : },
1250 : : { /* QPI Port 0 */
1251 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI0),
1252 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_QPI, 0),
1253 : : },
1254 : : { /* QPI Port 1 */
1255 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI1),
1256 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_QPI, 1),
1257 : : },
1258 : : { /* R2PCIe */
1259 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R2PCIE),
1260 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R2PCIE, 0),
1261 : : },
1262 : : { /* R3QPI Link 0 */
1263 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI0),
1264 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R3QPI, 0),
1265 : : },
1266 : : { /* R3QPI Link 1 */
1267 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI1),
1268 : : .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R3QPI, 1),
1269 : : },
1270 : : { /* QPI Port 0 filter */
1271 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3c86),
1272 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
1273 : : SNBEP_PCI_QPI_PORT0_FILTER),
1274 : : },
1275 : : { /* QPI Port 0 filter */
1276 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3c96),
1277 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
1278 : : SNBEP_PCI_QPI_PORT1_FILTER),
1279 : : },
1280 : : { /* end: all zeroes */ }
1281 : : };
1282 : :
1283 : : static struct pci_driver snbep_uncore_pci_driver = {
1284 : : .name = "snbep_uncore",
1285 : : .id_table = snbep_uncore_pci_ids,
1286 : : };
1287 : :
1288 : : #define NODE_ID_MASK 0x7
1289 : :
1290 : : /*
1291 : : * build pci bus to socket mapping
1292 : : */
1293 : 0 : static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool reverse)
1294 : : {
1295 : 0 : struct pci_dev *ubox_dev = NULL;
1296 : 0 : int i, bus, nodeid, segment;
1297 : 0 : struct pci2phy_map *map;
1298 : 0 : int err = 0;
1299 : 0 : u32 config = 0;
1300 : :
1301 : 0 : while (1) {
1302 : : /* find the UBOX device */
1303 : 0 : ubox_dev = pci_get_device(PCI_VENDOR_ID_INTEL, devid, ubox_dev);
1304 [ # # ]: 0 : if (!ubox_dev)
1305 : : break;
1306 : 0 : bus = ubox_dev->bus->number;
1307 : : /* get the Node ID of the local register */
1308 : 0 : err = pci_read_config_dword(ubox_dev, nodeid_loc, &config);
1309 [ # # ]: 0 : if (err)
1310 : : break;
1311 : 0 : nodeid = config & NODE_ID_MASK;
1312 : : /* get the Node ID mapping */
1313 : 0 : err = pci_read_config_dword(ubox_dev, idmap_loc, &config);
1314 [ # # ]: 0 : if (err)
1315 : : break;
1316 : :
1317 : 0 : segment = pci_domain_nr(ubox_dev->bus);
1318 : 0 : raw_spin_lock(&pci2phy_map_lock);
1319 : 0 : map = __find_pci2phy_map(segment);
1320 [ # # ]: 0 : if (!map) {
1321 : 0 : raw_spin_unlock(&pci2phy_map_lock);
1322 : 0 : err = -ENOMEM;
1323 : 0 : break;
1324 : : }
1325 : :
1326 : : /*
1327 : : * every three bits in the Node ID mapping register maps
1328 : : * to a particular node.
1329 : : */
1330 [ # # ]: 0 : for (i = 0; i < 8; i++) {
1331 [ # # ]: 0 : if (nodeid == ((config >> (3 * i)) & 0x7)) {
1332 : 0 : map->pbus_to_physid[bus] = i;
1333 : 0 : break;
1334 : : }
1335 : : }
1336 : 0 : raw_spin_unlock(&pci2phy_map_lock);
1337 : : }
1338 : :
1339 [ # # ]: 0 : if (!err) {
1340 : : /*
1341 : : * For PCI bus with no UBOX device, find the next bus
1342 : : * that has UBOX device and use its mapping.
1343 : : */
1344 : 0 : raw_spin_lock(&pci2phy_map_lock);
1345 [ # # ]: 0 : list_for_each_entry(map, &pci2phy_map_head, list) {
1346 : 0 : i = -1;
1347 [ # # ]: 0 : if (reverse) {
1348 [ # # ]: 0 : for (bus = 255; bus >= 0; bus--) {
1349 [ # # ]: 0 : if (map->pbus_to_physid[bus] >= 0)
1350 : : i = map->pbus_to_physid[bus];
1351 : : else
1352 : 0 : map->pbus_to_physid[bus] = i;
1353 : : }
1354 : : } else {
1355 [ # # ]: 0 : for (bus = 0; bus <= 255; bus++) {
1356 [ # # ]: 0 : if (map->pbus_to_physid[bus] >= 0)
1357 : : i = map->pbus_to_physid[bus];
1358 : : else
1359 : 0 : map->pbus_to_physid[bus] = i;
1360 : : }
1361 : : }
1362 : : }
1363 : 0 : raw_spin_unlock(&pci2phy_map_lock);
1364 : : }
1365 : :
1366 : 0 : pci_dev_put(ubox_dev);
1367 : :
1368 [ # # ]: 0 : return err ? pcibios_err_to_errno(err) : 0;
1369 : : }
1370 : :
1371 : 0 : int snbep_uncore_pci_init(void)
1372 : : {
1373 : 0 : int ret = snbep_pci2phy_map_init(0x3ce0, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
1374 [ # # ]: 0 : if (ret)
1375 : : return ret;
1376 : 0 : uncore_pci_uncores = snbep_pci_uncores;
1377 : 0 : uncore_pci_driver = &snbep_uncore_pci_driver;
1378 : 0 : return 0;
1379 : : }
1380 : : /* end of Sandy Bridge-EP uncore support */
1381 : :
1382 : : /* IvyTown uncore support */
1383 : 0 : static void ivbep_uncore_msr_init_box(struct intel_uncore_box *box)
1384 : : {
1385 [ # # ]: 0 : unsigned msr = uncore_msr_box_ctl(box);
1386 [ # # ]: 0 : if (msr)
1387 : 0 : wrmsrl(msr, IVBEP_PMON_BOX_CTL_INT);
1388 : 0 : }
1389 : :
1390 : 0 : static void ivbep_uncore_pci_init_box(struct intel_uncore_box *box)
1391 : : {
1392 : 0 : struct pci_dev *pdev = box->pci_dev;
1393 : :
1394 : 0 : pci_write_config_dword(pdev, SNBEP_PCI_PMON_BOX_CTL, IVBEP_PMON_BOX_CTL_INT);
1395 : 0 : }
1396 : :
1397 : : #define IVBEP_UNCORE_MSR_OPS_COMMON_INIT() \
1398 : : .init_box = ivbep_uncore_msr_init_box, \
1399 : : .disable_box = snbep_uncore_msr_disable_box, \
1400 : : .enable_box = snbep_uncore_msr_enable_box, \
1401 : : .disable_event = snbep_uncore_msr_disable_event, \
1402 : : .enable_event = snbep_uncore_msr_enable_event, \
1403 : : .read_counter = uncore_msr_read_counter
1404 : :
1405 : : static struct intel_uncore_ops ivbep_uncore_msr_ops = {
1406 : : IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1407 : : };
1408 : :
1409 : : static struct intel_uncore_ops ivbep_uncore_pci_ops = {
1410 : : .init_box = ivbep_uncore_pci_init_box,
1411 : : .disable_box = snbep_uncore_pci_disable_box,
1412 : : .enable_box = snbep_uncore_pci_enable_box,
1413 : : .disable_event = snbep_uncore_pci_disable_event,
1414 : : .enable_event = snbep_uncore_pci_enable_event,
1415 : : .read_counter = snbep_uncore_pci_read_counter,
1416 : : };
1417 : :
1418 : : #define IVBEP_UNCORE_PCI_COMMON_INIT() \
1419 : : .perf_ctr = SNBEP_PCI_PMON_CTR0, \
1420 : : .event_ctl = SNBEP_PCI_PMON_CTL0, \
1421 : : .event_mask = IVBEP_PMON_RAW_EVENT_MASK, \
1422 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL, \
1423 : : .ops = &ivbep_uncore_pci_ops, \
1424 : : .format_group = &ivbep_uncore_format_group
1425 : :
1426 : : static struct attribute *ivbep_uncore_formats_attr[] = {
1427 : : &format_attr_event.attr,
1428 : : &format_attr_umask.attr,
1429 : : &format_attr_edge.attr,
1430 : : &format_attr_inv.attr,
1431 : : &format_attr_thresh8.attr,
1432 : : NULL,
1433 : : };
1434 : :
1435 : : static struct attribute *ivbep_uncore_ubox_formats_attr[] = {
1436 : : &format_attr_event.attr,
1437 : : &format_attr_umask.attr,
1438 : : &format_attr_edge.attr,
1439 : : &format_attr_inv.attr,
1440 : : &format_attr_thresh5.attr,
1441 : : NULL,
1442 : : };
1443 : :
1444 : : static struct attribute *ivbep_uncore_cbox_formats_attr[] = {
1445 : : &format_attr_event.attr,
1446 : : &format_attr_umask.attr,
1447 : : &format_attr_edge.attr,
1448 : : &format_attr_tid_en.attr,
1449 : : &format_attr_thresh8.attr,
1450 : : &format_attr_filter_tid.attr,
1451 : : &format_attr_filter_link.attr,
1452 : : &format_attr_filter_state2.attr,
1453 : : &format_attr_filter_nid2.attr,
1454 : : &format_attr_filter_opc2.attr,
1455 : : &format_attr_filter_nc.attr,
1456 : : &format_attr_filter_c6.attr,
1457 : : &format_attr_filter_isoc.attr,
1458 : : NULL,
1459 : : };
1460 : :
1461 : : static struct attribute *ivbep_uncore_pcu_formats_attr[] = {
1462 : : &format_attr_event.attr,
1463 : : &format_attr_occ_sel.attr,
1464 : : &format_attr_edge.attr,
1465 : : &format_attr_thresh5.attr,
1466 : : &format_attr_occ_invert.attr,
1467 : : &format_attr_occ_edge.attr,
1468 : : &format_attr_filter_band0.attr,
1469 : : &format_attr_filter_band1.attr,
1470 : : &format_attr_filter_band2.attr,
1471 : : &format_attr_filter_band3.attr,
1472 : : NULL,
1473 : : };
1474 : :
1475 : : static struct attribute *ivbep_uncore_qpi_formats_attr[] = {
1476 : : &format_attr_event_ext.attr,
1477 : : &format_attr_umask.attr,
1478 : : &format_attr_edge.attr,
1479 : : &format_attr_thresh8.attr,
1480 : : &format_attr_match_rds.attr,
1481 : : &format_attr_match_rnid30.attr,
1482 : : &format_attr_match_rnid4.attr,
1483 : : &format_attr_match_dnid.attr,
1484 : : &format_attr_match_mc.attr,
1485 : : &format_attr_match_opc.attr,
1486 : : &format_attr_match_vnw.attr,
1487 : : &format_attr_match0.attr,
1488 : : &format_attr_match1.attr,
1489 : : &format_attr_mask_rds.attr,
1490 : : &format_attr_mask_rnid30.attr,
1491 : : &format_attr_mask_rnid4.attr,
1492 : : &format_attr_mask_dnid.attr,
1493 : : &format_attr_mask_mc.attr,
1494 : : &format_attr_mask_opc.attr,
1495 : : &format_attr_mask_vnw.attr,
1496 : : &format_attr_mask0.attr,
1497 : : &format_attr_mask1.attr,
1498 : : NULL,
1499 : : };
1500 : :
1501 : : static const struct attribute_group ivbep_uncore_format_group = {
1502 : : .name = "format",
1503 : : .attrs = ivbep_uncore_formats_attr,
1504 : : };
1505 : :
1506 : : static const struct attribute_group ivbep_uncore_ubox_format_group = {
1507 : : .name = "format",
1508 : : .attrs = ivbep_uncore_ubox_formats_attr,
1509 : : };
1510 : :
1511 : : static const struct attribute_group ivbep_uncore_cbox_format_group = {
1512 : : .name = "format",
1513 : : .attrs = ivbep_uncore_cbox_formats_attr,
1514 : : };
1515 : :
1516 : : static const struct attribute_group ivbep_uncore_pcu_format_group = {
1517 : : .name = "format",
1518 : : .attrs = ivbep_uncore_pcu_formats_attr,
1519 : : };
1520 : :
1521 : : static const struct attribute_group ivbep_uncore_qpi_format_group = {
1522 : : .name = "format",
1523 : : .attrs = ivbep_uncore_qpi_formats_attr,
1524 : : };
1525 : :
1526 : : static struct intel_uncore_type ivbep_uncore_ubox = {
1527 : : .name = "ubox",
1528 : : .num_counters = 2,
1529 : : .num_boxes = 1,
1530 : : .perf_ctr_bits = 44,
1531 : : .fixed_ctr_bits = 48,
1532 : : .perf_ctr = SNBEP_U_MSR_PMON_CTR0,
1533 : : .event_ctl = SNBEP_U_MSR_PMON_CTL0,
1534 : : .event_mask = IVBEP_U_MSR_PMON_RAW_EVENT_MASK,
1535 : : .fixed_ctr = SNBEP_U_MSR_PMON_UCLK_FIXED_CTR,
1536 : : .fixed_ctl = SNBEP_U_MSR_PMON_UCLK_FIXED_CTL,
1537 : : .ops = &ivbep_uncore_msr_ops,
1538 : : .format_group = &ivbep_uncore_ubox_format_group,
1539 : : };
1540 : :
1541 : : static struct extra_reg ivbep_uncore_cbox_extra_regs[] = {
1542 : : SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
1543 : : SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
1544 : : SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2),
1545 : : SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
1546 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc),
1547 : : SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc),
1548 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
1549 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0xc),
1550 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
1551 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0xc),
1552 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
1553 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0xc),
1554 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10),
1555 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10),
1556 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10),
1557 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2335, 0xffff, 0x10),
1558 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0x18),
1559 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0x18),
1560 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x8),
1561 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x8),
1562 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x8),
1563 : : SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x8),
1564 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8135, 0xffff, 0x10),
1565 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8335, 0xffff, 0x10),
1566 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x10),
1567 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x10),
1568 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2136, 0xffff, 0x10),
1569 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10),
1570 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0x18),
1571 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0x18),
1572 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x8),
1573 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x8),
1574 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x8),
1575 : : SNBEP_CBO_EVENT_EXTRA_REG(0x5036, 0xffff, 0x8),
1576 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8136, 0xffff, 0x10),
1577 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8336, 0xffff, 0x10),
1578 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4037, 0x40ff, 0x8),
1579 : : EVENT_EXTRA_END
1580 : : };
1581 : :
1582 : 0 : static u64 ivbep_cbox_filter_mask(int fields)
1583 : : {
1584 : 0 : u64 mask = 0;
1585 : :
1586 [ # # ]: 0 : if (fields & 0x1)
1587 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_TID;
1588 [ # # ]: 0 : if (fields & 0x2)
1589 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_LINK;
1590 [ # # ]: 0 : if (fields & 0x4)
1591 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_STATE;
1592 [ # # ]: 0 : if (fields & 0x8)
1593 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_NID;
1594 [ # # ]: 0 : if (fields & 0x10) {
1595 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_OPC;
1596 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_NC;
1597 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_C6;
1598 : 0 : mask |= IVBEP_CB0_MSR_PMON_BOX_FILTER_ISOC;
1599 : : }
1600 : :
1601 : 0 : return mask;
1602 : : }
1603 : :
1604 : : static struct event_constraint *
1605 : 0 : ivbep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
1606 : : {
1607 : 0 : return __snbep_cbox_get_constraint(box, event, ivbep_cbox_filter_mask);
1608 : : }
1609 : :
1610 : 0 : static int ivbep_cbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
1611 : : {
1612 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
1613 : 0 : struct extra_reg *er;
1614 : 0 : int idx = 0;
1615 : :
1616 [ # # ]: 0 : for (er = ivbep_uncore_cbox_extra_regs; er->msr; er++) {
1617 [ # # ]: 0 : if (er->event != (event->hw.config & er->config_mask))
1618 : 0 : continue;
1619 : 0 : idx |= er->idx;
1620 : : }
1621 : :
1622 [ # # ]: 0 : if (idx) {
1623 : 0 : reg1->reg = SNBEP_C0_MSR_PMON_BOX_FILTER +
1624 : 0 : SNBEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
1625 : 0 : reg1->config = event->attr.config1 & ivbep_cbox_filter_mask(idx);
1626 : 0 : reg1->idx = idx;
1627 : : }
1628 : 0 : return 0;
1629 : : }
1630 : :
1631 : 0 : static void ivbep_cbox_enable_event(struct intel_uncore_box *box, struct perf_event *event)
1632 : : {
1633 : 0 : struct hw_perf_event *hwc = &event->hw;
1634 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
1635 : :
1636 [ # # ]: 0 : if (reg1->idx != EXTRA_REG_NONE) {
1637 : 0 : u64 filter = uncore_shared_reg_config(box, 0);
1638 : 0 : wrmsrl(reg1->reg, filter & 0xffffffff);
1639 : 0 : wrmsrl(reg1->reg + 6, filter >> 32);
1640 : : }
1641 : :
1642 : 0 : wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
1643 : 0 : }
1644 : :
1645 : : static struct intel_uncore_ops ivbep_uncore_cbox_ops = {
1646 : : .init_box = ivbep_uncore_msr_init_box,
1647 : : .disable_box = snbep_uncore_msr_disable_box,
1648 : : .enable_box = snbep_uncore_msr_enable_box,
1649 : : .disable_event = snbep_uncore_msr_disable_event,
1650 : : .enable_event = ivbep_cbox_enable_event,
1651 : : .read_counter = uncore_msr_read_counter,
1652 : : .hw_config = ivbep_cbox_hw_config,
1653 : : .get_constraint = ivbep_cbox_get_constraint,
1654 : : .put_constraint = snbep_cbox_put_constraint,
1655 : : };
1656 : :
1657 : : static struct intel_uncore_type ivbep_uncore_cbox = {
1658 : : .name = "cbox",
1659 : : .num_counters = 4,
1660 : : .num_boxes = 15,
1661 : : .perf_ctr_bits = 44,
1662 : : .event_ctl = SNBEP_C0_MSR_PMON_CTL0,
1663 : : .perf_ctr = SNBEP_C0_MSR_PMON_CTR0,
1664 : : .event_mask = IVBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
1665 : : .box_ctl = SNBEP_C0_MSR_PMON_BOX_CTL,
1666 : : .msr_offset = SNBEP_CBO_MSR_OFFSET,
1667 : : .num_shared_regs = 1,
1668 : : .constraints = snbep_uncore_cbox_constraints,
1669 : : .ops = &ivbep_uncore_cbox_ops,
1670 : : .format_group = &ivbep_uncore_cbox_format_group,
1671 : : };
1672 : :
1673 : : static struct intel_uncore_ops ivbep_uncore_pcu_ops = {
1674 : : IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
1675 : : .hw_config = snbep_pcu_hw_config,
1676 : : .get_constraint = snbep_pcu_get_constraint,
1677 : : .put_constraint = snbep_pcu_put_constraint,
1678 : : };
1679 : :
1680 : : static struct intel_uncore_type ivbep_uncore_pcu = {
1681 : : .name = "pcu",
1682 : : .num_counters = 4,
1683 : : .num_boxes = 1,
1684 : : .perf_ctr_bits = 48,
1685 : : .perf_ctr = SNBEP_PCU_MSR_PMON_CTR0,
1686 : : .event_ctl = SNBEP_PCU_MSR_PMON_CTL0,
1687 : : .event_mask = IVBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
1688 : : .box_ctl = SNBEP_PCU_MSR_PMON_BOX_CTL,
1689 : : .num_shared_regs = 1,
1690 : : .ops = &ivbep_uncore_pcu_ops,
1691 : : .format_group = &ivbep_uncore_pcu_format_group,
1692 : : };
1693 : :
1694 : : static struct intel_uncore_type *ivbep_msr_uncores[] = {
1695 : : &ivbep_uncore_ubox,
1696 : : &ivbep_uncore_cbox,
1697 : : &ivbep_uncore_pcu,
1698 : : NULL,
1699 : : };
1700 : :
1701 : 0 : void ivbep_uncore_cpu_init(void)
1702 : : {
1703 [ # # ]: 0 : if (ivbep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
1704 : 0 : ivbep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
1705 : 0 : uncore_msr_uncores = ivbep_msr_uncores;
1706 : 0 : }
1707 : :
1708 : : static struct intel_uncore_type ivbep_uncore_ha = {
1709 : : .name = "ha",
1710 : : .num_counters = 4,
1711 : : .num_boxes = 2,
1712 : : .perf_ctr_bits = 48,
1713 : : IVBEP_UNCORE_PCI_COMMON_INIT(),
1714 : : };
1715 : :
1716 : : static struct intel_uncore_type ivbep_uncore_imc = {
1717 : : .name = "imc",
1718 : : .num_counters = 4,
1719 : : .num_boxes = 8,
1720 : : .perf_ctr_bits = 48,
1721 : : .fixed_ctr_bits = 48,
1722 : : .fixed_ctr = SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
1723 : : .fixed_ctl = SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
1724 : : .event_descs = snbep_uncore_imc_events,
1725 : : IVBEP_UNCORE_PCI_COMMON_INIT(),
1726 : : };
1727 : :
1728 : : /* registers in IRP boxes are not properly aligned */
1729 : : static unsigned ivbep_uncore_irp_ctls[] = {0xd8, 0xdc, 0xe0, 0xe4};
1730 : : static unsigned ivbep_uncore_irp_ctrs[] = {0xa0, 0xb0, 0xb8, 0xc0};
1731 : :
1732 : 0 : static void ivbep_uncore_irp_enable_event(struct intel_uncore_box *box, struct perf_event *event)
1733 : : {
1734 : 0 : struct pci_dev *pdev = box->pci_dev;
1735 : 0 : struct hw_perf_event *hwc = &event->hw;
1736 : :
1737 : 0 : pci_write_config_dword(pdev, ivbep_uncore_irp_ctls[hwc->idx],
1738 : 0 : hwc->config | SNBEP_PMON_CTL_EN);
1739 : 0 : }
1740 : :
1741 : 0 : static void ivbep_uncore_irp_disable_event(struct intel_uncore_box *box, struct perf_event *event)
1742 : : {
1743 : 0 : struct pci_dev *pdev = box->pci_dev;
1744 : 0 : struct hw_perf_event *hwc = &event->hw;
1745 : :
1746 : 0 : pci_write_config_dword(pdev, ivbep_uncore_irp_ctls[hwc->idx], hwc->config);
1747 : 0 : }
1748 : :
1749 : 0 : static u64 ivbep_uncore_irp_read_counter(struct intel_uncore_box *box, struct perf_event *event)
1750 : : {
1751 : 0 : struct pci_dev *pdev = box->pci_dev;
1752 : 0 : struct hw_perf_event *hwc = &event->hw;
1753 : 0 : u64 count = 0;
1754 : :
1755 : 0 : pci_read_config_dword(pdev, ivbep_uncore_irp_ctrs[hwc->idx], (u32 *)&count);
1756 : 0 : pci_read_config_dword(pdev, ivbep_uncore_irp_ctrs[hwc->idx] + 4, (u32 *)&count + 1);
1757 : :
1758 : 0 : return count;
1759 : : }
1760 : :
1761 : : static struct intel_uncore_ops ivbep_uncore_irp_ops = {
1762 : : .init_box = ivbep_uncore_pci_init_box,
1763 : : .disable_box = snbep_uncore_pci_disable_box,
1764 : : .enable_box = snbep_uncore_pci_enable_box,
1765 : : .disable_event = ivbep_uncore_irp_disable_event,
1766 : : .enable_event = ivbep_uncore_irp_enable_event,
1767 : : .read_counter = ivbep_uncore_irp_read_counter,
1768 : : };
1769 : :
1770 : : static struct intel_uncore_type ivbep_uncore_irp = {
1771 : : .name = "irp",
1772 : : .num_counters = 4,
1773 : : .num_boxes = 1,
1774 : : .perf_ctr_bits = 48,
1775 : : .event_mask = IVBEP_PMON_RAW_EVENT_MASK,
1776 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
1777 : : .ops = &ivbep_uncore_irp_ops,
1778 : : .format_group = &ivbep_uncore_format_group,
1779 : : };
1780 : :
1781 : : static struct intel_uncore_ops ivbep_uncore_qpi_ops = {
1782 : : .init_box = ivbep_uncore_pci_init_box,
1783 : : .disable_box = snbep_uncore_pci_disable_box,
1784 : : .enable_box = snbep_uncore_pci_enable_box,
1785 : : .disable_event = snbep_uncore_pci_disable_event,
1786 : : .enable_event = snbep_qpi_enable_event,
1787 : : .read_counter = snbep_uncore_pci_read_counter,
1788 : : .hw_config = snbep_qpi_hw_config,
1789 : : .get_constraint = uncore_get_constraint,
1790 : : .put_constraint = uncore_put_constraint,
1791 : : };
1792 : :
1793 : : static struct intel_uncore_type ivbep_uncore_qpi = {
1794 : : .name = "qpi",
1795 : : .num_counters = 4,
1796 : : .num_boxes = 3,
1797 : : .perf_ctr_bits = 48,
1798 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
1799 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
1800 : : .event_mask = IVBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
1801 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
1802 : : .num_shared_regs = 1,
1803 : : .ops = &ivbep_uncore_qpi_ops,
1804 : : .format_group = &ivbep_uncore_qpi_format_group,
1805 : : };
1806 : :
1807 : : static struct intel_uncore_type ivbep_uncore_r2pcie = {
1808 : : .name = "r2pcie",
1809 : : .num_counters = 4,
1810 : : .num_boxes = 1,
1811 : : .perf_ctr_bits = 44,
1812 : : .constraints = snbep_uncore_r2pcie_constraints,
1813 : : IVBEP_UNCORE_PCI_COMMON_INIT(),
1814 : : };
1815 : :
1816 : : static struct intel_uncore_type ivbep_uncore_r3qpi = {
1817 : : .name = "r3qpi",
1818 : : .num_counters = 3,
1819 : : .num_boxes = 2,
1820 : : .perf_ctr_bits = 44,
1821 : : .constraints = snbep_uncore_r3qpi_constraints,
1822 : : IVBEP_UNCORE_PCI_COMMON_INIT(),
1823 : : };
1824 : :
1825 : : enum {
1826 : : IVBEP_PCI_UNCORE_HA,
1827 : : IVBEP_PCI_UNCORE_IMC,
1828 : : IVBEP_PCI_UNCORE_IRP,
1829 : : IVBEP_PCI_UNCORE_QPI,
1830 : : IVBEP_PCI_UNCORE_R2PCIE,
1831 : : IVBEP_PCI_UNCORE_R3QPI,
1832 : : };
1833 : :
1834 : : static struct intel_uncore_type *ivbep_pci_uncores[] = {
1835 : : [IVBEP_PCI_UNCORE_HA] = &ivbep_uncore_ha,
1836 : : [IVBEP_PCI_UNCORE_IMC] = &ivbep_uncore_imc,
1837 : : [IVBEP_PCI_UNCORE_IRP] = &ivbep_uncore_irp,
1838 : : [IVBEP_PCI_UNCORE_QPI] = &ivbep_uncore_qpi,
1839 : : [IVBEP_PCI_UNCORE_R2PCIE] = &ivbep_uncore_r2pcie,
1840 : : [IVBEP_PCI_UNCORE_R3QPI] = &ivbep_uncore_r3qpi,
1841 : : NULL,
1842 : : };
1843 : :
1844 : : static const struct pci_device_id ivbep_uncore_pci_ids[] = {
1845 : : { /* Home Agent 0 */
1846 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe30),
1847 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_HA, 0),
1848 : : },
1849 : : { /* Home Agent 1 */
1850 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe38),
1851 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_HA, 1),
1852 : : },
1853 : : { /* MC0 Channel 0 */
1854 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb4),
1855 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 0),
1856 : : },
1857 : : { /* MC0 Channel 1 */
1858 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb5),
1859 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 1),
1860 : : },
1861 : : { /* MC0 Channel 3 */
1862 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb0),
1863 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 2),
1864 : : },
1865 : : { /* MC0 Channel 4 */
1866 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb1),
1867 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 3),
1868 : : },
1869 : : { /* MC1 Channel 0 */
1870 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef4),
1871 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 4),
1872 : : },
1873 : : { /* MC1 Channel 1 */
1874 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef5),
1875 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 5),
1876 : : },
1877 : : { /* MC1 Channel 3 */
1878 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef0),
1879 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 6),
1880 : : },
1881 : : { /* MC1 Channel 4 */
1882 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef1),
1883 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IMC, 7),
1884 : : },
1885 : : { /* IRP */
1886 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe39),
1887 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_IRP, 0),
1888 : : },
1889 : : { /* QPI0 Port 0 */
1890 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe32),
1891 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_QPI, 0),
1892 : : },
1893 : : { /* QPI0 Port 1 */
1894 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe33),
1895 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_QPI, 1),
1896 : : },
1897 : : { /* QPI1 Port 2 */
1898 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3a),
1899 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_QPI, 2),
1900 : : },
1901 : : { /* R2PCIe */
1902 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe34),
1903 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R2PCIE, 0),
1904 : : },
1905 : : { /* R3QPI0 Link 0 */
1906 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe36),
1907 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R3QPI, 0),
1908 : : },
1909 : : { /* R3QPI0 Link 1 */
1910 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe37),
1911 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R3QPI, 1),
1912 : : },
1913 : : { /* R3QPI1 Link 2 */
1914 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3e),
1915 : : .driver_data = UNCORE_PCI_DEV_DATA(IVBEP_PCI_UNCORE_R3QPI, 2),
1916 : : },
1917 : : { /* QPI Port 0 filter */
1918 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe86),
1919 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
1920 : : SNBEP_PCI_QPI_PORT0_FILTER),
1921 : : },
1922 : : { /* QPI Port 0 filter */
1923 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe96),
1924 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
1925 : : SNBEP_PCI_QPI_PORT1_FILTER),
1926 : : },
1927 : : { /* end: all zeroes */ }
1928 : : };
1929 : :
1930 : : static struct pci_driver ivbep_uncore_pci_driver = {
1931 : : .name = "ivbep_uncore",
1932 : : .id_table = ivbep_uncore_pci_ids,
1933 : : };
1934 : :
1935 : 0 : int ivbep_uncore_pci_init(void)
1936 : : {
1937 : 0 : int ret = snbep_pci2phy_map_init(0x0e1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
1938 [ # # ]: 0 : if (ret)
1939 : : return ret;
1940 : 0 : uncore_pci_uncores = ivbep_pci_uncores;
1941 : 0 : uncore_pci_driver = &ivbep_uncore_pci_driver;
1942 : 0 : return 0;
1943 : : }
1944 : : /* end of IvyTown uncore support */
1945 : :
1946 : : /* KNL uncore support */
1947 : : static struct attribute *knl_uncore_ubox_formats_attr[] = {
1948 : : &format_attr_event.attr,
1949 : : &format_attr_umask.attr,
1950 : : &format_attr_edge.attr,
1951 : : &format_attr_tid_en.attr,
1952 : : &format_attr_inv.attr,
1953 : : &format_attr_thresh5.attr,
1954 : : NULL,
1955 : : };
1956 : :
1957 : : static const struct attribute_group knl_uncore_ubox_format_group = {
1958 : : .name = "format",
1959 : : .attrs = knl_uncore_ubox_formats_attr,
1960 : : };
1961 : :
1962 : : static struct intel_uncore_type knl_uncore_ubox = {
1963 : : .name = "ubox",
1964 : : .num_counters = 2,
1965 : : .num_boxes = 1,
1966 : : .perf_ctr_bits = 48,
1967 : : .fixed_ctr_bits = 48,
1968 : : .perf_ctr = HSWEP_U_MSR_PMON_CTR0,
1969 : : .event_ctl = HSWEP_U_MSR_PMON_CTL0,
1970 : : .event_mask = KNL_U_MSR_PMON_RAW_EVENT_MASK,
1971 : : .fixed_ctr = HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
1972 : : .fixed_ctl = HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
1973 : : .ops = &snbep_uncore_msr_ops,
1974 : : .format_group = &knl_uncore_ubox_format_group,
1975 : : };
1976 : :
1977 : : static struct attribute *knl_uncore_cha_formats_attr[] = {
1978 : : &format_attr_event.attr,
1979 : : &format_attr_umask.attr,
1980 : : &format_attr_qor.attr,
1981 : : &format_attr_edge.attr,
1982 : : &format_attr_tid_en.attr,
1983 : : &format_attr_inv.attr,
1984 : : &format_attr_thresh8.attr,
1985 : : &format_attr_filter_tid4.attr,
1986 : : &format_attr_filter_link3.attr,
1987 : : &format_attr_filter_state4.attr,
1988 : : &format_attr_filter_local.attr,
1989 : : &format_attr_filter_all_op.attr,
1990 : : &format_attr_filter_nnm.attr,
1991 : : &format_attr_filter_opc3.attr,
1992 : : &format_attr_filter_nc.attr,
1993 : : &format_attr_filter_isoc.attr,
1994 : : NULL,
1995 : : };
1996 : :
1997 : : static const struct attribute_group knl_uncore_cha_format_group = {
1998 : : .name = "format",
1999 : : .attrs = knl_uncore_cha_formats_attr,
2000 : : };
2001 : :
2002 : : static struct event_constraint knl_uncore_cha_constraints[] = {
2003 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
2004 : : UNCORE_EVENT_CONSTRAINT(0x1f, 0x1),
2005 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
2006 : : EVENT_CONSTRAINT_END
2007 : : };
2008 : :
2009 : : static struct extra_reg knl_uncore_cha_extra_regs[] = {
2010 : : SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
2011 : : SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
2012 : : SNBEP_CBO_EVENT_EXTRA_REG(0x3d, 0xff, 0x2),
2013 : : SNBEP_CBO_EVENT_EXTRA_REG(0x35, 0xff, 0x4),
2014 : : SNBEP_CBO_EVENT_EXTRA_REG(0x36, 0xff, 0x4),
2015 : : EVENT_EXTRA_END
2016 : : };
2017 : :
2018 : 0 : static u64 knl_cha_filter_mask(int fields)
2019 : : {
2020 : 0 : u64 mask = 0;
2021 : :
2022 [ # # ]: 0 : if (fields & 0x1)
2023 : 0 : mask |= KNL_CHA_MSR_PMON_BOX_FILTER_TID;
2024 [ # # # # ]: 0 : if (fields & 0x2)
2025 : 0 : mask |= KNL_CHA_MSR_PMON_BOX_FILTER_STATE;
2026 [ # # # # ]: 0 : if (fields & 0x4)
2027 : 0 : mask |= KNL_CHA_MSR_PMON_BOX_FILTER_OP;
2028 : 0 : return mask;
2029 : : }
2030 : :
2031 : : static struct event_constraint *
2032 : 0 : knl_cha_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
2033 : : {
2034 : 0 : return __snbep_cbox_get_constraint(box, event, knl_cha_filter_mask);
2035 : : }
2036 : :
2037 : 0 : static int knl_cha_hw_config(struct intel_uncore_box *box,
2038 : : struct perf_event *event)
2039 : : {
2040 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
2041 : 0 : struct extra_reg *er;
2042 : 0 : int idx = 0;
2043 : :
2044 [ # # ]: 0 : for (er = knl_uncore_cha_extra_regs; er->msr; er++) {
2045 [ # # ]: 0 : if (er->event != (event->hw.config & er->config_mask))
2046 : 0 : continue;
2047 : 0 : idx |= er->idx;
2048 : : }
2049 : :
2050 [ # # ]: 0 : if (idx) {
2051 : 0 : reg1->reg = HSWEP_C0_MSR_PMON_BOX_FILTER0 +
2052 : 0 : KNL_CHA_MSR_OFFSET * box->pmu->pmu_idx;
2053 [ # # ]: 0 : reg1->config = event->attr.config1 & knl_cha_filter_mask(idx);
2054 : :
2055 : 0 : reg1->config |= KNL_CHA_MSR_PMON_BOX_FILTER_REMOTE_NODE;
2056 : 0 : reg1->config |= KNL_CHA_MSR_PMON_BOX_FILTER_LOCAL_NODE;
2057 : 0 : reg1->config |= KNL_CHA_MSR_PMON_BOX_FILTER_NNC;
2058 : 0 : reg1->idx = idx;
2059 : : }
2060 : 0 : return 0;
2061 : : }
2062 : :
2063 : : static void hswep_cbox_enable_event(struct intel_uncore_box *box,
2064 : : struct perf_event *event);
2065 : :
2066 : : static struct intel_uncore_ops knl_uncore_cha_ops = {
2067 : : .init_box = snbep_uncore_msr_init_box,
2068 : : .disable_box = snbep_uncore_msr_disable_box,
2069 : : .enable_box = snbep_uncore_msr_enable_box,
2070 : : .disable_event = snbep_uncore_msr_disable_event,
2071 : : .enable_event = hswep_cbox_enable_event,
2072 : : .read_counter = uncore_msr_read_counter,
2073 : : .hw_config = knl_cha_hw_config,
2074 : : .get_constraint = knl_cha_get_constraint,
2075 : : .put_constraint = snbep_cbox_put_constraint,
2076 : : };
2077 : :
2078 : : static struct intel_uncore_type knl_uncore_cha = {
2079 : : .name = "cha",
2080 : : .num_counters = 4,
2081 : : .num_boxes = 38,
2082 : : .perf_ctr_bits = 48,
2083 : : .event_ctl = HSWEP_C0_MSR_PMON_CTL0,
2084 : : .perf_ctr = HSWEP_C0_MSR_PMON_CTR0,
2085 : : .event_mask = KNL_CHA_MSR_PMON_RAW_EVENT_MASK,
2086 : : .box_ctl = HSWEP_C0_MSR_PMON_BOX_CTL,
2087 : : .msr_offset = KNL_CHA_MSR_OFFSET,
2088 : : .num_shared_regs = 1,
2089 : : .constraints = knl_uncore_cha_constraints,
2090 : : .ops = &knl_uncore_cha_ops,
2091 : : .format_group = &knl_uncore_cha_format_group,
2092 : : };
2093 : :
2094 : : static struct attribute *knl_uncore_pcu_formats_attr[] = {
2095 : : &format_attr_event2.attr,
2096 : : &format_attr_use_occ_ctr.attr,
2097 : : &format_attr_occ_sel.attr,
2098 : : &format_attr_edge.attr,
2099 : : &format_attr_tid_en.attr,
2100 : : &format_attr_inv.attr,
2101 : : &format_attr_thresh6.attr,
2102 : : &format_attr_occ_invert.attr,
2103 : : &format_attr_occ_edge_det.attr,
2104 : : NULL,
2105 : : };
2106 : :
2107 : : static const struct attribute_group knl_uncore_pcu_format_group = {
2108 : : .name = "format",
2109 : : .attrs = knl_uncore_pcu_formats_attr,
2110 : : };
2111 : :
2112 : : static struct intel_uncore_type knl_uncore_pcu = {
2113 : : .name = "pcu",
2114 : : .num_counters = 4,
2115 : : .num_boxes = 1,
2116 : : .perf_ctr_bits = 48,
2117 : : .perf_ctr = HSWEP_PCU_MSR_PMON_CTR0,
2118 : : .event_ctl = HSWEP_PCU_MSR_PMON_CTL0,
2119 : : .event_mask = KNL_PCU_MSR_PMON_RAW_EVENT_MASK,
2120 : : .box_ctl = HSWEP_PCU_MSR_PMON_BOX_CTL,
2121 : : .ops = &snbep_uncore_msr_ops,
2122 : : .format_group = &knl_uncore_pcu_format_group,
2123 : : };
2124 : :
2125 : : static struct intel_uncore_type *knl_msr_uncores[] = {
2126 : : &knl_uncore_ubox,
2127 : : &knl_uncore_cha,
2128 : : &knl_uncore_pcu,
2129 : : NULL,
2130 : : };
2131 : :
2132 : 0 : void knl_uncore_cpu_init(void)
2133 : : {
2134 : 0 : uncore_msr_uncores = knl_msr_uncores;
2135 : 0 : }
2136 : :
2137 : 0 : static void knl_uncore_imc_enable_box(struct intel_uncore_box *box)
2138 : : {
2139 : 0 : struct pci_dev *pdev = box->pci_dev;
2140 : 0 : int box_ctl = uncore_pci_box_ctl(box);
2141 : :
2142 : 0 : pci_write_config_dword(pdev, box_ctl, 0);
2143 : 0 : }
2144 : :
2145 : 0 : static void knl_uncore_imc_enable_event(struct intel_uncore_box *box,
2146 : : struct perf_event *event)
2147 : : {
2148 : 0 : struct pci_dev *pdev = box->pci_dev;
2149 : 0 : struct hw_perf_event *hwc = &event->hw;
2150 : :
2151 [ # # ]: 0 : if ((event->attr.config & SNBEP_PMON_CTL_EV_SEL_MASK)
2152 : : == UNCORE_FIXED_EVENT)
2153 : 0 : pci_write_config_dword(pdev, hwc->config_base,
2154 : 0 : hwc->config | KNL_PMON_FIXED_CTL_EN);
2155 : : else
2156 : 0 : pci_write_config_dword(pdev, hwc->config_base,
2157 : 0 : hwc->config | SNBEP_PMON_CTL_EN);
2158 : 0 : }
2159 : :
2160 : : static struct intel_uncore_ops knl_uncore_imc_ops = {
2161 : : .init_box = snbep_uncore_pci_init_box,
2162 : : .disable_box = snbep_uncore_pci_disable_box,
2163 : : .enable_box = knl_uncore_imc_enable_box,
2164 : : .read_counter = snbep_uncore_pci_read_counter,
2165 : : .enable_event = knl_uncore_imc_enable_event,
2166 : : .disable_event = snbep_uncore_pci_disable_event,
2167 : : };
2168 : :
2169 : : static struct intel_uncore_type knl_uncore_imc_uclk = {
2170 : : .name = "imc_uclk",
2171 : : .num_counters = 4,
2172 : : .num_boxes = 2,
2173 : : .perf_ctr_bits = 48,
2174 : : .fixed_ctr_bits = 48,
2175 : : .perf_ctr = KNL_UCLK_MSR_PMON_CTR0_LOW,
2176 : : .event_ctl = KNL_UCLK_MSR_PMON_CTL0,
2177 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
2178 : : .fixed_ctr = KNL_UCLK_MSR_PMON_UCLK_FIXED_LOW,
2179 : : .fixed_ctl = KNL_UCLK_MSR_PMON_UCLK_FIXED_CTL,
2180 : : .box_ctl = KNL_UCLK_MSR_PMON_BOX_CTL,
2181 : : .ops = &knl_uncore_imc_ops,
2182 : : .format_group = &snbep_uncore_format_group,
2183 : : };
2184 : :
2185 : : static struct intel_uncore_type knl_uncore_imc_dclk = {
2186 : : .name = "imc",
2187 : : .num_counters = 4,
2188 : : .num_boxes = 6,
2189 : : .perf_ctr_bits = 48,
2190 : : .fixed_ctr_bits = 48,
2191 : : .perf_ctr = KNL_MC0_CH0_MSR_PMON_CTR0_LOW,
2192 : : .event_ctl = KNL_MC0_CH0_MSR_PMON_CTL0,
2193 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
2194 : : .fixed_ctr = KNL_MC0_CH0_MSR_PMON_FIXED_LOW,
2195 : : .fixed_ctl = KNL_MC0_CH0_MSR_PMON_FIXED_CTL,
2196 : : .box_ctl = KNL_MC0_CH0_MSR_PMON_BOX_CTL,
2197 : : .ops = &knl_uncore_imc_ops,
2198 : : .format_group = &snbep_uncore_format_group,
2199 : : };
2200 : :
2201 : : static struct intel_uncore_type knl_uncore_edc_uclk = {
2202 : : .name = "edc_uclk",
2203 : : .num_counters = 4,
2204 : : .num_boxes = 8,
2205 : : .perf_ctr_bits = 48,
2206 : : .fixed_ctr_bits = 48,
2207 : : .perf_ctr = KNL_UCLK_MSR_PMON_CTR0_LOW,
2208 : : .event_ctl = KNL_UCLK_MSR_PMON_CTL0,
2209 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
2210 : : .fixed_ctr = KNL_UCLK_MSR_PMON_UCLK_FIXED_LOW,
2211 : : .fixed_ctl = KNL_UCLK_MSR_PMON_UCLK_FIXED_CTL,
2212 : : .box_ctl = KNL_UCLK_MSR_PMON_BOX_CTL,
2213 : : .ops = &knl_uncore_imc_ops,
2214 : : .format_group = &snbep_uncore_format_group,
2215 : : };
2216 : :
2217 : : static struct intel_uncore_type knl_uncore_edc_eclk = {
2218 : : .name = "edc_eclk",
2219 : : .num_counters = 4,
2220 : : .num_boxes = 8,
2221 : : .perf_ctr_bits = 48,
2222 : : .fixed_ctr_bits = 48,
2223 : : .perf_ctr = KNL_EDC0_ECLK_MSR_PMON_CTR0_LOW,
2224 : : .event_ctl = KNL_EDC0_ECLK_MSR_PMON_CTL0,
2225 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
2226 : : .fixed_ctr = KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_LOW,
2227 : : .fixed_ctl = KNL_EDC0_ECLK_MSR_PMON_ECLK_FIXED_CTL,
2228 : : .box_ctl = KNL_EDC0_ECLK_MSR_PMON_BOX_CTL,
2229 : : .ops = &knl_uncore_imc_ops,
2230 : : .format_group = &snbep_uncore_format_group,
2231 : : };
2232 : :
2233 : : static struct event_constraint knl_uncore_m2pcie_constraints[] = {
2234 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
2235 : : EVENT_CONSTRAINT_END
2236 : : };
2237 : :
2238 : : static struct intel_uncore_type knl_uncore_m2pcie = {
2239 : : .name = "m2pcie",
2240 : : .num_counters = 4,
2241 : : .num_boxes = 1,
2242 : : .perf_ctr_bits = 48,
2243 : : .constraints = knl_uncore_m2pcie_constraints,
2244 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
2245 : : };
2246 : :
2247 : : static struct attribute *knl_uncore_irp_formats_attr[] = {
2248 : : &format_attr_event.attr,
2249 : : &format_attr_umask.attr,
2250 : : &format_attr_qor.attr,
2251 : : &format_attr_edge.attr,
2252 : : &format_attr_inv.attr,
2253 : : &format_attr_thresh8.attr,
2254 : : NULL,
2255 : : };
2256 : :
2257 : : static const struct attribute_group knl_uncore_irp_format_group = {
2258 : : .name = "format",
2259 : : .attrs = knl_uncore_irp_formats_attr,
2260 : : };
2261 : :
2262 : : static struct intel_uncore_type knl_uncore_irp = {
2263 : : .name = "irp",
2264 : : .num_counters = 2,
2265 : : .num_boxes = 1,
2266 : : .perf_ctr_bits = 48,
2267 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
2268 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
2269 : : .event_mask = KNL_IRP_PCI_PMON_RAW_EVENT_MASK,
2270 : : .box_ctl = KNL_IRP_PCI_PMON_BOX_CTL,
2271 : : .ops = &snbep_uncore_pci_ops,
2272 : : .format_group = &knl_uncore_irp_format_group,
2273 : : };
2274 : :
2275 : : enum {
2276 : : KNL_PCI_UNCORE_MC_UCLK,
2277 : : KNL_PCI_UNCORE_MC_DCLK,
2278 : : KNL_PCI_UNCORE_EDC_UCLK,
2279 : : KNL_PCI_UNCORE_EDC_ECLK,
2280 : : KNL_PCI_UNCORE_M2PCIE,
2281 : : KNL_PCI_UNCORE_IRP,
2282 : : };
2283 : :
2284 : : static struct intel_uncore_type *knl_pci_uncores[] = {
2285 : : [KNL_PCI_UNCORE_MC_UCLK] = &knl_uncore_imc_uclk,
2286 : : [KNL_PCI_UNCORE_MC_DCLK] = &knl_uncore_imc_dclk,
2287 : : [KNL_PCI_UNCORE_EDC_UCLK] = &knl_uncore_edc_uclk,
2288 : : [KNL_PCI_UNCORE_EDC_ECLK] = &knl_uncore_edc_eclk,
2289 : : [KNL_PCI_UNCORE_M2PCIE] = &knl_uncore_m2pcie,
2290 : : [KNL_PCI_UNCORE_IRP] = &knl_uncore_irp,
2291 : : NULL,
2292 : : };
2293 : :
2294 : : /*
2295 : : * KNL uses a common PCI device ID for multiple instances of an Uncore PMU
2296 : : * device type. prior to KNL, each instance of a PMU device type had a unique
2297 : : * device ID.
2298 : : *
2299 : : * PCI Device ID Uncore PMU Devices
2300 : : * ----------------------------------
2301 : : * 0x7841 MC0 UClk, MC1 UClk
2302 : : * 0x7843 MC0 DClk CH 0, MC0 DClk CH 1, MC0 DClk CH 2,
2303 : : * MC1 DClk CH 0, MC1 DClk CH 1, MC1 DClk CH 2
2304 : : * 0x7833 EDC0 UClk, EDC1 UClk, EDC2 UClk, EDC3 UClk,
2305 : : * EDC4 UClk, EDC5 UClk, EDC6 UClk, EDC7 UClk
2306 : : * 0x7835 EDC0 EClk, EDC1 EClk, EDC2 EClk, EDC3 EClk,
2307 : : * EDC4 EClk, EDC5 EClk, EDC6 EClk, EDC7 EClk
2308 : : * 0x7817 M2PCIe
2309 : : * 0x7814 IRP
2310 : : */
2311 : :
2312 : : static const struct pci_device_id knl_uncore_pci_ids[] = {
2313 : : { /* MC0 UClk */
2314 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7841),
2315 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(10, 0, KNL_PCI_UNCORE_MC_UCLK, 0),
2316 : : },
2317 : : { /* MC1 UClk */
2318 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7841),
2319 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(11, 0, KNL_PCI_UNCORE_MC_UCLK, 1),
2320 : : },
2321 : : { /* MC0 DClk CH 0 */
2322 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2323 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 2, KNL_PCI_UNCORE_MC_DCLK, 0),
2324 : : },
2325 : : { /* MC0 DClk CH 1 */
2326 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2327 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 3, KNL_PCI_UNCORE_MC_DCLK, 1),
2328 : : },
2329 : : { /* MC0 DClk CH 2 */
2330 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2331 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 4, KNL_PCI_UNCORE_MC_DCLK, 2),
2332 : : },
2333 : : { /* MC1 DClk CH 0 */
2334 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2335 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 2, KNL_PCI_UNCORE_MC_DCLK, 3),
2336 : : },
2337 : : { /* MC1 DClk CH 1 */
2338 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2339 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 3, KNL_PCI_UNCORE_MC_DCLK, 4),
2340 : : },
2341 : : { /* MC1 DClk CH 2 */
2342 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7843),
2343 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 4, KNL_PCI_UNCORE_MC_DCLK, 5),
2344 : : },
2345 : : { /* EDC0 UClk */
2346 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2347 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(15, 0, KNL_PCI_UNCORE_EDC_UCLK, 0),
2348 : : },
2349 : : { /* EDC1 UClk */
2350 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2351 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(16, 0, KNL_PCI_UNCORE_EDC_UCLK, 1),
2352 : : },
2353 : : { /* EDC2 UClk */
2354 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2355 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(17, 0, KNL_PCI_UNCORE_EDC_UCLK, 2),
2356 : : },
2357 : : { /* EDC3 UClk */
2358 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2359 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 0, KNL_PCI_UNCORE_EDC_UCLK, 3),
2360 : : },
2361 : : { /* EDC4 UClk */
2362 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2363 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(19, 0, KNL_PCI_UNCORE_EDC_UCLK, 4),
2364 : : },
2365 : : { /* EDC5 UClk */
2366 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2367 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(20, 0, KNL_PCI_UNCORE_EDC_UCLK, 5),
2368 : : },
2369 : : { /* EDC6 UClk */
2370 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2371 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 0, KNL_PCI_UNCORE_EDC_UCLK, 6),
2372 : : },
2373 : : { /* EDC7 UClk */
2374 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7833),
2375 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(22, 0, KNL_PCI_UNCORE_EDC_UCLK, 7),
2376 : : },
2377 : : { /* EDC0 EClk */
2378 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2379 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(24, 2, KNL_PCI_UNCORE_EDC_ECLK, 0),
2380 : : },
2381 : : { /* EDC1 EClk */
2382 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2383 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(25, 2, KNL_PCI_UNCORE_EDC_ECLK, 1),
2384 : : },
2385 : : { /* EDC2 EClk */
2386 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2387 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(26, 2, KNL_PCI_UNCORE_EDC_ECLK, 2),
2388 : : },
2389 : : { /* EDC3 EClk */
2390 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2391 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(27, 2, KNL_PCI_UNCORE_EDC_ECLK, 3),
2392 : : },
2393 : : { /* EDC4 EClk */
2394 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2395 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(28, 2, KNL_PCI_UNCORE_EDC_ECLK, 4),
2396 : : },
2397 : : { /* EDC5 EClk */
2398 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2399 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(29, 2, KNL_PCI_UNCORE_EDC_ECLK, 5),
2400 : : },
2401 : : { /* EDC6 EClk */
2402 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2403 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(30, 2, KNL_PCI_UNCORE_EDC_ECLK, 6),
2404 : : },
2405 : : { /* EDC7 EClk */
2406 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7835),
2407 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(31, 2, KNL_PCI_UNCORE_EDC_ECLK, 7),
2408 : : },
2409 : : { /* M2PCIe */
2410 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7817),
2411 : : .driver_data = UNCORE_PCI_DEV_DATA(KNL_PCI_UNCORE_M2PCIE, 0),
2412 : : },
2413 : : { /* IRP */
2414 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7814),
2415 : : .driver_data = UNCORE_PCI_DEV_DATA(KNL_PCI_UNCORE_IRP, 0),
2416 : : },
2417 : : { /* end: all zeroes */ }
2418 : : };
2419 : :
2420 : : static struct pci_driver knl_uncore_pci_driver = {
2421 : : .name = "knl_uncore",
2422 : : .id_table = knl_uncore_pci_ids,
2423 : : };
2424 : :
2425 : 0 : int knl_uncore_pci_init(void)
2426 : : {
2427 : 0 : int ret;
2428 : :
2429 : : /* All KNL PCI based PMON units are on the same PCI bus except IRP */
2430 : 0 : ret = snb_pci2phy_map_init(0x7814); /* IRP */
2431 [ # # ]: 0 : if (ret)
2432 : : return ret;
2433 : 0 : ret = snb_pci2phy_map_init(0x7817); /* M2PCIe */
2434 [ # # ]: 0 : if (ret)
2435 : : return ret;
2436 : 0 : uncore_pci_uncores = knl_pci_uncores;
2437 : 0 : uncore_pci_driver = &knl_uncore_pci_driver;
2438 : 0 : return 0;
2439 : : }
2440 : :
2441 : : /* end of KNL uncore support */
2442 : :
2443 : : /* Haswell-EP uncore support */
2444 : : static struct attribute *hswep_uncore_ubox_formats_attr[] = {
2445 : : &format_attr_event.attr,
2446 : : &format_attr_umask.attr,
2447 : : &format_attr_edge.attr,
2448 : : &format_attr_inv.attr,
2449 : : &format_attr_thresh5.attr,
2450 : : &format_attr_filter_tid2.attr,
2451 : : &format_attr_filter_cid.attr,
2452 : : NULL,
2453 : : };
2454 : :
2455 : : static const struct attribute_group hswep_uncore_ubox_format_group = {
2456 : : .name = "format",
2457 : : .attrs = hswep_uncore_ubox_formats_attr,
2458 : : };
2459 : :
2460 : 0 : static int hswep_ubox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
2461 : : {
2462 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
2463 : 0 : reg1->reg = HSWEP_U_MSR_PMON_FILTER;
2464 : 0 : reg1->config = event->attr.config1 & HSWEP_U_MSR_PMON_BOX_FILTER_MASK;
2465 : 0 : reg1->idx = 0;
2466 : 0 : return 0;
2467 : : }
2468 : :
2469 : : static struct intel_uncore_ops hswep_uncore_ubox_ops = {
2470 : : SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
2471 : : .hw_config = hswep_ubox_hw_config,
2472 : : .get_constraint = uncore_get_constraint,
2473 : : .put_constraint = uncore_put_constraint,
2474 : : };
2475 : :
2476 : : static struct intel_uncore_type hswep_uncore_ubox = {
2477 : : .name = "ubox",
2478 : : .num_counters = 2,
2479 : : .num_boxes = 1,
2480 : : .perf_ctr_bits = 44,
2481 : : .fixed_ctr_bits = 48,
2482 : : .perf_ctr = HSWEP_U_MSR_PMON_CTR0,
2483 : : .event_ctl = HSWEP_U_MSR_PMON_CTL0,
2484 : : .event_mask = SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
2485 : : .fixed_ctr = HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
2486 : : .fixed_ctl = HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
2487 : : .num_shared_regs = 1,
2488 : : .ops = &hswep_uncore_ubox_ops,
2489 : : .format_group = &hswep_uncore_ubox_format_group,
2490 : : };
2491 : :
2492 : : static struct attribute *hswep_uncore_cbox_formats_attr[] = {
2493 : : &format_attr_event.attr,
2494 : : &format_attr_umask.attr,
2495 : : &format_attr_edge.attr,
2496 : : &format_attr_tid_en.attr,
2497 : : &format_attr_thresh8.attr,
2498 : : &format_attr_filter_tid3.attr,
2499 : : &format_attr_filter_link2.attr,
2500 : : &format_attr_filter_state3.attr,
2501 : : &format_attr_filter_nid2.attr,
2502 : : &format_attr_filter_opc2.attr,
2503 : : &format_attr_filter_nc.attr,
2504 : : &format_attr_filter_c6.attr,
2505 : : &format_attr_filter_isoc.attr,
2506 : : NULL,
2507 : : };
2508 : :
2509 : : static const struct attribute_group hswep_uncore_cbox_format_group = {
2510 : : .name = "format",
2511 : : .attrs = hswep_uncore_cbox_formats_attr,
2512 : : };
2513 : :
2514 : : static struct event_constraint hswep_uncore_cbox_constraints[] = {
2515 : : UNCORE_EVENT_CONSTRAINT(0x01, 0x1),
2516 : : UNCORE_EVENT_CONSTRAINT(0x09, 0x1),
2517 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
2518 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
2519 : : UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
2520 : : UNCORE_EVENT_CONSTRAINT(0x3b, 0x1),
2521 : : UNCORE_EVENT_CONSTRAINT(0x3e, 0x1),
2522 : : EVENT_CONSTRAINT_END
2523 : : };
2524 : :
2525 : : static struct extra_reg hswep_uncore_cbox_extra_regs[] = {
2526 : : SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
2527 : : SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
2528 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
2529 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
2530 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
2531 : : SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
2532 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2134, 0xffff, 0x4),
2533 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x4),
2534 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4037, 0x40ff, 0x8),
2535 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4028, 0x40ff, 0x8),
2536 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4032, 0x40ff, 0x8),
2537 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4029, 0x40ff, 0x8),
2538 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4033, 0x40ff, 0x8),
2539 : : SNBEP_CBO_EVENT_EXTRA_REG(0x402A, 0x40ff, 0x8),
2540 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x12),
2541 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10),
2542 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4135, 0xffff, 0x18),
2543 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4435, 0xffff, 0x8),
2544 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4835, 0xffff, 0x8),
2545 : : SNBEP_CBO_EVENT_EXTRA_REG(0x5035, 0xffff, 0x8),
2546 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4335, 0xffff, 0x18),
2547 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4a35, 0xffff, 0x8),
2548 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2335, 0xffff, 0x10),
2549 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8335, 0xffff, 0x10),
2550 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10),
2551 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8135, 0xffff, 0x10),
2552 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0136, 0xffff, 0x10),
2553 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0336, 0xffff, 0x10),
2554 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4136, 0xffff, 0x18),
2555 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4436, 0xffff, 0x8),
2556 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4836, 0xffff, 0x8),
2557 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4336, 0xffff, 0x18),
2558 : : SNBEP_CBO_EVENT_EXTRA_REG(0x4a36, 0xffff, 0x8),
2559 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2336, 0xffff, 0x10),
2560 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8336, 0xffff, 0x10),
2561 : : SNBEP_CBO_EVENT_EXTRA_REG(0x2136, 0xffff, 0x10),
2562 : : SNBEP_CBO_EVENT_EXTRA_REG(0x8136, 0xffff, 0x10),
2563 : : SNBEP_CBO_EVENT_EXTRA_REG(0x5036, 0xffff, 0x8),
2564 : : EVENT_EXTRA_END
2565 : : };
2566 : :
2567 : 0 : static u64 hswep_cbox_filter_mask(int fields)
2568 : : {
2569 : 0 : u64 mask = 0;
2570 [ # # ]: 0 : if (fields & 0x1)
2571 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_TID;
2572 [ # # ]: 0 : if (fields & 0x2)
2573 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_LINK;
2574 [ # # ]: 0 : if (fields & 0x4)
2575 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_STATE;
2576 [ # # ]: 0 : if (fields & 0x8)
2577 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_NID;
2578 [ # # ]: 0 : if (fields & 0x10) {
2579 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_OPC;
2580 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_NC;
2581 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_C6;
2582 : 0 : mask |= HSWEP_CB0_MSR_PMON_BOX_FILTER_ISOC;
2583 : : }
2584 : 0 : return mask;
2585 : : }
2586 : :
2587 : : static struct event_constraint *
2588 : 0 : hswep_cbox_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
2589 : : {
2590 : 0 : return __snbep_cbox_get_constraint(box, event, hswep_cbox_filter_mask);
2591 : : }
2592 : :
2593 : 0 : static int hswep_cbox_hw_config(struct intel_uncore_box *box, struct perf_event *event)
2594 : : {
2595 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
2596 : 0 : struct extra_reg *er;
2597 : 0 : int idx = 0;
2598 : :
2599 [ # # ]: 0 : for (er = hswep_uncore_cbox_extra_regs; er->msr; er++) {
2600 [ # # ]: 0 : if (er->event != (event->hw.config & er->config_mask))
2601 : 0 : continue;
2602 : 0 : idx |= er->idx;
2603 : : }
2604 : :
2605 [ # # ]: 0 : if (idx) {
2606 : 0 : reg1->reg = HSWEP_C0_MSR_PMON_BOX_FILTER0 +
2607 : 0 : HSWEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
2608 : 0 : reg1->config = event->attr.config1 & hswep_cbox_filter_mask(idx);
2609 : 0 : reg1->idx = idx;
2610 : : }
2611 : 0 : return 0;
2612 : : }
2613 : :
2614 : 0 : static void hswep_cbox_enable_event(struct intel_uncore_box *box,
2615 : : struct perf_event *event)
2616 : : {
2617 : 0 : struct hw_perf_event *hwc = &event->hw;
2618 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
2619 : :
2620 [ # # ]: 0 : if (reg1->idx != EXTRA_REG_NONE) {
2621 : 0 : u64 filter = uncore_shared_reg_config(box, 0);
2622 : 0 : wrmsrl(reg1->reg, filter & 0xffffffff);
2623 : 0 : wrmsrl(reg1->reg + 1, filter >> 32);
2624 : : }
2625 : :
2626 : 0 : wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
2627 : 0 : }
2628 : :
2629 : : static struct intel_uncore_ops hswep_uncore_cbox_ops = {
2630 : : .init_box = snbep_uncore_msr_init_box,
2631 : : .disable_box = snbep_uncore_msr_disable_box,
2632 : : .enable_box = snbep_uncore_msr_enable_box,
2633 : : .disable_event = snbep_uncore_msr_disable_event,
2634 : : .enable_event = hswep_cbox_enable_event,
2635 : : .read_counter = uncore_msr_read_counter,
2636 : : .hw_config = hswep_cbox_hw_config,
2637 : : .get_constraint = hswep_cbox_get_constraint,
2638 : : .put_constraint = snbep_cbox_put_constraint,
2639 : : };
2640 : :
2641 : : static struct intel_uncore_type hswep_uncore_cbox = {
2642 : : .name = "cbox",
2643 : : .num_counters = 4,
2644 : : .num_boxes = 18,
2645 : : .perf_ctr_bits = 48,
2646 : : .event_ctl = HSWEP_C0_MSR_PMON_CTL0,
2647 : : .perf_ctr = HSWEP_C0_MSR_PMON_CTR0,
2648 : : .event_mask = SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
2649 : : .box_ctl = HSWEP_C0_MSR_PMON_BOX_CTL,
2650 : : .msr_offset = HSWEP_CBO_MSR_OFFSET,
2651 : : .num_shared_regs = 1,
2652 : : .constraints = hswep_uncore_cbox_constraints,
2653 : : .ops = &hswep_uncore_cbox_ops,
2654 : : .format_group = &hswep_uncore_cbox_format_group,
2655 : : };
2656 : :
2657 : : /*
2658 : : * Write SBOX Initialization register bit by bit to avoid spurious #GPs
2659 : : */
2660 : 0 : static void hswep_uncore_sbox_msr_init_box(struct intel_uncore_box *box)
2661 : : {
2662 [ # # ]: 0 : unsigned msr = uncore_msr_box_ctl(box);
2663 : :
2664 [ # # ]: 0 : if (msr) {
2665 : 0 : u64 init = SNBEP_PMON_BOX_CTL_INT;
2666 : 0 : u64 flags = 0;
2667 : 0 : int i;
2668 : :
2669 [ # # ]: 0 : for_each_set_bit(i, (unsigned long *)&init, 64) {
2670 : 0 : flags |= (1ULL << i);
2671 : 0 : wrmsrl(msr, flags);
2672 : : }
2673 : : }
2674 : 0 : }
2675 : :
2676 : : static struct intel_uncore_ops hswep_uncore_sbox_msr_ops = {
2677 : : __SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
2678 : : .init_box = hswep_uncore_sbox_msr_init_box
2679 : : };
2680 : :
2681 : : static struct attribute *hswep_uncore_sbox_formats_attr[] = {
2682 : : &format_attr_event.attr,
2683 : : &format_attr_umask.attr,
2684 : : &format_attr_edge.attr,
2685 : : &format_attr_tid_en.attr,
2686 : : &format_attr_inv.attr,
2687 : : &format_attr_thresh8.attr,
2688 : : NULL,
2689 : : };
2690 : :
2691 : : static const struct attribute_group hswep_uncore_sbox_format_group = {
2692 : : .name = "format",
2693 : : .attrs = hswep_uncore_sbox_formats_attr,
2694 : : };
2695 : :
2696 : : static struct intel_uncore_type hswep_uncore_sbox = {
2697 : : .name = "sbox",
2698 : : .num_counters = 4,
2699 : : .num_boxes = 4,
2700 : : .perf_ctr_bits = 44,
2701 : : .event_ctl = HSWEP_S0_MSR_PMON_CTL0,
2702 : : .perf_ctr = HSWEP_S0_MSR_PMON_CTR0,
2703 : : .event_mask = HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
2704 : : .box_ctl = HSWEP_S0_MSR_PMON_BOX_CTL,
2705 : : .msr_offset = HSWEP_SBOX_MSR_OFFSET,
2706 : : .ops = &hswep_uncore_sbox_msr_ops,
2707 : : .format_group = &hswep_uncore_sbox_format_group,
2708 : : };
2709 : :
2710 : 0 : static int hswep_pcu_hw_config(struct intel_uncore_box *box, struct perf_event *event)
2711 : : {
2712 : 0 : struct hw_perf_event *hwc = &event->hw;
2713 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
2714 : 0 : int ev_sel = hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK;
2715 : :
2716 [ # # ]: 0 : if (ev_sel >= 0xb && ev_sel <= 0xe) {
2717 : 0 : reg1->reg = HSWEP_PCU_MSR_PMON_BOX_FILTER;
2718 : 0 : reg1->idx = ev_sel - 0xb;
2719 : 0 : reg1->config = event->attr.config1 & (0xff << reg1->idx);
2720 : : }
2721 : 0 : return 0;
2722 : : }
2723 : :
2724 : : static struct intel_uncore_ops hswep_uncore_pcu_ops = {
2725 : : SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
2726 : : .hw_config = hswep_pcu_hw_config,
2727 : : .get_constraint = snbep_pcu_get_constraint,
2728 : : .put_constraint = snbep_pcu_put_constraint,
2729 : : };
2730 : :
2731 : : static struct intel_uncore_type hswep_uncore_pcu = {
2732 : : .name = "pcu",
2733 : : .num_counters = 4,
2734 : : .num_boxes = 1,
2735 : : .perf_ctr_bits = 48,
2736 : : .perf_ctr = HSWEP_PCU_MSR_PMON_CTR0,
2737 : : .event_ctl = HSWEP_PCU_MSR_PMON_CTL0,
2738 : : .event_mask = SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
2739 : : .box_ctl = HSWEP_PCU_MSR_PMON_BOX_CTL,
2740 : : .num_shared_regs = 1,
2741 : : .ops = &hswep_uncore_pcu_ops,
2742 : : .format_group = &snbep_uncore_pcu_format_group,
2743 : : };
2744 : :
2745 : : static struct intel_uncore_type *hswep_msr_uncores[] = {
2746 : : &hswep_uncore_ubox,
2747 : : &hswep_uncore_cbox,
2748 : : &hswep_uncore_sbox,
2749 : : &hswep_uncore_pcu,
2750 : : NULL,
2751 : : };
2752 : :
2753 : 0 : void hswep_uncore_cpu_init(void)
2754 : : {
2755 : 0 : int pkg = boot_cpu_data.logical_proc_id;
2756 : :
2757 [ # # ]: 0 : if (hswep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
2758 : 0 : hswep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
2759 : :
2760 : : /* Detect 6-8 core systems with only two SBOXes */
2761 [ # # ]: 0 : if (uncore_extra_pci_dev[pkg].dev[HSWEP_PCI_PCU_3]) {
2762 : 0 : u32 capid4;
2763 : :
2764 : 0 : pci_read_config_dword(uncore_extra_pci_dev[pkg].dev[HSWEP_PCI_PCU_3],
2765 : : 0x94, &capid4);
2766 [ # # ]: 0 : if (((capid4 >> 6) & 0x3) == 0)
2767 : 0 : hswep_uncore_sbox.num_boxes = 2;
2768 : : }
2769 : :
2770 : 0 : uncore_msr_uncores = hswep_msr_uncores;
2771 : 0 : }
2772 : :
2773 : : static struct intel_uncore_type hswep_uncore_ha = {
2774 : : .name = "ha",
2775 : : .num_counters = 4,
2776 : : .num_boxes = 2,
2777 : : .perf_ctr_bits = 48,
2778 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
2779 : : };
2780 : :
2781 : : static struct uncore_event_desc hswep_uncore_imc_events[] = {
2782 : : INTEL_UNCORE_EVENT_DESC(clockticks, "event=0x00,umask=0x00"),
2783 : : INTEL_UNCORE_EVENT_DESC(cas_count_read, "event=0x04,umask=0x03"),
2784 : : INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
2785 : : INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
2786 : : INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x0c"),
2787 : : INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
2788 : : INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
2789 : : { /* end: all zeroes */ },
2790 : : };
2791 : :
2792 : : static struct intel_uncore_type hswep_uncore_imc = {
2793 : : .name = "imc",
2794 : : .num_counters = 4,
2795 : : .num_boxes = 8,
2796 : : .perf_ctr_bits = 48,
2797 : : .fixed_ctr_bits = 48,
2798 : : .fixed_ctr = SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
2799 : : .fixed_ctl = SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
2800 : : .event_descs = hswep_uncore_imc_events,
2801 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
2802 : : };
2803 : :
2804 : : static unsigned hswep_uncore_irp_ctrs[] = {0xa0, 0xa8, 0xb0, 0xb8};
2805 : :
2806 : 0 : static u64 hswep_uncore_irp_read_counter(struct intel_uncore_box *box, struct perf_event *event)
2807 : : {
2808 : 0 : struct pci_dev *pdev = box->pci_dev;
2809 : 0 : struct hw_perf_event *hwc = &event->hw;
2810 : 0 : u64 count = 0;
2811 : :
2812 : 0 : pci_read_config_dword(pdev, hswep_uncore_irp_ctrs[hwc->idx], (u32 *)&count);
2813 : 0 : pci_read_config_dword(pdev, hswep_uncore_irp_ctrs[hwc->idx] + 4, (u32 *)&count + 1);
2814 : :
2815 : 0 : return count;
2816 : : }
2817 : :
2818 : : static struct intel_uncore_ops hswep_uncore_irp_ops = {
2819 : : .init_box = snbep_uncore_pci_init_box,
2820 : : .disable_box = snbep_uncore_pci_disable_box,
2821 : : .enable_box = snbep_uncore_pci_enable_box,
2822 : : .disable_event = ivbep_uncore_irp_disable_event,
2823 : : .enable_event = ivbep_uncore_irp_enable_event,
2824 : : .read_counter = hswep_uncore_irp_read_counter,
2825 : : };
2826 : :
2827 : : static struct intel_uncore_type hswep_uncore_irp = {
2828 : : .name = "irp",
2829 : : .num_counters = 4,
2830 : : .num_boxes = 1,
2831 : : .perf_ctr_bits = 48,
2832 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
2833 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
2834 : : .ops = &hswep_uncore_irp_ops,
2835 : : .format_group = &snbep_uncore_format_group,
2836 : : };
2837 : :
2838 : : static struct intel_uncore_type hswep_uncore_qpi = {
2839 : : .name = "qpi",
2840 : : .num_counters = 4,
2841 : : .num_boxes = 3,
2842 : : .perf_ctr_bits = 48,
2843 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
2844 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
2845 : : .event_mask = SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
2846 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
2847 : : .num_shared_regs = 1,
2848 : : .ops = &snbep_uncore_qpi_ops,
2849 : : .format_group = &snbep_uncore_qpi_format_group,
2850 : : };
2851 : :
2852 : : static struct event_constraint hswep_uncore_r2pcie_constraints[] = {
2853 : : UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
2854 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
2855 : : UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
2856 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x1),
2857 : : UNCORE_EVENT_CONSTRAINT(0x24, 0x1),
2858 : : UNCORE_EVENT_CONSTRAINT(0x25, 0x1),
2859 : : UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
2860 : : UNCORE_EVENT_CONSTRAINT(0x27, 0x1),
2861 : : UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
2862 : : UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
2863 : : UNCORE_EVENT_CONSTRAINT(0x2a, 0x1),
2864 : : UNCORE_EVENT_CONSTRAINT(0x2b, 0x3),
2865 : : UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
2866 : : UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
2867 : : UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
2868 : : UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
2869 : : UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
2870 : : UNCORE_EVENT_CONSTRAINT(0x35, 0x3),
2871 : : EVENT_CONSTRAINT_END
2872 : : };
2873 : :
2874 : : static struct intel_uncore_type hswep_uncore_r2pcie = {
2875 : : .name = "r2pcie",
2876 : : .num_counters = 4,
2877 : : .num_boxes = 1,
2878 : : .perf_ctr_bits = 48,
2879 : : .constraints = hswep_uncore_r2pcie_constraints,
2880 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
2881 : : };
2882 : :
2883 : : static struct event_constraint hswep_uncore_r3qpi_constraints[] = {
2884 : : UNCORE_EVENT_CONSTRAINT(0x01, 0x3),
2885 : : UNCORE_EVENT_CONSTRAINT(0x07, 0x7),
2886 : : UNCORE_EVENT_CONSTRAINT(0x08, 0x7),
2887 : : UNCORE_EVENT_CONSTRAINT(0x09, 0x7),
2888 : : UNCORE_EVENT_CONSTRAINT(0x0a, 0x7),
2889 : : UNCORE_EVENT_CONSTRAINT(0x0e, 0x7),
2890 : : UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
2891 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
2892 : : UNCORE_EVENT_CONSTRAINT(0x12, 0x3),
2893 : : UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
2894 : : UNCORE_EVENT_CONSTRAINT(0x14, 0x3),
2895 : : UNCORE_EVENT_CONSTRAINT(0x15, 0x3),
2896 : : UNCORE_EVENT_CONSTRAINT(0x1f, 0x3),
2897 : : UNCORE_EVENT_CONSTRAINT(0x20, 0x3),
2898 : : UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
2899 : : UNCORE_EVENT_CONSTRAINT(0x22, 0x3),
2900 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
2901 : : UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
2902 : : UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
2903 : : UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
2904 : : UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
2905 : : UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
2906 : : UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
2907 : : UNCORE_EVENT_CONSTRAINT(0x2e, 0x3),
2908 : : UNCORE_EVENT_CONSTRAINT(0x2f, 0x3),
2909 : : UNCORE_EVENT_CONSTRAINT(0x31, 0x3),
2910 : : UNCORE_EVENT_CONSTRAINT(0x32, 0x3),
2911 : : UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
2912 : : UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
2913 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x3),
2914 : : UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
2915 : : UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
2916 : : UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
2917 : : EVENT_CONSTRAINT_END
2918 : : };
2919 : :
2920 : : static struct intel_uncore_type hswep_uncore_r3qpi = {
2921 : : .name = "r3qpi",
2922 : : .num_counters = 3,
2923 : : .num_boxes = 3,
2924 : : .perf_ctr_bits = 44,
2925 : : .constraints = hswep_uncore_r3qpi_constraints,
2926 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
2927 : : };
2928 : :
2929 : : enum {
2930 : : HSWEP_PCI_UNCORE_HA,
2931 : : HSWEP_PCI_UNCORE_IMC,
2932 : : HSWEP_PCI_UNCORE_IRP,
2933 : : HSWEP_PCI_UNCORE_QPI,
2934 : : HSWEP_PCI_UNCORE_R2PCIE,
2935 : : HSWEP_PCI_UNCORE_R3QPI,
2936 : : };
2937 : :
2938 : : static struct intel_uncore_type *hswep_pci_uncores[] = {
2939 : : [HSWEP_PCI_UNCORE_HA] = &hswep_uncore_ha,
2940 : : [HSWEP_PCI_UNCORE_IMC] = &hswep_uncore_imc,
2941 : : [HSWEP_PCI_UNCORE_IRP] = &hswep_uncore_irp,
2942 : : [HSWEP_PCI_UNCORE_QPI] = &hswep_uncore_qpi,
2943 : : [HSWEP_PCI_UNCORE_R2PCIE] = &hswep_uncore_r2pcie,
2944 : : [HSWEP_PCI_UNCORE_R3QPI] = &hswep_uncore_r3qpi,
2945 : : NULL,
2946 : : };
2947 : :
2948 : : static const struct pci_device_id hswep_uncore_pci_ids[] = {
2949 : : { /* Home Agent 0 */
2950 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f30),
2951 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_HA, 0),
2952 : : },
2953 : : { /* Home Agent 1 */
2954 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f38),
2955 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_HA, 1),
2956 : : },
2957 : : { /* MC0 Channel 0 */
2958 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb0),
2959 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 0),
2960 : : },
2961 : : { /* MC0 Channel 1 */
2962 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb1),
2963 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 1),
2964 : : },
2965 : : { /* MC0 Channel 2 */
2966 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb4),
2967 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 2),
2968 : : },
2969 : : { /* MC0 Channel 3 */
2970 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fb5),
2971 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 3),
2972 : : },
2973 : : { /* MC1 Channel 0 */
2974 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd0),
2975 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 4),
2976 : : },
2977 : : { /* MC1 Channel 1 */
2978 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd1),
2979 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 5),
2980 : : },
2981 : : { /* MC1 Channel 2 */
2982 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd4),
2983 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 6),
2984 : : },
2985 : : { /* MC1 Channel 3 */
2986 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fd5),
2987 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IMC, 7),
2988 : : },
2989 : : { /* IRP */
2990 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f39),
2991 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_IRP, 0),
2992 : : },
2993 : : { /* QPI0 Port 0 */
2994 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f32),
2995 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_QPI, 0),
2996 : : },
2997 : : { /* QPI0 Port 1 */
2998 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f33),
2999 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_QPI, 1),
3000 : : },
3001 : : { /* QPI1 Port 2 */
3002 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f3a),
3003 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_QPI, 2),
3004 : : },
3005 : : { /* R2PCIe */
3006 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f34),
3007 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R2PCIE, 0),
3008 : : },
3009 : : { /* R3QPI0 Link 0 */
3010 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f36),
3011 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R3QPI, 0),
3012 : : },
3013 : : { /* R3QPI0 Link 1 */
3014 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f37),
3015 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R3QPI, 1),
3016 : : },
3017 : : { /* R3QPI1 Link 2 */
3018 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f3e),
3019 : : .driver_data = UNCORE_PCI_DEV_DATA(HSWEP_PCI_UNCORE_R3QPI, 2),
3020 : : },
3021 : : { /* QPI Port 0 filter */
3022 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f86),
3023 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3024 : : SNBEP_PCI_QPI_PORT0_FILTER),
3025 : : },
3026 : : { /* QPI Port 1 filter */
3027 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2f96),
3028 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3029 : : SNBEP_PCI_QPI_PORT1_FILTER),
3030 : : },
3031 : : { /* PCU.3 (for Capability registers) */
3032 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fc0),
3033 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3034 : : HSWEP_PCI_PCU_3),
3035 : : },
3036 : : { /* end: all zeroes */ }
3037 : : };
3038 : :
3039 : : static struct pci_driver hswep_uncore_pci_driver = {
3040 : : .name = "hswep_uncore",
3041 : : .id_table = hswep_uncore_pci_ids,
3042 : : };
3043 : :
3044 : 0 : int hswep_uncore_pci_init(void)
3045 : : {
3046 : 0 : int ret = snbep_pci2phy_map_init(0x2f1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
3047 [ # # ]: 0 : if (ret)
3048 : : return ret;
3049 : 0 : uncore_pci_uncores = hswep_pci_uncores;
3050 : 0 : uncore_pci_driver = &hswep_uncore_pci_driver;
3051 : 0 : return 0;
3052 : : }
3053 : : /* end of Haswell-EP uncore support */
3054 : :
3055 : : /* BDX uncore support */
3056 : :
3057 : : static struct intel_uncore_type bdx_uncore_ubox = {
3058 : : .name = "ubox",
3059 : : .num_counters = 2,
3060 : : .num_boxes = 1,
3061 : : .perf_ctr_bits = 48,
3062 : : .fixed_ctr_bits = 48,
3063 : : .perf_ctr = HSWEP_U_MSR_PMON_CTR0,
3064 : : .event_ctl = HSWEP_U_MSR_PMON_CTL0,
3065 : : .event_mask = SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
3066 : : .fixed_ctr = HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
3067 : : .fixed_ctl = HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
3068 : : .num_shared_regs = 1,
3069 : : .ops = &ivbep_uncore_msr_ops,
3070 : : .format_group = &ivbep_uncore_ubox_format_group,
3071 : : };
3072 : :
3073 : : static struct event_constraint bdx_uncore_cbox_constraints[] = {
3074 : : UNCORE_EVENT_CONSTRAINT(0x09, 0x3),
3075 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
3076 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
3077 : : UNCORE_EVENT_CONSTRAINT(0x3e, 0x1),
3078 : : EVENT_CONSTRAINT_END
3079 : : };
3080 : :
3081 : : static struct intel_uncore_type bdx_uncore_cbox = {
3082 : : .name = "cbox",
3083 : : .num_counters = 4,
3084 : : .num_boxes = 24,
3085 : : .perf_ctr_bits = 48,
3086 : : .event_ctl = HSWEP_C0_MSR_PMON_CTL0,
3087 : : .perf_ctr = HSWEP_C0_MSR_PMON_CTR0,
3088 : : .event_mask = SNBEP_CBO_MSR_PMON_RAW_EVENT_MASK,
3089 : : .box_ctl = HSWEP_C0_MSR_PMON_BOX_CTL,
3090 : : .msr_offset = HSWEP_CBO_MSR_OFFSET,
3091 : : .num_shared_regs = 1,
3092 : : .constraints = bdx_uncore_cbox_constraints,
3093 : : .ops = &hswep_uncore_cbox_ops,
3094 : : .format_group = &hswep_uncore_cbox_format_group,
3095 : : };
3096 : :
3097 : : static struct intel_uncore_type bdx_uncore_sbox = {
3098 : : .name = "sbox",
3099 : : .num_counters = 4,
3100 : : .num_boxes = 4,
3101 : : .perf_ctr_bits = 48,
3102 : : .event_ctl = HSWEP_S0_MSR_PMON_CTL0,
3103 : : .perf_ctr = HSWEP_S0_MSR_PMON_CTR0,
3104 : : .event_mask = HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
3105 : : .box_ctl = HSWEP_S0_MSR_PMON_BOX_CTL,
3106 : : .msr_offset = HSWEP_SBOX_MSR_OFFSET,
3107 : : .ops = &hswep_uncore_sbox_msr_ops,
3108 : : .format_group = &hswep_uncore_sbox_format_group,
3109 : : };
3110 : :
3111 : : #define BDX_MSR_UNCORE_SBOX 3
3112 : :
3113 : : static struct intel_uncore_type *bdx_msr_uncores[] = {
3114 : : &bdx_uncore_ubox,
3115 : : &bdx_uncore_cbox,
3116 : : &hswep_uncore_pcu,
3117 : : &bdx_uncore_sbox,
3118 : : NULL,
3119 : : };
3120 : :
3121 : : /* Bit 7 'Use Occupancy' is not available for counter 0 on BDX */
3122 : : static struct event_constraint bdx_uncore_pcu_constraints[] = {
3123 : : EVENT_CONSTRAINT(0x80, 0xe, 0x80),
3124 : : EVENT_CONSTRAINT_END
3125 : : };
3126 : :
3127 : 0 : void bdx_uncore_cpu_init(void)
3128 : : {
3129 : 0 : int pkg = topology_phys_to_logical_pkg(boot_cpu_data.phys_proc_id);
3130 : :
3131 [ # # ]: 0 : if (bdx_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
3132 : 0 : bdx_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
3133 : 0 : uncore_msr_uncores = bdx_msr_uncores;
3134 : :
3135 : : /* BDX-DE doesn't have SBOX */
3136 [ # # ]: 0 : if (boot_cpu_data.x86_model == 86) {
3137 : 0 : uncore_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL;
3138 : : /* Detect systems with no SBOXes */
3139 [ # # ]: 0 : } else if (uncore_extra_pci_dev[pkg].dev[HSWEP_PCI_PCU_3]) {
3140 : 0 : struct pci_dev *pdev;
3141 : 0 : u32 capid4;
3142 : :
3143 : 0 : pdev = uncore_extra_pci_dev[pkg].dev[HSWEP_PCI_PCU_3];
3144 : 0 : pci_read_config_dword(pdev, 0x94, &capid4);
3145 [ # # ]: 0 : if (((capid4 >> 6) & 0x3) == 0)
3146 : 0 : bdx_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL;
3147 : : }
3148 : 0 : hswep_uncore_pcu.constraints = bdx_uncore_pcu_constraints;
3149 : 0 : }
3150 : :
3151 : : static struct intel_uncore_type bdx_uncore_ha = {
3152 : : .name = "ha",
3153 : : .num_counters = 4,
3154 : : .num_boxes = 2,
3155 : : .perf_ctr_bits = 48,
3156 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
3157 : : };
3158 : :
3159 : : static struct intel_uncore_type bdx_uncore_imc = {
3160 : : .name = "imc",
3161 : : .num_counters = 4,
3162 : : .num_boxes = 8,
3163 : : .perf_ctr_bits = 48,
3164 : : .fixed_ctr_bits = 48,
3165 : : .fixed_ctr = SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
3166 : : .fixed_ctl = SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
3167 : : .event_descs = hswep_uncore_imc_events,
3168 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
3169 : : };
3170 : :
3171 : : static struct intel_uncore_type bdx_uncore_irp = {
3172 : : .name = "irp",
3173 : : .num_counters = 4,
3174 : : .num_boxes = 1,
3175 : : .perf_ctr_bits = 48,
3176 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3177 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
3178 : : .ops = &hswep_uncore_irp_ops,
3179 : : .format_group = &snbep_uncore_format_group,
3180 : : };
3181 : :
3182 : : static struct intel_uncore_type bdx_uncore_qpi = {
3183 : : .name = "qpi",
3184 : : .num_counters = 4,
3185 : : .num_boxes = 3,
3186 : : .perf_ctr_bits = 48,
3187 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
3188 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
3189 : : .event_mask = SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
3190 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
3191 : : .num_shared_regs = 1,
3192 : : .ops = &snbep_uncore_qpi_ops,
3193 : : .format_group = &snbep_uncore_qpi_format_group,
3194 : : };
3195 : :
3196 : : static struct event_constraint bdx_uncore_r2pcie_constraints[] = {
3197 : : UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
3198 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
3199 : : UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
3200 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x1),
3201 : : UNCORE_EVENT_CONSTRAINT(0x25, 0x1),
3202 : : UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
3203 : : UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
3204 : : UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
3205 : : UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
3206 : : EVENT_CONSTRAINT_END
3207 : : };
3208 : :
3209 : : static struct intel_uncore_type bdx_uncore_r2pcie = {
3210 : : .name = "r2pcie",
3211 : : .num_counters = 4,
3212 : : .num_boxes = 1,
3213 : : .perf_ctr_bits = 48,
3214 : : .constraints = bdx_uncore_r2pcie_constraints,
3215 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
3216 : : };
3217 : :
3218 : : static struct event_constraint bdx_uncore_r3qpi_constraints[] = {
3219 : : UNCORE_EVENT_CONSTRAINT(0x01, 0x7),
3220 : : UNCORE_EVENT_CONSTRAINT(0x07, 0x7),
3221 : : UNCORE_EVENT_CONSTRAINT(0x08, 0x7),
3222 : : UNCORE_EVENT_CONSTRAINT(0x09, 0x7),
3223 : : UNCORE_EVENT_CONSTRAINT(0x0a, 0x7),
3224 : : UNCORE_EVENT_CONSTRAINT(0x0e, 0x7),
3225 : : UNCORE_EVENT_CONSTRAINT(0x10, 0x3),
3226 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x3),
3227 : : UNCORE_EVENT_CONSTRAINT(0x13, 0x1),
3228 : : UNCORE_EVENT_CONSTRAINT(0x14, 0x3),
3229 : : UNCORE_EVENT_CONSTRAINT(0x15, 0x3),
3230 : : UNCORE_EVENT_CONSTRAINT(0x1f, 0x3),
3231 : : UNCORE_EVENT_CONSTRAINT(0x20, 0x3),
3232 : : UNCORE_EVENT_CONSTRAINT(0x21, 0x3),
3233 : : UNCORE_EVENT_CONSTRAINT(0x22, 0x3),
3234 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
3235 : : UNCORE_EVENT_CONSTRAINT(0x25, 0x3),
3236 : : UNCORE_EVENT_CONSTRAINT(0x26, 0x3),
3237 : : UNCORE_EVENT_CONSTRAINT(0x28, 0x3),
3238 : : UNCORE_EVENT_CONSTRAINT(0x29, 0x3),
3239 : : UNCORE_EVENT_CONSTRAINT(0x2c, 0x3),
3240 : : UNCORE_EVENT_CONSTRAINT(0x2d, 0x3),
3241 : : UNCORE_EVENT_CONSTRAINT(0x2e, 0x3),
3242 : : UNCORE_EVENT_CONSTRAINT(0x2f, 0x3),
3243 : : UNCORE_EVENT_CONSTRAINT(0x33, 0x3),
3244 : : UNCORE_EVENT_CONSTRAINT(0x34, 0x3),
3245 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x3),
3246 : : UNCORE_EVENT_CONSTRAINT(0x37, 0x3),
3247 : : UNCORE_EVENT_CONSTRAINT(0x38, 0x3),
3248 : : UNCORE_EVENT_CONSTRAINT(0x39, 0x3),
3249 : : EVENT_CONSTRAINT_END
3250 : : };
3251 : :
3252 : : static struct intel_uncore_type bdx_uncore_r3qpi = {
3253 : : .name = "r3qpi",
3254 : : .num_counters = 3,
3255 : : .num_boxes = 3,
3256 : : .perf_ctr_bits = 48,
3257 : : .constraints = bdx_uncore_r3qpi_constraints,
3258 : : SNBEP_UNCORE_PCI_COMMON_INIT(),
3259 : : };
3260 : :
3261 : : enum {
3262 : : BDX_PCI_UNCORE_HA,
3263 : : BDX_PCI_UNCORE_IMC,
3264 : : BDX_PCI_UNCORE_IRP,
3265 : : BDX_PCI_UNCORE_QPI,
3266 : : BDX_PCI_UNCORE_R2PCIE,
3267 : : BDX_PCI_UNCORE_R3QPI,
3268 : : };
3269 : :
3270 : : static struct intel_uncore_type *bdx_pci_uncores[] = {
3271 : : [BDX_PCI_UNCORE_HA] = &bdx_uncore_ha,
3272 : : [BDX_PCI_UNCORE_IMC] = &bdx_uncore_imc,
3273 : : [BDX_PCI_UNCORE_IRP] = &bdx_uncore_irp,
3274 : : [BDX_PCI_UNCORE_QPI] = &bdx_uncore_qpi,
3275 : : [BDX_PCI_UNCORE_R2PCIE] = &bdx_uncore_r2pcie,
3276 : : [BDX_PCI_UNCORE_R3QPI] = &bdx_uncore_r3qpi,
3277 : : NULL,
3278 : : };
3279 : :
3280 : : static const struct pci_device_id bdx_uncore_pci_ids[] = {
3281 : : { /* Home Agent 0 */
3282 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f30),
3283 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_HA, 0),
3284 : : },
3285 : : { /* Home Agent 1 */
3286 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f38),
3287 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_HA, 1),
3288 : : },
3289 : : { /* MC0 Channel 0 */
3290 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb0),
3291 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 0),
3292 : : },
3293 : : { /* MC0 Channel 1 */
3294 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb1),
3295 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 1),
3296 : : },
3297 : : { /* MC0 Channel 2 */
3298 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb4),
3299 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 2),
3300 : : },
3301 : : { /* MC0 Channel 3 */
3302 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fb5),
3303 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 3),
3304 : : },
3305 : : { /* MC1 Channel 0 */
3306 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd0),
3307 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 4),
3308 : : },
3309 : : { /* MC1 Channel 1 */
3310 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd1),
3311 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 5),
3312 : : },
3313 : : { /* MC1 Channel 2 */
3314 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd4),
3315 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 6),
3316 : : },
3317 : : { /* MC1 Channel 3 */
3318 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fd5),
3319 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IMC, 7),
3320 : : },
3321 : : { /* IRP */
3322 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f39),
3323 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_IRP, 0),
3324 : : },
3325 : : { /* QPI0 Port 0 */
3326 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f32),
3327 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_QPI, 0),
3328 : : },
3329 : : { /* QPI0 Port 1 */
3330 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f33),
3331 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_QPI, 1),
3332 : : },
3333 : : { /* QPI1 Port 2 */
3334 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f3a),
3335 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_QPI, 2),
3336 : : },
3337 : : { /* R2PCIe */
3338 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f34),
3339 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R2PCIE, 0),
3340 : : },
3341 : : { /* R3QPI0 Link 0 */
3342 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f36),
3343 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R3QPI, 0),
3344 : : },
3345 : : { /* R3QPI0 Link 1 */
3346 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f37),
3347 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R3QPI, 1),
3348 : : },
3349 : : { /* R3QPI1 Link 2 */
3350 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f3e),
3351 : : .driver_data = UNCORE_PCI_DEV_DATA(BDX_PCI_UNCORE_R3QPI, 2),
3352 : : },
3353 : : { /* QPI Port 0 filter */
3354 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f86),
3355 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3356 : : SNBEP_PCI_QPI_PORT0_FILTER),
3357 : : },
3358 : : { /* QPI Port 1 filter */
3359 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f96),
3360 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3361 : : SNBEP_PCI_QPI_PORT1_FILTER),
3362 : : },
3363 : : { /* QPI Port 2 filter */
3364 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f46),
3365 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3366 : : BDX_PCI_QPI_PORT2_FILTER),
3367 : : },
3368 : : { /* PCU.3 (for Capability registers) */
3369 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fc0),
3370 : : .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
3371 : : HSWEP_PCI_PCU_3),
3372 : : },
3373 : : { /* end: all zeroes */ }
3374 : : };
3375 : :
3376 : : static struct pci_driver bdx_uncore_pci_driver = {
3377 : : .name = "bdx_uncore",
3378 : : .id_table = bdx_uncore_pci_ids,
3379 : : };
3380 : :
3381 : 0 : int bdx_uncore_pci_init(void)
3382 : : {
3383 : 0 : int ret = snbep_pci2phy_map_init(0x6f1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
3384 : :
3385 [ # # ]: 0 : if (ret)
3386 : : return ret;
3387 : 0 : uncore_pci_uncores = bdx_pci_uncores;
3388 : 0 : uncore_pci_driver = &bdx_uncore_pci_driver;
3389 : 0 : return 0;
3390 : : }
3391 : :
3392 : : /* end of BDX uncore support */
3393 : :
3394 : : /* SKX uncore support */
3395 : :
3396 : : static struct intel_uncore_type skx_uncore_ubox = {
3397 : : .name = "ubox",
3398 : : .num_counters = 2,
3399 : : .num_boxes = 1,
3400 : : .perf_ctr_bits = 48,
3401 : : .fixed_ctr_bits = 48,
3402 : : .perf_ctr = HSWEP_U_MSR_PMON_CTR0,
3403 : : .event_ctl = HSWEP_U_MSR_PMON_CTL0,
3404 : : .event_mask = SNBEP_U_MSR_PMON_RAW_EVENT_MASK,
3405 : : .fixed_ctr = HSWEP_U_MSR_PMON_UCLK_FIXED_CTR,
3406 : : .fixed_ctl = HSWEP_U_MSR_PMON_UCLK_FIXED_CTL,
3407 : : .ops = &ivbep_uncore_msr_ops,
3408 : : .format_group = &ivbep_uncore_ubox_format_group,
3409 : : };
3410 : :
3411 : : static struct attribute *skx_uncore_cha_formats_attr[] = {
3412 : : &format_attr_event.attr,
3413 : : &format_attr_umask.attr,
3414 : : &format_attr_edge.attr,
3415 : : &format_attr_tid_en.attr,
3416 : : &format_attr_inv.attr,
3417 : : &format_attr_thresh8.attr,
3418 : : &format_attr_filter_tid4.attr,
3419 : : &format_attr_filter_state5.attr,
3420 : : &format_attr_filter_rem.attr,
3421 : : &format_attr_filter_loc.attr,
3422 : : &format_attr_filter_nm.attr,
3423 : : &format_attr_filter_all_op.attr,
3424 : : &format_attr_filter_not_nm.attr,
3425 : : &format_attr_filter_opc_0.attr,
3426 : : &format_attr_filter_opc_1.attr,
3427 : : &format_attr_filter_nc.attr,
3428 : : &format_attr_filter_isoc.attr,
3429 : : NULL,
3430 : : };
3431 : :
3432 : : static const struct attribute_group skx_uncore_chabox_format_group = {
3433 : : .name = "format",
3434 : : .attrs = skx_uncore_cha_formats_attr,
3435 : : };
3436 : :
3437 : : static struct event_constraint skx_uncore_chabox_constraints[] = {
3438 : : UNCORE_EVENT_CONSTRAINT(0x11, 0x1),
3439 : : UNCORE_EVENT_CONSTRAINT(0x36, 0x1),
3440 : : EVENT_CONSTRAINT_END
3441 : : };
3442 : :
3443 : : static struct extra_reg skx_uncore_cha_extra_regs[] = {
3444 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
3445 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
3446 : : SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
3447 : : SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
3448 : : SNBEP_CBO_EVENT_EXTRA_REG(0x3134, 0xffff, 0x4),
3449 : : SNBEP_CBO_EVENT_EXTRA_REG(0x9134, 0xffff, 0x4),
3450 : : SNBEP_CBO_EVENT_EXTRA_REG(0x35, 0xff, 0x8),
3451 : : SNBEP_CBO_EVENT_EXTRA_REG(0x36, 0xff, 0x8),
3452 : : SNBEP_CBO_EVENT_EXTRA_REG(0x38, 0xff, 0x3),
3453 : : EVENT_EXTRA_END
3454 : : };
3455 : :
3456 : 0 : static u64 skx_cha_filter_mask(int fields)
3457 : : {
3458 : 0 : u64 mask = 0;
3459 : :
3460 [ # # ]: 0 : if (fields & 0x1)
3461 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_TID;
3462 [ # # # # ]: 0 : if (fields & 0x2)
3463 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_LINK;
3464 [ # # # # ]: 0 : if (fields & 0x4)
3465 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_STATE;
3466 [ # # # # ]: 0 : if (fields & 0x8) {
3467 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_REM;
3468 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_LOC;
3469 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_ALL_OPC;
3470 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_NM;
3471 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_NOT_NM;
3472 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_OPC0;
3473 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_OPC1;
3474 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_NC;
3475 : 0 : mask |= SKX_CHA_MSR_PMON_BOX_FILTER_ISOC;
3476 : : }
3477 : 0 : return mask;
3478 : : }
3479 : :
3480 : : static struct event_constraint *
3481 : 0 : skx_cha_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
3482 : : {
3483 : 0 : return __snbep_cbox_get_constraint(box, event, skx_cha_filter_mask);
3484 : : }
3485 : :
3486 : 0 : static int skx_cha_hw_config(struct intel_uncore_box *box, struct perf_event *event)
3487 : : {
3488 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
3489 : 0 : struct extra_reg *er;
3490 : 0 : int idx = 0;
3491 : :
3492 [ # # ]: 0 : for (er = skx_uncore_cha_extra_regs; er->msr; er++) {
3493 [ # # ]: 0 : if (er->event != (event->hw.config & er->config_mask))
3494 : 0 : continue;
3495 : 0 : idx |= er->idx;
3496 : : }
3497 : :
3498 [ # # ]: 0 : if (idx) {
3499 : 0 : reg1->reg = HSWEP_C0_MSR_PMON_BOX_FILTER0 +
3500 : 0 : HSWEP_CBO_MSR_OFFSET * box->pmu->pmu_idx;
3501 [ # # ]: 0 : reg1->config = event->attr.config1 & skx_cha_filter_mask(idx);
3502 : 0 : reg1->idx = idx;
3503 : : }
3504 : 0 : return 0;
3505 : : }
3506 : :
3507 : : static struct intel_uncore_ops skx_uncore_chabox_ops = {
3508 : : /* There is no frz_en for chabox ctl */
3509 : : .init_box = ivbep_uncore_msr_init_box,
3510 : : .disable_box = snbep_uncore_msr_disable_box,
3511 : : .enable_box = snbep_uncore_msr_enable_box,
3512 : : .disable_event = snbep_uncore_msr_disable_event,
3513 : : .enable_event = hswep_cbox_enable_event,
3514 : : .read_counter = uncore_msr_read_counter,
3515 : : .hw_config = skx_cha_hw_config,
3516 : : .get_constraint = skx_cha_get_constraint,
3517 : : .put_constraint = snbep_cbox_put_constraint,
3518 : : };
3519 : :
3520 : : static struct intel_uncore_type skx_uncore_chabox = {
3521 : : .name = "cha",
3522 : : .num_counters = 4,
3523 : : .perf_ctr_bits = 48,
3524 : : .event_ctl = HSWEP_C0_MSR_PMON_CTL0,
3525 : : .perf_ctr = HSWEP_C0_MSR_PMON_CTR0,
3526 : : .event_mask = HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
3527 : : .box_ctl = HSWEP_C0_MSR_PMON_BOX_CTL,
3528 : : .msr_offset = HSWEP_CBO_MSR_OFFSET,
3529 : : .num_shared_regs = 1,
3530 : : .constraints = skx_uncore_chabox_constraints,
3531 : : .ops = &skx_uncore_chabox_ops,
3532 : : .format_group = &skx_uncore_chabox_format_group,
3533 : : };
3534 : :
3535 : : static struct attribute *skx_uncore_iio_formats_attr[] = {
3536 : : &format_attr_event.attr,
3537 : : &format_attr_umask.attr,
3538 : : &format_attr_edge.attr,
3539 : : &format_attr_inv.attr,
3540 : : &format_attr_thresh9.attr,
3541 : : &format_attr_ch_mask.attr,
3542 : : &format_attr_fc_mask.attr,
3543 : : NULL,
3544 : : };
3545 : :
3546 : : static const struct attribute_group skx_uncore_iio_format_group = {
3547 : : .name = "format",
3548 : : .attrs = skx_uncore_iio_formats_attr,
3549 : : };
3550 : :
3551 : : static struct event_constraint skx_uncore_iio_constraints[] = {
3552 : : UNCORE_EVENT_CONSTRAINT(0x83, 0x3),
3553 : : UNCORE_EVENT_CONSTRAINT(0x88, 0xc),
3554 : : UNCORE_EVENT_CONSTRAINT(0x95, 0xc),
3555 : : UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
3556 : : UNCORE_EVENT_CONSTRAINT(0xc5, 0xc),
3557 : : UNCORE_EVENT_CONSTRAINT(0xd4, 0xc),
3558 : : EVENT_CONSTRAINT_END
3559 : : };
3560 : :
3561 : 0 : static void skx_iio_enable_event(struct intel_uncore_box *box,
3562 : : struct perf_event *event)
3563 : : {
3564 : 0 : struct hw_perf_event *hwc = &event->hw;
3565 : :
3566 : 0 : wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
3567 : 0 : }
3568 : :
3569 : : static struct intel_uncore_ops skx_uncore_iio_ops = {
3570 : : .init_box = ivbep_uncore_msr_init_box,
3571 : : .disable_box = snbep_uncore_msr_disable_box,
3572 : : .enable_box = snbep_uncore_msr_enable_box,
3573 : : .disable_event = snbep_uncore_msr_disable_event,
3574 : : .enable_event = skx_iio_enable_event,
3575 : : .read_counter = uncore_msr_read_counter,
3576 : : };
3577 : :
3578 : : static struct intel_uncore_type skx_uncore_iio = {
3579 : : .name = "iio",
3580 : : .num_counters = 4,
3581 : : .num_boxes = 6,
3582 : : .perf_ctr_bits = 48,
3583 : : .event_ctl = SKX_IIO0_MSR_PMON_CTL0,
3584 : : .perf_ctr = SKX_IIO0_MSR_PMON_CTR0,
3585 : : .event_mask = SKX_IIO_PMON_RAW_EVENT_MASK,
3586 : : .event_mask_ext = SKX_IIO_PMON_RAW_EVENT_MASK_EXT,
3587 : : .box_ctl = SKX_IIO0_MSR_PMON_BOX_CTL,
3588 : : .msr_offset = SKX_IIO_MSR_OFFSET,
3589 : : .constraints = skx_uncore_iio_constraints,
3590 : : .ops = &skx_uncore_iio_ops,
3591 : : .format_group = &skx_uncore_iio_format_group,
3592 : : };
3593 : :
3594 : : enum perf_uncore_iio_freerunning_type_id {
3595 : : SKX_IIO_MSR_IOCLK = 0,
3596 : : SKX_IIO_MSR_BW = 1,
3597 : : SKX_IIO_MSR_UTIL = 2,
3598 : :
3599 : : SKX_IIO_FREERUNNING_TYPE_MAX,
3600 : : };
3601 : :
3602 : :
3603 : : static struct freerunning_counters skx_iio_freerunning[] = {
3604 : : [SKX_IIO_MSR_IOCLK] = { 0xa45, 0x1, 0x20, 1, 36 },
3605 : : [SKX_IIO_MSR_BW] = { 0xb00, 0x1, 0x10, 8, 36 },
3606 : : [SKX_IIO_MSR_UTIL] = { 0xb08, 0x1, 0x10, 8, 36 },
3607 : : };
3608 : :
3609 : : static struct uncore_event_desc skx_uncore_iio_freerunning_events[] = {
3610 : : /* Free-Running IO CLOCKS Counter */
3611 : : INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"),
3612 : : /* Free-Running IIO BANDWIDTH Counters */
3613 : : INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"),
3614 : : INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.814697266e-6"),
3615 : : INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
3616 : : INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"),
3617 : : INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.814697266e-6"),
3618 : : INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
3619 : : INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"),
3620 : : INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.814697266e-6"),
3621 : : INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
3622 : : INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"),
3623 : : INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.814697266e-6"),
3624 : : INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
3625 : : INTEL_UNCORE_EVENT_DESC(bw_out_port0, "event=0xff,umask=0x24"),
3626 : : INTEL_UNCORE_EVENT_DESC(bw_out_port0.scale, "3.814697266e-6"),
3627 : : INTEL_UNCORE_EVENT_DESC(bw_out_port0.unit, "MiB"),
3628 : : INTEL_UNCORE_EVENT_DESC(bw_out_port1, "event=0xff,umask=0x25"),
3629 : : INTEL_UNCORE_EVENT_DESC(bw_out_port1.scale, "3.814697266e-6"),
3630 : : INTEL_UNCORE_EVENT_DESC(bw_out_port1.unit, "MiB"),
3631 : : INTEL_UNCORE_EVENT_DESC(bw_out_port2, "event=0xff,umask=0x26"),
3632 : : INTEL_UNCORE_EVENT_DESC(bw_out_port2.scale, "3.814697266e-6"),
3633 : : INTEL_UNCORE_EVENT_DESC(bw_out_port2.unit, "MiB"),
3634 : : INTEL_UNCORE_EVENT_DESC(bw_out_port3, "event=0xff,umask=0x27"),
3635 : : INTEL_UNCORE_EVENT_DESC(bw_out_port3.scale, "3.814697266e-6"),
3636 : : INTEL_UNCORE_EVENT_DESC(bw_out_port3.unit, "MiB"),
3637 : : /* Free-running IIO UTILIZATION Counters */
3638 : : INTEL_UNCORE_EVENT_DESC(util_in_port0, "event=0xff,umask=0x30"),
3639 : : INTEL_UNCORE_EVENT_DESC(util_out_port0, "event=0xff,umask=0x31"),
3640 : : INTEL_UNCORE_EVENT_DESC(util_in_port1, "event=0xff,umask=0x32"),
3641 : : INTEL_UNCORE_EVENT_DESC(util_out_port1, "event=0xff,umask=0x33"),
3642 : : INTEL_UNCORE_EVENT_DESC(util_in_port2, "event=0xff,umask=0x34"),
3643 : : INTEL_UNCORE_EVENT_DESC(util_out_port2, "event=0xff,umask=0x35"),
3644 : : INTEL_UNCORE_EVENT_DESC(util_in_port3, "event=0xff,umask=0x36"),
3645 : : INTEL_UNCORE_EVENT_DESC(util_out_port3, "event=0xff,umask=0x37"),
3646 : : { /* end: all zeroes */ },
3647 : : };
3648 : :
3649 : : static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = {
3650 : : .read_counter = uncore_msr_read_counter,
3651 : : .hw_config = uncore_freerunning_hw_config,
3652 : : };
3653 : :
3654 : : static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = {
3655 : : &format_attr_event.attr,
3656 : : &format_attr_umask.attr,
3657 : : NULL,
3658 : : };
3659 : :
3660 : : static const struct attribute_group skx_uncore_iio_freerunning_format_group = {
3661 : : .name = "format",
3662 : : .attrs = skx_uncore_iio_freerunning_formats_attr,
3663 : : };
3664 : :
3665 : : static struct intel_uncore_type skx_uncore_iio_free_running = {
3666 : : .name = "iio_free_running",
3667 : : .num_counters = 17,
3668 : : .num_boxes = 6,
3669 : : .num_freerunning_types = SKX_IIO_FREERUNNING_TYPE_MAX,
3670 : : .freerunning = skx_iio_freerunning,
3671 : : .ops = &skx_uncore_iio_freerunning_ops,
3672 : : .event_descs = skx_uncore_iio_freerunning_events,
3673 : : .format_group = &skx_uncore_iio_freerunning_format_group,
3674 : : };
3675 : :
3676 : : static struct attribute *skx_uncore_formats_attr[] = {
3677 : : &format_attr_event.attr,
3678 : : &format_attr_umask.attr,
3679 : : &format_attr_edge.attr,
3680 : : &format_attr_inv.attr,
3681 : : &format_attr_thresh8.attr,
3682 : : NULL,
3683 : : };
3684 : :
3685 : : static const struct attribute_group skx_uncore_format_group = {
3686 : : .name = "format",
3687 : : .attrs = skx_uncore_formats_attr,
3688 : : };
3689 : :
3690 : : static struct intel_uncore_type skx_uncore_irp = {
3691 : : .name = "irp",
3692 : : .num_counters = 2,
3693 : : .num_boxes = 6,
3694 : : .perf_ctr_bits = 48,
3695 : : .event_ctl = SKX_IRP0_MSR_PMON_CTL0,
3696 : : .perf_ctr = SKX_IRP0_MSR_PMON_CTR0,
3697 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3698 : : .box_ctl = SKX_IRP0_MSR_PMON_BOX_CTL,
3699 : : .msr_offset = SKX_IRP_MSR_OFFSET,
3700 : : .ops = &skx_uncore_iio_ops,
3701 : : .format_group = &skx_uncore_format_group,
3702 : : };
3703 : :
3704 : : static struct attribute *skx_uncore_pcu_formats_attr[] = {
3705 : : &format_attr_event.attr,
3706 : : &format_attr_umask.attr,
3707 : : &format_attr_edge.attr,
3708 : : &format_attr_inv.attr,
3709 : : &format_attr_thresh8.attr,
3710 : : &format_attr_occ_invert.attr,
3711 : : &format_attr_occ_edge_det.attr,
3712 : : &format_attr_filter_band0.attr,
3713 : : &format_attr_filter_band1.attr,
3714 : : &format_attr_filter_band2.attr,
3715 : : &format_attr_filter_band3.attr,
3716 : : NULL,
3717 : : };
3718 : :
3719 : : static struct attribute_group skx_uncore_pcu_format_group = {
3720 : : .name = "format",
3721 : : .attrs = skx_uncore_pcu_formats_attr,
3722 : : };
3723 : :
3724 : : static struct intel_uncore_ops skx_uncore_pcu_ops = {
3725 : : IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
3726 : : .hw_config = hswep_pcu_hw_config,
3727 : : .get_constraint = snbep_pcu_get_constraint,
3728 : : .put_constraint = snbep_pcu_put_constraint,
3729 : : };
3730 : :
3731 : : static struct intel_uncore_type skx_uncore_pcu = {
3732 : : .name = "pcu",
3733 : : .num_counters = 4,
3734 : : .num_boxes = 1,
3735 : : .perf_ctr_bits = 48,
3736 : : .perf_ctr = HSWEP_PCU_MSR_PMON_CTR0,
3737 : : .event_ctl = HSWEP_PCU_MSR_PMON_CTL0,
3738 : : .event_mask = SNBEP_PCU_MSR_PMON_RAW_EVENT_MASK,
3739 : : .box_ctl = HSWEP_PCU_MSR_PMON_BOX_CTL,
3740 : : .num_shared_regs = 1,
3741 : : .ops = &skx_uncore_pcu_ops,
3742 : : .format_group = &skx_uncore_pcu_format_group,
3743 : : };
3744 : :
3745 : : static struct intel_uncore_type *skx_msr_uncores[] = {
3746 : : &skx_uncore_ubox,
3747 : : &skx_uncore_chabox,
3748 : : &skx_uncore_iio,
3749 : : &skx_uncore_iio_free_running,
3750 : : &skx_uncore_irp,
3751 : : &skx_uncore_pcu,
3752 : : NULL,
3753 : : };
3754 : :
3755 : : /*
3756 : : * To determine the number of CHAs, it should read bits 27:0 in the CAPID6
3757 : : * register which located at Device 30, Function 3, Offset 0x9C. PCI ID 0x2083.
3758 : : */
3759 : : #define SKX_CAPID6 0x9c
3760 : : #define SKX_CHA_BIT_MASK GENMASK(27, 0)
3761 : :
3762 : 0 : static int skx_count_chabox(void)
3763 : : {
3764 : 0 : struct pci_dev *dev = NULL;
3765 : 0 : u32 val = 0;
3766 : :
3767 : 0 : dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x2083, dev);
3768 [ # # ]: 0 : if (!dev)
3769 : 0 : goto out;
3770 : :
3771 : 0 : pci_read_config_dword(dev, SKX_CAPID6, &val);
3772 : 0 : val &= SKX_CHA_BIT_MASK;
3773 : 0 : out:
3774 : 0 : pci_dev_put(dev);
3775 [ # # ]: 0 : return hweight32(val);
3776 : : }
3777 : :
3778 : 0 : void skx_uncore_cpu_init(void)
3779 : : {
3780 : 0 : skx_uncore_chabox.num_boxes = skx_count_chabox();
3781 : 0 : uncore_msr_uncores = skx_msr_uncores;
3782 : 0 : }
3783 : :
3784 : : static struct intel_uncore_type skx_uncore_imc = {
3785 : : .name = "imc",
3786 : : .num_counters = 4,
3787 : : .num_boxes = 6,
3788 : : .perf_ctr_bits = 48,
3789 : : .fixed_ctr_bits = 48,
3790 : : .fixed_ctr = SNBEP_MC_CHy_PCI_PMON_FIXED_CTR,
3791 : : .fixed_ctl = SNBEP_MC_CHy_PCI_PMON_FIXED_CTL,
3792 : : .event_descs = hswep_uncore_imc_events,
3793 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
3794 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
3795 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3796 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
3797 : : .ops = &ivbep_uncore_pci_ops,
3798 : : .format_group = &skx_uncore_format_group,
3799 : : };
3800 : :
3801 : : static struct attribute *skx_upi_uncore_formats_attr[] = {
3802 : : &format_attr_event.attr,
3803 : : &format_attr_umask_ext.attr,
3804 : : &format_attr_edge.attr,
3805 : : &format_attr_inv.attr,
3806 : : &format_attr_thresh8.attr,
3807 : : NULL,
3808 : : };
3809 : :
3810 : : static const struct attribute_group skx_upi_uncore_format_group = {
3811 : : .name = "format",
3812 : : .attrs = skx_upi_uncore_formats_attr,
3813 : : };
3814 : :
3815 : 0 : static void skx_upi_uncore_pci_init_box(struct intel_uncore_box *box)
3816 : : {
3817 : 0 : struct pci_dev *pdev = box->pci_dev;
3818 : :
3819 : 0 : __set_bit(UNCORE_BOX_FLAG_CTL_OFFS8, &box->flags);
3820 : 0 : pci_write_config_dword(pdev, SKX_UPI_PCI_PMON_BOX_CTL, IVBEP_PMON_BOX_CTL_INT);
3821 : 0 : }
3822 : :
3823 : : static struct intel_uncore_ops skx_upi_uncore_pci_ops = {
3824 : : .init_box = skx_upi_uncore_pci_init_box,
3825 : : .disable_box = snbep_uncore_pci_disable_box,
3826 : : .enable_box = snbep_uncore_pci_enable_box,
3827 : : .disable_event = snbep_uncore_pci_disable_event,
3828 : : .enable_event = snbep_uncore_pci_enable_event,
3829 : : .read_counter = snbep_uncore_pci_read_counter,
3830 : : };
3831 : :
3832 : : static struct intel_uncore_type skx_uncore_upi = {
3833 : : .name = "upi",
3834 : : .num_counters = 4,
3835 : : .num_boxes = 3,
3836 : : .perf_ctr_bits = 48,
3837 : : .perf_ctr = SKX_UPI_PCI_PMON_CTR0,
3838 : : .event_ctl = SKX_UPI_PCI_PMON_CTL0,
3839 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3840 : : .event_mask_ext = SKX_UPI_CTL_UMASK_EXT,
3841 : : .box_ctl = SKX_UPI_PCI_PMON_BOX_CTL,
3842 : : .ops = &skx_upi_uncore_pci_ops,
3843 : : .format_group = &skx_upi_uncore_format_group,
3844 : : };
3845 : :
3846 : 0 : static void skx_m2m_uncore_pci_init_box(struct intel_uncore_box *box)
3847 : : {
3848 : 0 : struct pci_dev *pdev = box->pci_dev;
3849 : :
3850 : 0 : __set_bit(UNCORE_BOX_FLAG_CTL_OFFS8, &box->flags);
3851 : 0 : pci_write_config_dword(pdev, SKX_M2M_PCI_PMON_BOX_CTL, IVBEP_PMON_BOX_CTL_INT);
3852 : 0 : }
3853 : :
3854 : : static struct intel_uncore_ops skx_m2m_uncore_pci_ops = {
3855 : : .init_box = skx_m2m_uncore_pci_init_box,
3856 : : .disable_box = snbep_uncore_pci_disable_box,
3857 : : .enable_box = snbep_uncore_pci_enable_box,
3858 : : .disable_event = snbep_uncore_pci_disable_event,
3859 : : .enable_event = snbep_uncore_pci_enable_event,
3860 : : .read_counter = snbep_uncore_pci_read_counter,
3861 : : };
3862 : :
3863 : : static struct intel_uncore_type skx_uncore_m2m = {
3864 : : .name = "m2m",
3865 : : .num_counters = 4,
3866 : : .num_boxes = 2,
3867 : : .perf_ctr_bits = 48,
3868 : : .perf_ctr = SKX_M2M_PCI_PMON_CTR0,
3869 : : .event_ctl = SKX_M2M_PCI_PMON_CTL0,
3870 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3871 : : .box_ctl = SKX_M2M_PCI_PMON_BOX_CTL,
3872 : : .ops = &skx_m2m_uncore_pci_ops,
3873 : : .format_group = &skx_uncore_format_group,
3874 : : };
3875 : :
3876 : : static struct event_constraint skx_uncore_m2pcie_constraints[] = {
3877 : : UNCORE_EVENT_CONSTRAINT(0x23, 0x3),
3878 : : EVENT_CONSTRAINT_END
3879 : : };
3880 : :
3881 : : static struct intel_uncore_type skx_uncore_m2pcie = {
3882 : : .name = "m2pcie",
3883 : : .num_counters = 4,
3884 : : .num_boxes = 4,
3885 : : .perf_ctr_bits = 48,
3886 : : .constraints = skx_uncore_m2pcie_constraints,
3887 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
3888 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
3889 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3890 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
3891 : : .ops = &ivbep_uncore_pci_ops,
3892 : : .format_group = &skx_uncore_format_group,
3893 : : };
3894 : :
3895 : : static struct event_constraint skx_uncore_m3upi_constraints[] = {
3896 : : UNCORE_EVENT_CONSTRAINT(0x1d, 0x1),
3897 : : UNCORE_EVENT_CONSTRAINT(0x1e, 0x1),
3898 : : UNCORE_EVENT_CONSTRAINT(0x40, 0x7),
3899 : : UNCORE_EVENT_CONSTRAINT(0x4e, 0x7),
3900 : : UNCORE_EVENT_CONSTRAINT(0x4f, 0x7),
3901 : : UNCORE_EVENT_CONSTRAINT(0x50, 0x7),
3902 : : UNCORE_EVENT_CONSTRAINT(0x51, 0x7),
3903 : : UNCORE_EVENT_CONSTRAINT(0x52, 0x7),
3904 : : EVENT_CONSTRAINT_END
3905 : : };
3906 : :
3907 : : static struct intel_uncore_type skx_uncore_m3upi = {
3908 : : .name = "m3upi",
3909 : : .num_counters = 3,
3910 : : .num_boxes = 3,
3911 : : .perf_ctr_bits = 48,
3912 : : .constraints = skx_uncore_m3upi_constraints,
3913 : : .perf_ctr = SNBEP_PCI_PMON_CTR0,
3914 : : .event_ctl = SNBEP_PCI_PMON_CTL0,
3915 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
3916 : : .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
3917 : : .ops = &ivbep_uncore_pci_ops,
3918 : : .format_group = &skx_uncore_format_group,
3919 : : };
3920 : :
3921 : : enum {
3922 : : SKX_PCI_UNCORE_IMC,
3923 : : SKX_PCI_UNCORE_M2M,
3924 : : SKX_PCI_UNCORE_UPI,
3925 : : SKX_PCI_UNCORE_M2PCIE,
3926 : : SKX_PCI_UNCORE_M3UPI,
3927 : : };
3928 : :
3929 : : static struct intel_uncore_type *skx_pci_uncores[] = {
3930 : : [SKX_PCI_UNCORE_IMC] = &skx_uncore_imc,
3931 : : [SKX_PCI_UNCORE_M2M] = &skx_uncore_m2m,
3932 : : [SKX_PCI_UNCORE_UPI] = &skx_uncore_upi,
3933 : : [SKX_PCI_UNCORE_M2PCIE] = &skx_uncore_m2pcie,
3934 : : [SKX_PCI_UNCORE_M3UPI] = &skx_uncore_m3upi,
3935 : : NULL,
3936 : : };
3937 : :
3938 : : static const struct pci_device_id skx_uncore_pci_ids[] = {
3939 : : { /* MC0 Channel 0 */
3940 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2042),
3941 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(10, 2, SKX_PCI_UNCORE_IMC, 0),
3942 : : },
3943 : : { /* MC0 Channel 1 */
3944 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2046),
3945 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(10, 6, SKX_PCI_UNCORE_IMC, 1),
3946 : : },
3947 : : { /* MC0 Channel 2 */
3948 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204a),
3949 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(11, 2, SKX_PCI_UNCORE_IMC, 2),
3950 : : },
3951 : : { /* MC1 Channel 0 */
3952 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2042),
3953 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 2, SKX_PCI_UNCORE_IMC, 3),
3954 : : },
3955 : : { /* MC1 Channel 1 */
3956 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2046),
3957 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 6, SKX_PCI_UNCORE_IMC, 4),
3958 : : },
3959 : : { /* MC1 Channel 2 */
3960 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204a),
3961 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(13, 2, SKX_PCI_UNCORE_IMC, 5),
3962 : : },
3963 : : { /* M2M0 */
3964 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2066),
3965 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(8, 0, SKX_PCI_UNCORE_M2M, 0),
3966 : : },
3967 : : { /* M2M1 */
3968 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2066),
3969 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(9, 0, SKX_PCI_UNCORE_M2M, 1),
3970 : : },
3971 : : { /* UPI0 Link 0 */
3972 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2058),
3973 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(14, 0, SKX_PCI_UNCORE_UPI, 0),
3974 : : },
3975 : : { /* UPI0 Link 1 */
3976 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2058),
3977 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(15, 0, SKX_PCI_UNCORE_UPI, 1),
3978 : : },
3979 : : { /* UPI1 Link 2 */
3980 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2058),
3981 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(16, 0, SKX_PCI_UNCORE_UPI, 2),
3982 : : },
3983 : : { /* M2PCIe 0 */
3984 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
3985 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 1, SKX_PCI_UNCORE_M2PCIE, 0),
3986 : : },
3987 : : { /* M2PCIe 1 */
3988 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
3989 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(22, 1, SKX_PCI_UNCORE_M2PCIE, 1),
3990 : : },
3991 : : { /* M2PCIe 2 */
3992 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
3993 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(23, 1, SKX_PCI_UNCORE_M2PCIE, 2),
3994 : : },
3995 : : { /* M2PCIe 3 */
3996 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2088),
3997 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 5, SKX_PCI_UNCORE_M2PCIE, 3),
3998 : : },
3999 : : { /* M3UPI0 Link 0 */
4000 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
4001 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 0),
4002 : : },
4003 : : { /* M3UPI0 Link 1 */
4004 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204E),
4005 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 2, SKX_PCI_UNCORE_M3UPI, 1),
4006 : : },
4007 : : { /* M3UPI1 Link 2 */
4008 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
4009 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 5, SKX_PCI_UNCORE_M3UPI, 2),
4010 : : },
4011 : : { /* end: all zeroes */ }
4012 : : };
4013 : :
4014 : :
4015 : : static struct pci_driver skx_uncore_pci_driver = {
4016 : : .name = "skx_uncore",
4017 : : .id_table = skx_uncore_pci_ids,
4018 : : };
4019 : :
4020 : 0 : int skx_uncore_pci_init(void)
4021 : : {
4022 : : /* need to double check pci address */
4023 : 0 : int ret = snbep_pci2phy_map_init(0x2014, SKX_CPUNODEID, SKX_GIDNIDMAP, false);
4024 : :
4025 [ # # ]: 0 : if (ret)
4026 : : return ret;
4027 : :
4028 : 0 : uncore_pci_uncores = skx_pci_uncores;
4029 : 0 : uncore_pci_driver = &skx_uncore_pci_driver;
4030 : 0 : return 0;
4031 : : }
4032 : :
4033 : : /* end of SKX uncore support */
4034 : :
4035 : : /* SNR uncore support */
4036 : :
4037 : : static struct intel_uncore_type snr_uncore_ubox = {
4038 : : .name = "ubox",
4039 : : .num_counters = 2,
4040 : : .num_boxes = 1,
4041 : : .perf_ctr_bits = 48,
4042 : : .fixed_ctr_bits = 48,
4043 : : .perf_ctr = SNR_U_MSR_PMON_CTR0,
4044 : : .event_ctl = SNR_U_MSR_PMON_CTL0,
4045 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4046 : : .fixed_ctr = SNR_U_MSR_PMON_UCLK_FIXED_CTR,
4047 : : .fixed_ctl = SNR_U_MSR_PMON_UCLK_FIXED_CTL,
4048 : : .ops = &ivbep_uncore_msr_ops,
4049 : : .format_group = &ivbep_uncore_format_group,
4050 : : };
4051 : :
4052 : : static struct attribute *snr_uncore_cha_formats_attr[] = {
4053 : : &format_attr_event.attr,
4054 : : &format_attr_umask_ext2.attr,
4055 : : &format_attr_edge.attr,
4056 : : &format_attr_tid_en.attr,
4057 : : &format_attr_inv.attr,
4058 : : &format_attr_thresh8.attr,
4059 : : &format_attr_filter_tid5.attr,
4060 : : NULL,
4061 : : };
4062 : : static const struct attribute_group snr_uncore_chabox_format_group = {
4063 : : .name = "format",
4064 : : .attrs = snr_uncore_cha_formats_attr,
4065 : : };
4066 : :
4067 : 0 : static int snr_cha_hw_config(struct intel_uncore_box *box, struct perf_event *event)
4068 : : {
4069 : 0 : struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
4070 : :
4071 : 0 : reg1->reg = SNR_C0_MSR_PMON_BOX_FILTER0 +
4072 : 0 : box->pmu->type->msr_offset * box->pmu->pmu_idx;
4073 : 0 : reg1->config = event->attr.config1 & SKX_CHA_MSR_PMON_BOX_FILTER_TID;
4074 : 0 : reg1->idx = 0;
4075 : :
4076 : 0 : return 0;
4077 : : }
4078 : :
4079 : 0 : static void snr_cha_enable_event(struct intel_uncore_box *box,
4080 : : struct perf_event *event)
4081 : : {
4082 : 0 : struct hw_perf_event *hwc = &event->hw;
4083 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
4084 : :
4085 [ # # ]: 0 : if (reg1->idx != EXTRA_REG_NONE)
4086 : 0 : wrmsrl(reg1->reg, reg1->config);
4087 : :
4088 : 0 : wrmsrl(hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
4089 : 0 : }
4090 : :
4091 : : static struct intel_uncore_ops snr_uncore_chabox_ops = {
4092 : : .init_box = ivbep_uncore_msr_init_box,
4093 : : .disable_box = snbep_uncore_msr_disable_box,
4094 : : .enable_box = snbep_uncore_msr_enable_box,
4095 : : .disable_event = snbep_uncore_msr_disable_event,
4096 : : .enable_event = snr_cha_enable_event,
4097 : : .read_counter = uncore_msr_read_counter,
4098 : : .hw_config = snr_cha_hw_config,
4099 : : };
4100 : :
4101 : : static struct intel_uncore_type snr_uncore_chabox = {
4102 : : .name = "cha",
4103 : : .num_counters = 4,
4104 : : .num_boxes = 6,
4105 : : .perf_ctr_bits = 48,
4106 : : .event_ctl = SNR_CHA_MSR_PMON_CTL0,
4107 : : .perf_ctr = SNR_CHA_MSR_PMON_CTR0,
4108 : : .box_ctl = SNR_CHA_MSR_PMON_BOX_CTL,
4109 : : .msr_offset = HSWEP_CBO_MSR_OFFSET,
4110 : : .event_mask = HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
4111 : : .event_mask_ext = SNR_CHA_RAW_EVENT_MASK_EXT,
4112 : : .ops = &snr_uncore_chabox_ops,
4113 : : .format_group = &snr_uncore_chabox_format_group,
4114 : : };
4115 : :
4116 : : static struct attribute *snr_uncore_iio_formats_attr[] = {
4117 : : &format_attr_event.attr,
4118 : : &format_attr_umask.attr,
4119 : : &format_attr_edge.attr,
4120 : : &format_attr_inv.attr,
4121 : : &format_attr_thresh9.attr,
4122 : : &format_attr_ch_mask2.attr,
4123 : : &format_attr_fc_mask2.attr,
4124 : : NULL,
4125 : : };
4126 : :
4127 : : static const struct attribute_group snr_uncore_iio_format_group = {
4128 : : .name = "format",
4129 : : .attrs = snr_uncore_iio_formats_attr,
4130 : : };
4131 : :
4132 : : static struct intel_uncore_type snr_uncore_iio = {
4133 : : .name = "iio",
4134 : : .num_counters = 4,
4135 : : .num_boxes = 5,
4136 : : .perf_ctr_bits = 48,
4137 : : .event_ctl = SNR_IIO_MSR_PMON_CTL0,
4138 : : .perf_ctr = SNR_IIO_MSR_PMON_CTR0,
4139 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4140 : : .event_mask_ext = SNR_IIO_PMON_RAW_EVENT_MASK_EXT,
4141 : : .box_ctl = SNR_IIO_MSR_PMON_BOX_CTL,
4142 : : .msr_offset = SNR_IIO_MSR_OFFSET,
4143 : : .ops = &ivbep_uncore_msr_ops,
4144 : : .format_group = &snr_uncore_iio_format_group,
4145 : : };
4146 : :
4147 : : static struct intel_uncore_type snr_uncore_irp = {
4148 : : .name = "irp",
4149 : : .num_counters = 2,
4150 : : .num_boxes = 5,
4151 : : .perf_ctr_bits = 48,
4152 : : .event_ctl = SNR_IRP0_MSR_PMON_CTL0,
4153 : : .perf_ctr = SNR_IRP0_MSR_PMON_CTR0,
4154 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4155 : : .box_ctl = SNR_IRP0_MSR_PMON_BOX_CTL,
4156 : : .msr_offset = SNR_IRP_MSR_OFFSET,
4157 : : .ops = &ivbep_uncore_msr_ops,
4158 : : .format_group = &ivbep_uncore_format_group,
4159 : : };
4160 : :
4161 : : static struct intel_uncore_type snr_uncore_m2pcie = {
4162 : : .name = "m2pcie",
4163 : : .num_counters = 4,
4164 : : .num_boxes = 5,
4165 : : .perf_ctr_bits = 48,
4166 : : .event_ctl = SNR_M2PCIE_MSR_PMON_CTL0,
4167 : : .perf_ctr = SNR_M2PCIE_MSR_PMON_CTR0,
4168 : : .box_ctl = SNR_M2PCIE_MSR_PMON_BOX_CTL,
4169 : : .msr_offset = SNR_M2PCIE_MSR_OFFSET,
4170 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4171 : : .ops = &ivbep_uncore_msr_ops,
4172 : : .format_group = &ivbep_uncore_format_group,
4173 : : };
4174 : :
4175 : 0 : static int snr_pcu_hw_config(struct intel_uncore_box *box, struct perf_event *event)
4176 : : {
4177 : 0 : struct hw_perf_event *hwc = &event->hw;
4178 : 0 : struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
4179 : 0 : int ev_sel = hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK;
4180 : :
4181 [ # # ]: 0 : if (ev_sel >= 0xb && ev_sel <= 0xe) {
4182 : 0 : reg1->reg = SNR_PCU_MSR_PMON_BOX_FILTER;
4183 : 0 : reg1->idx = ev_sel - 0xb;
4184 : 0 : reg1->config = event->attr.config1 & (0xff << reg1->idx);
4185 : : }
4186 : 0 : return 0;
4187 : : }
4188 : :
4189 : : static struct intel_uncore_ops snr_uncore_pcu_ops = {
4190 : : IVBEP_UNCORE_MSR_OPS_COMMON_INIT(),
4191 : : .hw_config = snr_pcu_hw_config,
4192 : : .get_constraint = snbep_pcu_get_constraint,
4193 : : .put_constraint = snbep_pcu_put_constraint,
4194 : : };
4195 : :
4196 : : static struct intel_uncore_type snr_uncore_pcu = {
4197 : : .name = "pcu",
4198 : : .num_counters = 4,
4199 : : .num_boxes = 1,
4200 : : .perf_ctr_bits = 48,
4201 : : .perf_ctr = SNR_PCU_MSR_PMON_CTR0,
4202 : : .event_ctl = SNR_PCU_MSR_PMON_CTL0,
4203 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4204 : : .box_ctl = SNR_PCU_MSR_PMON_BOX_CTL,
4205 : : .num_shared_regs = 1,
4206 : : .ops = &snr_uncore_pcu_ops,
4207 : : .format_group = &skx_uncore_pcu_format_group,
4208 : : };
4209 : :
4210 : : enum perf_uncore_snr_iio_freerunning_type_id {
4211 : : SNR_IIO_MSR_IOCLK,
4212 : : SNR_IIO_MSR_BW_IN,
4213 : :
4214 : : SNR_IIO_FREERUNNING_TYPE_MAX,
4215 : : };
4216 : :
4217 : : static struct freerunning_counters snr_iio_freerunning[] = {
4218 : : [SNR_IIO_MSR_IOCLK] = { 0x1eac, 0x1, 0x10, 1, 48 },
4219 : : [SNR_IIO_MSR_BW_IN] = { 0x1f00, 0x1, 0x10, 8, 48 },
4220 : : };
4221 : :
4222 : : static struct uncore_event_desc snr_uncore_iio_freerunning_events[] = {
4223 : : /* Free-Running IIO CLOCKS Counter */
4224 : : INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"),
4225 : : /* Free-Running IIO BANDWIDTH IN Counters */
4226 : : INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"),
4227 : : INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.814697266e-6"),
4228 : : INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
4229 : : INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"),
4230 : : INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.814697266e-6"),
4231 : : INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
4232 : : INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"),
4233 : : INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.814697266e-6"),
4234 : : INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
4235 : : INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"),
4236 : : INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.814697266e-6"),
4237 : : INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
4238 : : INTEL_UNCORE_EVENT_DESC(bw_in_port4, "event=0xff,umask=0x24"),
4239 : : INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.814697266e-6"),
4240 : : INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit, "MiB"),
4241 : : INTEL_UNCORE_EVENT_DESC(bw_in_port5, "event=0xff,umask=0x25"),
4242 : : INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.814697266e-6"),
4243 : : INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit, "MiB"),
4244 : : INTEL_UNCORE_EVENT_DESC(bw_in_port6, "event=0xff,umask=0x26"),
4245 : : INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.814697266e-6"),
4246 : : INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit, "MiB"),
4247 : : INTEL_UNCORE_EVENT_DESC(bw_in_port7, "event=0xff,umask=0x27"),
4248 : : INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.814697266e-6"),
4249 : : INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit, "MiB"),
4250 : : { /* end: all zeroes */ },
4251 : : };
4252 : :
4253 : : static struct intel_uncore_type snr_uncore_iio_free_running = {
4254 : : .name = "iio_free_running",
4255 : : .num_counters = 9,
4256 : : .num_boxes = 5,
4257 : : .num_freerunning_types = SNR_IIO_FREERUNNING_TYPE_MAX,
4258 : : .freerunning = snr_iio_freerunning,
4259 : : .ops = &skx_uncore_iio_freerunning_ops,
4260 : : .event_descs = snr_uncore_iio_freerunning_events,
4261 : : .format_group = &skx_uncore_iio_freerunning_format_group,
4262 : : };
4263 : :
4264 : : static struct intel_uncore_type *snr_msr_uncores[] = {
4265 : : &snr_uncore_ubox,
4266 : : &snr_uncore_chabox,
4267 : : &snr_uncore_iio,
4268 : : &snr_uncore_irp,
4269 : : &snr_uncore_m2pcie,
4270 : : &snr_uncore_pcu,
4271 : : &snr_uncore_iio_free_running,
4272 : : NULL,
4273 : : };
4274 : :
4275 : 0 : void snr_uncore_cpu_init(void)
4276 : : {
4277 : 0 : uncore_msr_uncores = snr_msr_uncores;
4278 : 0 : }
4279 : :
4280 : 0 : static void snr_m2m_uncore_pci_init_box(struct intel_uncore_box *box)
4281 : : {
4282 : 0 : struct pci_dev *pdev = box->pci_dev;
4283 : 0 : int box_ctl = uncore_pci_box_ctl(box);
4284 : :
4285 : 0 : __set_bit(UNCORE_BOX_FLAG_CTL_OFFS8, &box->flags);
4286 : 0 : pci_write_config_dword(pdev, box_ctl, IVBEP_PMON_BOX_CTL_INT);
4287 : 0 : }
4288 : :
4289 : : static struct intel_uncore_ops snr_m2m_uncore_pci_ops = {
4290 : : .init_box = snr_m2m_uncore_pci_init_box,
4291 : : .disable_box = snbep_uncore_pci_disable_box,
4292 : : .enable_box = snbep_uncore_pci_enable_box,
4293 : : .disable_event = snbep_uncore_pci_disable_event,
4294 : : .enable_event = snbep_uncore_pci_enable_event,
4295 : : .read_counter = snbep_uncore_pci_read_counter,
4296 : : };
4297 : :
4298 : : static struct attribute *snr_m2m_uncore_formats_attr[] = {
4299 : : &format_attr_event.attr,
4300 : : &format_attr_umask_ext3.attr,
4301 : : &format_attr_edge.attr,
4302 : : &format_attr_inv.attr,
4303 : : &format_attr_thresh8.attr,
4304 : : NULL,
4305 : : };
4306 : :
4307 : : static const struct attribute_group snr_m2m_uncore_format_group = {
4308 : : .name = "format",
4309 : : .attrs = snr_m2m_uncore_formats_attr,
4310 : : };
4311 : :
4312 : : static struct intel_uncore_type snr_uncore_m2m = {
4313 : : .name = "m2m",
4314 : : .num_counters = 4,
4315 : : .num_boxes = 1,
4316 : : .perf_ctr_bits = 48,
4317 : : .perf_ctr = SNR_M2M_PCI_PMON_CTR0,
4318 : : .event_ctl = SNR_M2M_PCI_PMON_CTL0,
4319 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4320 : : .event_mask_ext = SNR_M2M_PCI_PMON_UMASK_EXT,
4321 : : .box_ctl = SNR_M2M_PCI_PMON_BOX_CTL,
4322 : : .ops = &snr_m2m_uncore_pci_ops,
4323 : : .format_group = &snr_m2m_uncore_format_group,
4324 : : };
4325 : :
4326 : : enum {
4327 : : SNR_PCI_UNCORE_M2M,
4328 : : };
4329 : :
4330 : : static struct intel_uncore_type *snr_pci_uncores[] = {
4331 : : [SNR_PCI_UNCORE_M2M] = &snr_uncore_m2m,
4332 : : NULL,
4333 : : };
4334 : :
4335 : : static const struct pci_device_id snr_uncore_pci_ids[] = {
4336 : : { /* M2M */
4337 : : PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
4338 : : .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, SNR_PCI_UNCORE_M2M, 0),
4339 : : },
4340 : : { /* end: all zeroes */ }
4341 : : };
4342 : :
4343 : : static struct pci_driver snr_uncore_pci_driver = {
4344 : : .name = "snr_uncore",
4345 : : .id_table = snr_uncore_pci_ids,
4346 : : };
4347 : :
4348 : 0 : int snr_uncore_pci_init(void)
4349 : : {
4350 : : /* SNR UBOX DID */
4351 : 0 : int ret = snbep_pci2phy_map_init(0x3460, SKX_CPUNODEID,
4352 : : SKX_GIDNIDMAP, true);
4353 : :
4354 [ # # ]: 0 : if (ret)
4355 : : return ret;
4356 : :
4357 : 0 : uncore_pci_uncores = snr_pci_uncores;
4358 : 0 : uncore_pci_driver = &snr_uncore_pci_driver;
4359 : 0 : return 0;
4360 : : }
4361 : :
4362 : 0 : static struct pci_dev *snr_uncore_get_mc_dev(int id)
4363 : : {
4364 : 0 : struct pci_dev *mc_dev = NULL;
4365 : 0 : int phys_id, pkg;
4366 : :
4367 : 0 : while (1) {
4368 : 0 : mc_dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x3451, mc_dev);
4369 [ # # ]: 0 : if (!mc_dev)
4370 : : break;
4371 : 0 : phys_id = uncore_pcibus_to_physid(mc_dev->bus);
4372 [ # # ]: 0 : if (phys_id < 0)
4373 : 0 : continue;
4374 : 0 : pkg = topology_phys_to_logical_pkg(phys_id);
4375 [ # # ]: 0 : if (pkg < 0)
4376 : 0 : continue;
4377 [ # # ]: 0 : else if (pkg == id)
4378 : : break;
4379 : : }
4380 : 0 : return mc_dev;
4381 : : }
4382 : :
4383 : 0 : static void snr_uncore_mmio_init_box(struct intel_uncore_box *box)
4384 : : {
4385 : 0 : struct pci_dev *pdev = snr_uncore_get_mc_dev(box->dieid);
4386 [ # # ]: 0 : unsigned int box_ctl = uncore_mmio_box_ctl(box);
4387 : 0 : resource_size_t addr;
4388 : 0 : u32 pci_dword;
4389 : :
4390 [ # # ]: 0 : if (!pdev)
4391 : 0 : return;
4392 : :
4393 : 0 : pci_read_config_dword(pdev, SNR_IMC_MMIO_BASE_OFFSET, &pci_dword);
4394 : 0 : addr = (pci_dword & SNR_IMC_MMIO_BASE_MASK) << 23;
4395 : :
4396 : 0 : pci_read_config_dword(pdev, SNR_IMC_MMIO_MEM0_OFFSET, &pci_dword);
4397 : 0 : addr |= (pci_dword & SNR_IMC_MMIO_MEM0_MASK) << 12;
4398 : :
4399 : 0 : addr += box_ctl;
4400 : :
4401 : 0 : box->io_addr = ioremap(addr, SNR_IMC_MMIO_SIZE);
4402 [ # # ]: 0 : if (!box->io_addr)
4403 : : return;
4404 : :
4405 : 0 : writel(IVBEP_PMON_BOX_CTL_INT, box->io_addr);
4406 : : }
4407 : :
4408 : 0 : static void snr_uncore_mmio_disable_box(struct intel_uncore_box *box)
4409 : : {
4410 : 0 : u32 config;
4411 : :
4412 [ # # ]: 0 : if (!box->io_addr)
4413 : : return;
4414 : :
4415 : 0 : config = readl(box->io_addr);
4416 : 0 : config |= SNBEP_PMON_BOX_CTL_FRZ;
4417 : 0 : writel(config, box->io_addr);
4418 : : }
4419 : :
4420 : 0 : static void snr_uncore_mmio_enable_box(struct intel_uncore_box *box)
4421 : : {
4422 : 0 : u32 config;
4423 : :
4424 [ # # ]: 0 : if (!box->io_addr)
4425 : : return;
4426 : :
4427 : 0 : config = readl(box->io_addr);
4428 : 0 : config &= ~SNBEP_PMON_BOX_CTL_FRZ;
4429 : 0 : writel(config, box->io_addr);
4430 : : }
4431 : :
4432 : 0 : static void snr_uncore_mmio_enable_event(struct intel_uncore_box *box,
4433 : : struct perf_event *event)
4434 : : {
4435 : 0 : struct hw_perf_event *hwc = &event->hw;
4436 : :
4437 [ # # ]: 0 : if (!box->io_addr)
4438 : : return;
4439 : :
4440 : 0 : writel(hwc->config | SNBEP_PMON_CTL_EN,
4441 : 0 : box->io_addr + hwc->config_base);
4442 : : }
4443 : :
4444 : 0 : static void snr_uncore_mmio_disable_event(struct intel_uncore_box *box,
4445 : : struct perf_event *event)
4446 : : {
4447 : 0 : struct hw_perf_event *hwc = &event->hw;
4448 : :
4449 [ # # ]: 0 : if (!box->io_addr)
4450 : : return;
4451 : :
4452 : 0 : writel(hwc->config, box->io_addr + hwc->config_base);
4453 : : }
4454 : :
4455 : : static struct intel_uncore_ops snr_uncore_mmio_ops = {
4456 : : .init_box = snr_uncore_mmio_init_box,
4457 : : .exit_box = uncore_mmio_exit_box,
4458 : : .disable_box = snr_uncore_mmio_disable_box,
4459 : : .enable_box = snr_uncore_mmio_enable_box,
4460 : : .disable_event = snr_uncore_mmio_disable_event,
4461 : : .enable_event = snr_uncore_mmio_enable_event,
4462 : : .read_counter = uncore_mmio_read_counter,
4463 : : };
4464 : :
4465 : : static struct uncore_event_desc snr_uncore_imc_events[] = {
4466 : : INTEL_UNCORE_EVENT_DESC(clockticks, "event=0x00,umask=0x00"),
4467 : : INTEL_UNCORE_EVENT_DESC(cas_count_read, "event=0x04,umask=0x0f"),
4468 : : INTEL_UNCORE_EVENT_DESC(cas_count_read.scale, "6.103515625e-5"),
4469 : : INTEL_UNCORE_EVENT_DESC(cas_count_read.unit, "MiB"),
4470 : : INTEL_UNCORE_EVENT_DESC(cas_count_write, "event=0x04,umask=0x30"),
4471 : : INTEL_UNCORE_EVENT_DESC(cas_count_write.scale, "6.103515625e-5"),
4472 : : INTEL_UNCORE_EVENT_DESC(cas_count_write.unit, "MiB"),
4473 : : { /* end: all zeroes */ },
4474 : : };
4475 : :
4476 : : static struct intel_uncore_type snr_uncore_imc = {
4477 : : .name = "imc",
4478 : : .num_counters = 4,
4479 : : .num_boxes = 2,
4480 : : .perf_ctr_bits = 48,
4481 : : .fixed_ctr_bits = 48,
4482 : : .fixed_ctr = SNR_IMC_MMIO_PMON_FIXED_CTR,
4483 : : .fixed_ctl = SNR_IMC_MMIO_PMON_FIXED_CTL,
4484 : : .event_descs = snr_uncore_imc_events,
4485 : : .perf_ctr = SNR_IMC_MMIO_PMON_CTR0,
4486 : : .event_ctl = SNR_IMC_MMIO_PMON_CTL0,
4487 : : .event_mask = SNBEP_PMON_RAW_EVENT_MASK,
4488 : : .box_ctl = SNR_IMC_MMIO_PMON_BOX_CTL,
4489 : : .mmio_offset = SNR_IMC_MMIO_OFFSET,
4490 : : .ops = &snr_uncore_mmio_ops,
4491 : : .format_group = &skx_uncore_format_group,
4492 : : };
4493 : :
4494 : : enum perf_uncore_snr_imc_freerunning_type_id {
4495 : : SNR_IMC_DCLK,
4496 : : SNR_IMC_DDR,
4497 : :
4498 : : SNR_IMC_FREERUNNING_TYPE_MAX,
4499 : : };
4500 : :
4501 : : static struct freerunning_counters snr_imc_freerunning[] = {
4502 : : [SNR_IMC_DCLK] = { 0x22b0, 0x0, 0, 1, 48 },
4503 : : [SNR_IMC_DDR] = { 0x2290, 0x8, 0, 2, 48 },
4504 : : };
4505 : :
4506 : : static struct uncore_event_desc snr_uncore_imc_freerunning_events[] = {
4507 : : INTEL_UNCORE_EVENT_DESC(dclk, "event=0xff,umask=0x10"),
4508 : :
4509 : : INTEL_UNCORE_EVENT_DESC(read, "event=0xff,umask=0x20"),
4510 : : INTEL_UNCORE_EVENT_DESC(read.scale, "3.814697266e-6"),
4511 : : INTEL_UNCORE_EVENT_DESC(read.unit, "MiB"),
4512 : : INTEL_UNCORE_EVENT_DESC(write, "event=0xff,umask=0x21"),
4513 : : INTEL_UNCORE_EVENT_DESC(write.scale, "3.814697266e-6"),
4514 : : INTEL_UNCORE_EVENT_DESC(write.unit, "MiB"),
4515 : : { /* end: all zeroes */ },
4516 : : };
4517 : :
4518 : : static struct intel_uncore_ops snr_uncore_imc_freerunning_ops = {
4519 : : .init_box = snr_uncore_mmio_init_box,
4520 : : .exit_box = uncore_mmio_exit_box,
4521 : : .read_counter = uncore_mmio_read_counter,
4522 : : .hw_config = uncore_freerunning_hw_config,
4523 : : };
4524 : :
4525 : : static struct intel_uncore_type snr_uncore_imc_free_running = {
4526 : : .name = "imc_free_running",
4527 : : .num_counters = 3,
4528 : : .num_boxes = 1,
4529 : : .num_freerunning_types = SNR_IMC_FREERUNNING_TYPE_MAX,
4530 : : .freerunning = snr_imc_freerunning,
4531 : : .ops = &snr_uncore_imc_freerunning_ops,
4532 : : .event_descs = snr_uncore_imc_freerunning_events,
4533 : : .format_group = &skx_uncore_iio_freerunning_format_group,
4534 : : };
4535 : :
4536 : : static struct intel_uncore_type *snr_mmio_uncores[] = {
4537 : : &snr_uncore_imc,
4538 : : &snr_uncore_imc_free_running,
4539 : : NULL,
4540 : : };
4541 : :
4542 : 0 : void snr_uncore_mmio_init(void)
4543 : : {
4544 : 0 : uncore_mmio_uncores = snr_mmio_uncores;
4545 : 0 : }
4546 : :
4547 : : /* end of SNR uncore support */
|