summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4/io/fpc/fpc.h
blob: 5eec01c5277edaae76972b436d56d80374b20b83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_FPC_H
#define	_FPC_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#define	SUCCESS	0
#define	FAILURE	-1

#define	NUM_LEAVES	2

extern int fpc_debug;
#define	FPC_DBG1 if (fpc_debug >= 1) printf
#define	FPC_DBG2 if (fpc_debug >= 2) printf

/*
 * Defs for fpc-kstat.c.  Put'em here for now even though they don't
 * have to do with the lower-level implementation.
 */
extern int fpc_kstat_init(dev_info_t *dip);
extern void fpc_kstat_fini(dev_info_t *dip);

typedef enum fire_perfcnt {
	jbc = 0,
	imu,
	mmu,
	tlu,
	lpu
} fire_perfcnt_t;

/* Set to the last entry in fire_perfcnt_t. */
#define	MAX_REG_TYPES		((int)lpu + 1)

#define	NUM_JBC_COUNTERS	2
#define	NUM_IMU_COUNTERS	2
#define	NUM_MMU_COUNTERS	2
#define	NUM_TLU_COUNTERS	3
#define	NUM_LPU_COUNTERS	2

/* Sum of all NUM_xxx_COUNTERS above. */
#define	NUM_TOTAL_COUNTERS	11

/* largest group of counters */
#define	NUM_MAX_COUNTERS	NUM_TLU_COUNTERS

/* Event mask related. */

/* How much an event for a given PIC is shifted within the event mask. */

#define	PIC0_EVT_SEL_SHIFT	0
#define	PIC1_EVT_SEL_SHIFT	8
#define	PIC2_EVT_SEL_SHIFT	16

/* Width or mask of a single event within an event mask. */

#define	JBC01_EVT_MASK		0xFF
#define	IMU01_EVT_MASK		0xFF
#define	MMU01_EVT_MASK		0xFF
#define	TLU01_EVT_MASK		0xFF
#define	TLU2_EVT_MASK		0x3
#define	LPU12_EVT_MASK		0xFFFF

/* Positioned masks for different event fields within an event mask. */

#define	JBC_PIC0_EVT_MASK	((uint64_t)JBC01_EVT_MASK << PIC0_EVT_SEL_SHIFT)
#define	JBC_PIC1_EVT_MASK	((uint64_t)JBC01_EVT_MASK << PIC1_EVT_SEL_SHIFT)
#define	IMU_PIC0_EVT_MASK	((uint64_t)IMU01_EVT_MASK << PIC0_EVT_SEL_SHIFT)
#define	IMU_PIC1_EVT_MASK	((uint64_t)IMU01_EVT_MASK << PIC1_EVT_SEL_SHIFT)
#define	MMU_PIC0_EVT_MASK	((uint64_t)MMU01_EVT_MASK << PIC0_EVT_SEL_SHIFT)
#define	MMU_PIC1_EVT_MASK	((uint64_t)MMU01_EVT_MASK << PIC1_EVT_SEL_SHIFT)
#define	TLU_PIC0_EVT_MASK	((uint64_t)TLU01_EVT_MASK << PIC0_EVT_SEL_SHIFT)
#define	TLU_PIC1_EVT_MASK	((uint64_t)TLU01_EVT_MASK << PIC1_EVT_SEL_SHIFT)
#define	TLU_PIC2_EVT_MASK	((uint64_t)TLU2_EVT_MASK << PIC2_EVT_SEL_SHIFT)
#define	LPU_PIC0_EVT_MASK	((uint64_t)LPU12_EVT_MASK << PIC0_EVT_SEL_SHIFT)
#define	LPU_PIC1_EVT_MASK	((uint64_t)LPU12_EVT_MASK << PIC2_EVT_SEL_SHIFT)

/*
 * Take a dip to define the device...
 *   sun4v: can convert dip to a dev_hdl needed for hyp. perf ctr interface.
 *   sun4u: can convert dip to an ldi_ident_t I can use for a layered PCItool
 *	ioctl.
 *
 * Define which of JBUS, PCIE_A and PCIE_B regs are available.  HW partitioning
 * may make some register sets unavailable to certain virtual nodes.
 */

#define	JBUS_REGS_AVAIL		0x1	/* JBUS regs avail */
#define	PCIE_A_REGS_AVAIL	0x2
#define	PCIE_B_REGS_AVAIL	0x4

/* For checking platform from _init before installing module */
extern int fpc_init_platform_check();

/* Low level module initialization done at attach time. */
extern int fpc_perfcnt_module_init(dev_info_t *dip, int *avail);
extern int fpc_perfcnt_module_fini(dev_info_t *dip);

/*
 * Program a performance counter.
 *
 * reggroup is which type of counter.
 * counter is the counter number.
 * event is the event to program for that counter.
 */
extern int fpc_perfcnt_program(int devnum, fire_perfcnt_t reggroup,
    uint64_t event);

/*
 * Read a performance counter.
 *
 * reggroup is which type of counter.
 * counter is the counter number.
 * event_p returns the event programmed for that counter.
 * value_p returns the counter value.
 */
extern int fpc_perfcnt_read(int devnum, fire_perfcnt_t reggroup,
    uint64_t *event_p, uint64_t values[NUM_MAX_COUNTERS]);

/*
 * Definitions of the different types of events.
 *
 * The first part says which registers these events are for.
 * For example, JBC01 means the JBC performance counters 0 and 1
 */

#define	JBC01_S_EVT_NONE		"event_none"
#define	JBC01_S_EVT_CLK			"clock_cyc"
#define	JBC01_S_EVT_IDLE		"idle_cyc"
#define	JBC01_S_EVT_FIRE		"fire_jbus_cyc"
#define	JBC01_S_EVT_READ_LATENCY	"rd_latency_cyc"
#define	JBC01_S_EVT_READ_SAMPLE		"rd_sample"
#define	JBC01_S_EVT_I2C_PIO		"pios_i2c"
#define	JBC01_S_EVT_EBUS_PIO		"pios_ebus"
#define	JBC01_S_EVT_RINGA_PIO		"pios_ringA"
#define	JBC01_S_EVT_RINGB_PIO		"pios_ringB"
#define	JBC01_S_EVT_PARTIAL_WR		"partial_wr"
#define	JBC01_S_EVT_TOTAL_WR		"total_wr"
#define	JBC01_S_EVT_TOTAL_RD		"total_rd"
#define	JBC01_S_EVT_AOKOFF		"aokoff"
#define	JBC01_S_EVT_DOKOFF		"dokoff"
#define	JBC01_S_EVT_DAOKOFF		"daokoff"
#define	JBC01_S_EVT_JBUS_COH_XACT	"jbus_coh_tr"
#define	JBC01_S_EVT_FIRE_COH_XACT	"fire_coh_tr"
#define	JBC01_S_EVT_JBUS_NCOH_XACT	"jbus_ncoh_tr"
#define	JBC01_S_EVT_FGN_IO_HIT		"fgn_pio_hit"
#define	JBC01_S_EVT_FIRE_WBS		"fire_wb"
#define	JBC01_S_EVT_PCIEA_PIO_WR	"pio_wr_pcieA"
#define	JBC01_S_EVT_PCIEA_PIO_RD	"pio_rd_pcieA"
#define	JBC01_S_EVT_PCIEB_PIO_WR	"pio_wr_pcieB"
#define	JBC01_S_EVT_PCIEB_PIO_RD	"pio_rd_pcieB"

#define	JBC01_EVT_NONE			0x0
#define	JBC01_EVT_CLK			0x1
#define	JBC01_EVT_IDLE			0x2
#define	JBC01_EVT_FIRE			0x3
#define	JBC01_EVT_READ_LATENCY		0x4
#define	JBC01_EVT_READ_SAMPLE		0x5
#define	JBC01_EVT_I2C_PIO		0x6
#define	JBC01_EVT_EBUS_PIO		0x7
#define	JBC01_EVT_RINGA_PIO		0x8
#define	JBC01_EVT_RINGB_PIO		0x9
#define	JBC01_EVT_PARTIAL_WR		0xA
#define	JBC01_EVT_TOTAL_WR		0xB
#define	JBC01_EVT_TOTAL_RD		0xC
#define	JBC01_EVT_AOKOFF		0xD
#define	JBC01_EVT_DOKOFF		0xE
#define	JBC01_EVT_DAOKOFF		0xF
#define	JBC01_EVT_JBUS_COH_XACT		0x10
#define	JBC01_EVT_FIRE_COH_XACT		0x11
#define	JBC01_EVT_JBUS_NCOH_XACT	0x12
#define	JBC01_EVT_FGN_IO_HIT		0x13
#define	JBC01_EVT_FIRE_WBS		0x14
#define	JBC01_EVT_PCIEA_PIO_WR		0x15
#define	JBC01_EVT_PCIEA_PIO_RD		0x16
#define	JBC01_EVT_PCIEB_PIO_WR		0x17
#define	JBC01_EVT_PCIEB_PIO_RD		0x18

#define	IMU01_S_EVT_NONE		"event_none"
#define	IMU01_S_EVT_CLK			"clock_cyc"
#define	IMU01_S_EVT_MONDO		"mondos_iss"
#define	IMU01_S_EVT_MSI			"msi_iss"
#define	IMU01_S_EVT_MONDO_NAKS		"mondos_nacks"
#define	IMU01_S_EVT_EQ_WR		"eq_wr"
#define	IMU01_S_EVT_EQ_MONDO		"eq_mondos"

#define	IMU01_EVT_NONE			0x0
#define	IMU01_EVT_CLK			0x1
#define	IMU01_EVT_MONDO			0x2
#define	IMU01_EVT_MSI			0x3
#define	IMU01_EVT_MONDO_NAKS		0x4
#define	IMU01_EVT_EQ_WR			0x5
#define	IMU01_EVT_EQ_MONDO		0x6

#define	MMU01_S_EVT_NONE		"event_none"
#define	MMU01_S_EVT_CLK			"clock_cyc"
#define	MMU01_S_EVT_TRANS		"total_transl"
#define	MMU01_S_EVT_STALL		"total_stall_cyc"
#define	MMU01_S_EVT_TRANSL_MISS		"total_tranl_miss"
#define	MMU01_S_EVT_TBLWLK_STALL	"tblwlk_stall_cyc"
#define	MMU01_S_EVT_BYPASS_TRANSL	"bypass_transl"
#define	MMU01_S_EVT_TRANSL_TRANSL	"transl_transl"
#define	MMU01_S_EVT_FLOW_CNTL_STALL	"flow_stall_cyc"
#define	MMU01_S_EVT_FLUSH_CACHE_ENT	"cache_entr_flush"

#define	MMU01_EVT_NONE			0x0
#define	MMU01_EVT_CLK			0x1
#define	MMU01_EVT_TRANSL		0x2
#define	MMU01_EVT_STALL			0x3
#define	MMU01_EVT_TRANSL_MISS		0x4
#define	MMU01_EVT_TBLWLK_STALL		0x5
#define	MMU01_EVT_BYPASS_TRANSL		0x6
#define	MMU01_EVT_TRANSL_TRANSL		0x7
#define	MMU01_EVT_FLOW_CNTL_STALL	0x8
#define	MMU01_EVT_FLUSH_CACHE_ENT	0x9

#define	TLU01_S_EVT_NONE		"event_none"
#define	TLU01_S_EVT_CLK			"clock_cyc"
#define	TLU01_S_EVT_COMPL		"compl_recvd"
#define	TLU01_S_EVT_XMT_POST_CR_UNAV	"post_cr_unav_cyc"
#define	TLU01_S_EVT_XMT_NPOST_CR_UNAV	"npost_cr_unav_cyc"
#define	TLU01_S_EVT_XMT_CMPL_CR_UNAV	"compl_cr_unav_cyc"
#define	TLU01_S_EVT_XMT_ANY_CR_UNAV	"trans_cr_any_unav"
#define	TLU01_S_EVT_RETRY_CR_UNAV	"retry_cr_unav"
#define	TLU01_S_EVT_MEMRD_PKT_RCVD	"recvd_mem_rd_pkt"
#define	TLU01_S_EVT_MEMWR_PKT_RCVD	"recvd_mem_wr_pkt"
#define	TLU01_S_EVT_RCV_CR_THRESH	"recv_cr_thresh"
#define	TLU01_S_EVT_RCV_PST_HDR_CR_EXH	"recv_hdr_cr_exh_cyc"
#define	TLU01_S_EVT_RCV_PST_DA_CR_MPS	"recv_post_da_cr_mps"
#define	TLU01_S_EVT_RCV_NPST_HDR_CR_EXH	"recv_npost_hdr_cr_exh"
#define	TLU01_S_EVT_RCVR_L0S		"recvr_l0s_cyc"
#define	TLU01_S_EVT_RCVR_L0S_TRANS	"recvr_l0s_trans"
#define	TLU01_S_EVT_XMTR_L0S		"trans_l0s_cyc"
#define	TLU01_S_EVT_XMTR_L0S_TRANS	"trans_l0s_trans"
#define	TLU01_S_EVT_RCVR_ERR		"recvr_err"
#define	TLU01_S_EVT_BAD_TLP		"bad_tlp"
#define	TLU01_S_EVT_BAD_DLLP		"bad_dllp"
#define	TLU01_S_EVT_REPLAY_ROLLOVER	"replay_rollover"
#define	TLU01_S_EVT_REPLAY_TMO		"replay_to"

#define	TLU01_EVT_NONE			0x0
#define	TLU01_EVT_CLK			0x1
#define	TLU01_EVT_COMPL			0x2
#define	TLU01_EVT_XMT_POST_CR_UNAV	0x10
#define	TLU01_EVT_XMT_NPOST_CR_UNAV	0x11
#define	TLU01_EVT_XMT_CMPL_CR_UNAV	0x12
#define	TLU01_EVT_XMT_ANY_CR_UNAV	0x13
#define	TLU01_EVT_RETRY_CR_UNAV		0x14
#define	TLU01_EVT_MEMRD_PKT_RCVD	0x20
#define	TLU01_EVT_MEMWR_PKT_RCVD	0x21
#define	TLU01_EVT_RCV_CR_THRESH		0x22
#define	TLU01_EVT_RCV_PST_HDR_CR_EXH	0x23
#define	TLU01_EVT_RCV_PST_DA_CR_MPS	0x24
#define	TLU01_EVT_RCV_NPST_HDR_CR_EXH	0x25
#define	TLU01_EVT_RCVR_L0S		0x30
#define	TLU01_EVT_RCVR_L0S_TRANS	0x31
#define	TLU01_EVT_XMTR_L0S		0x32
#define	TLU01_EVT_XMTR_L0S_TRANS	0x33
#define	TLU01_EVT_RCVR_ERR		0x40
#define	TLU01_EVT_BAD_TLP		0x42
#define	TLU01_EVT_BAD_DLLP		0x43
#define	TLU01_EVT_REPLAY_ROLLOVER	0x44
#define	TLU01_EVT_REPLAY_TMO		0x47

#define	TLU2_S_EVT_NONE			"event_none"
#define	TLU2_S_EVT_NON_POST_COMPL_TIME	"non_post_compl"
#define	TLU2_S_EVT_XMT_DATA_WORD	"trans_data_words"
#define	TLU2_S_EVT_RCVD_DATA_WORD	"recvd_data_words"

#define	TLU2_EVT_NONE			0x0
#define	TLU2_EVT_NON_POST_COMPL_TIME	0x1
#define	TLU2_EVT_XMT_DATA_WORD		0x2
#define	TLU2_EVT_RCVD_DATA_WORD		0x3

#define	LPU12_S_EVT_RESET		"event_reset"
#define	LPU12_S_EVT_TLP_RCVD		"tlp_recvd"
#define	LPU12_S_EVT_DLLP_RCVD		"dllp_recvd"
#define	LPU12_S_EVT_ACK_DLLP_RCVD	"ack_dllp_recvd"
#define	LPU12_S_EVT_NAK_DLLP_RCVD	"nak_dllp_recvd"
#define	LPU12_S_EVT_RETRY_START		"retries_started"
#define	LPU12_S_EVT_REPLAY_TMO		"replay_timer_to"
#define	LPU12_S_EVT_ACK_NAK_LAT_TMO	"ack_nak_lat_to"
#define	LPU12_S_EVT_BAD_DLLP		"bad_dllp"
#define	LPU12_S_EVT_BAD_TLP		"bad_tlp"
#define	LPU12_S_EVT_NAK_DLLP_SENT	"nak_dllp_sent"
#define	LPU12_S_EVT_ACK_DLLP_SENT	"ack_dllp_sent"
#define	LPU12_S_EVT_RCVR_ERROR		"recvr_err"
#define	LPU12_S_EVT_LTSSM_RECOV_ENTRY	"ltssm_recov_entr"
#define	LPU12_S_EVT_REPLAY_IN_PROG	"replay_prog_cyc"
#define	LPU12_S_EVT_TLP_XMT_IN_PROG	"tlp_trans_prog_cyc"
#define	LPU12_S_EVT_CLK_CYC		"clock_cyc"
#define	LPU12_S_EVT_TLP_DLLP_XMT_PROG	"tlp_dllp_trans_cyc"
#define	LPU12_S_EVT_TLP_DLLP_RCV_PROG	"tlp_dllp_recv_cyc"

#define	LPU12_EVT_RESET			0x0
#define	LPU12_EVT_TLP_RCVD		0x1
#define	LPU12_EVT_DLLP_RCVD		0x2
#define	LPU12_EVT_ACK_DLLP_RCVD		0x3
#define	LPU12_EVT_NAK_DLLP_RCVD		0x4
#define	LPU12_EVT_RETRY_START		0x5
#define	LPU12_EVT_REPLAY_TMO		0x6
#define	LPU12_EVT_ACK_NAK_LAT_TMO	0x7
#define	LPU12_EVT_BAD_DLLP		0x8
#define	LPU12_EVT_BAD_TLP		0x9
#define	LPU12_EVT_NAK_DLLP_SENT		0xA
#define	LPU12_EVT_ACK_DLLP_SENT		0xB
#define	LPU12_EVT_RCVR_ERROR		0xC
#define	LPU12_EVT_LTSSM_RECOV_ENTRY	0xD
#define	LPU12_EVT_REPLAY_IN_PROG	0xE
#define	LPU12_EVT_TLP_XMT_IN_PROG	0xF
#define	LPU12_EVT_CLK_CYC		0x10
#define	LPU12_EVT_TLP_DLLP_XMT_PROG	0x11
#define	LPU12_EVT_TLP_DLLP_RCV_PROG	0x12

#define	COMMON_S_CLEAR_PIC		"clear_pic"

#ifdef	__cplusplus
}
#endif

#endif	/* _FPC_H */