xref: /onnv-gate/usr/src/uts/sun4u/starcat/sys/axq.h (revision 1708:ea74d8598a3a)
1*1708Sstevel /*
2*1708Sstevel  * CDDL HEADER START
3*1708Sstevel  *
4*1708Sstevel  * The contents of this file are subject to the terms of the
5*1708Sstevel  * Common Development and Distribution License (the "License").
6*1708Sstevel  * You may not use this file except in compliance with the License.
7*1708Sstevel  *
8*1708Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*1708Sstevel  * or http://www.opensolaris.org/os/licensing.
10*1708Sstevel  * See the License for the specific language governing permissions
11*1708Sstevel  * and limitations under the License.
12*1708Sstevel  *
13*1708Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
14*1708Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*1708Sstevel  * If applicable, add the following below this CDDL HEADER, with the
16*1708Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
17*1708Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
18*1708Sstevel  *
19*1708Sstevel  * CDDL HEADER END
20*1708Sstevel  */
21*1708Sstevel 
22*1708Sstevel /*
23*1708Sstevel  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
24*1708Sstevel  * Use is subject to license terms.
25*1708Sstevel  */
26*1708Sstevel 
27*1708Sstevel #ifndef _SYS_AXQ_H
28*1708Sstevel #define	_SYS_AXQ_H
29*1708Sstevel 
30*1708Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*1708Sstevel 
32*1708Sstevel #ifdef	__cplusplus
33*1708Sstevel extern "C" {
34*1708Sstevel #endif
35*1708Sstevel 
36*1708Sstevel /* AXQ register offset constant */
37*1708Sstevel #define	AXQ_REG_OFFSET		0x20
38*1708Sstevel #define	AXQ_REGOFF(idx)		((idx) * AXQ_REG_OFFSET)
39*1708Sstevel 
40*1708Sstevel /*
41*1708Sstevel  * AXQ system register offsets
42*1708Sstevel  * Each Starcat AXQ asic instance is logically
43*1708Sstevel  * associated with each slot in the expander board.
44*1708Sstevel  * Slot 0 is the full slot (or full bandwidth slot)
45*1708Sstevel  * and Slot1 is the half slot (or half bandwidth slot).
46*1708Sstevel  * Some system registers are only accessible in certain
47*1708Sstevel  * slot type.
48*1708Sstevel  */
49*1708Sstevel 
50*1708Sstevel /* domain control register (slot0 & slot1) */
51*1708Sstevel #define	AXQ_SLOT0_DOMCTRL	AXQ_REGOFF(0x1)
52*1708Sstevel #define	AXQ_SLOT1_DOMCTRL	AXQ_REGOFF(0x2)
53*1708Sstevel 
54*1708Sstevel /* cpu2ssc intr register */
55*1708Sstevel #define	AXQ_SLOT_CPU2SSC_INTR	AXQ_REGOFF(0x3)
56*1708Sstevel 
57*1708Sstevel /* performance counters (one set per slot) */
58*1708Sstevel #define	AXQ_SLOT0_PERFCNT_SEL	AXQ_REGOFF(0x9)
59*1708Sstevel #define	AXQ_SLOT0_PERFCNT0	AXQ_REGOFF(0xA)
60*1708Sstevel #define	AXQ_SLOT0_PERFCNT1	AXQ_REGOFF(0xB)
61*1708Sstevel #define	AXQ_SLOT0_PERFCNT2	AXQ_REGOFF(0xC)
62*1708Sstevel #define	AXQ_SLOT1_PERFCNT_SEL	AXQ_REGOFF(0x8)
63*1708Sstevel #define	AXQ_SLOT1_PERFCNT0	AXQ_REGOFF(0xD)
64*1708Sstevel #define	AXQ_SLOT1_PERFCNT1	AXQ_REGOFF(0xE)
65*1708Sstevel #define	AXQ_SLOT1_PERFCNT2	AXQ_REGOFF(0xF)
66*1708Sstevel 
67*1708Sstevel /* CASM slots (for both slot0 & slot1) */
68*1708Sstevel #define	AXQ_CASM_SLOT_START	AXQ_REGOFF(0x10)
69*1708Sstevel #define	AXQ_CASM_SLOT_END	AXQ_REGOFF(0x21)
70*1708Sstevel 
71*1708Sstevel /* CDC registers (only available in slot0) */
72*1708Sstevel #define	AXQ_SLOT0_CDC_ADR_TEST	AXQ_REGOFF(0x2C)
73*1708Sstevel #define	AXQ_SLOT0_CDC_CTL_TEST	AXQ_REGOFF(0x2D)
74*1708Sstevel #define	AXQ_SLOT0_CDC_DATA_WR3	AXQ_REGOFF(0x2E)
75*1708Sstevel #define	AXQ_SLOT0_CDC_DATA_WR2	AXQ_REGOFF(0x2F)
76*1708Sstevel #define	AXQ_SLOT0_CDC_DATA_WR1	AXQ_REGOFF(0x30)
77*1708Sstevel #define	AXQ_SLOT0_CDC_DATA_WR0	AXQ_REGOFF(0x31)
78*1708Sstevel #define	AXQ_SLOT0_CDC_CNT_TEST	AXQ_REGOFF(0x32)
79*1708Sstevel #define	AXQ_SLOT0_CDC_RD_DATA3	AXQ_REGOFF(0x33)
80*1708Sstevel #define	AXQ_SLOT0_CDC_RD_DATA2	AXQ_REGOFF(0x34)
81*1708Sstevel #define	AXQ_SLOT0_CDC_RD_DATA1	AXQ_REGOFF(0x35)
82*1708Sstevel #define	AXQ_SLOT0_CDC_RD_DATA0	AXQ_REGOFF(0x36)
83*1708Sstevel 
84*1708Sstevel /* NASM registers */
85*1708Sstevel #define	AXQ_SLOT0_NASM		AXQ_REGOFF(0x37)
86*1708Sstevel #define	AXQ_SLOT1_NASM		AXQ_REGOFF(0x38)
87*1708Sstevel 
88*1708Sstevel #define	AXQ_NASM_TYPE_IO		0
89*1708Sstevel #define	AXQ_NASM_TYPE_SLOT0_CMMU	1
90*1708Sstevel #define	AXQ_NASM_TYPE_WIB		2
91*1708Sstevel #define	AXQ_NASM_TYPE_WIB_STRIPED	3
92*1708Sstevel #define	AXQ_NASM_TYPE_SHIFT		5
93*1708Sstevel 
94*1708Sstevel /* SDI Timeout register */
95*1708Sstevel #define	AXQ_SLOT_SDI_TIMEOUT_RD		AXQ_REGOFF(0x2A)
96*1708Sstevel #define	AXQ_SLOT_SDI_TIMEOUT_RDCLR	AXQ_REGOFF(0x2B)
97*1708Sstevel 
98*1708Sstevel /*
99*1708Sstevel  * Bits for domain control register
100*1708Sstevel  */
101*1708Sstevel #define	AXQ_DOMCTRL_BUSY	0x1
102*1708Sstevel #define	AXQ_DOMCTRL_PAUSE	0x10
103*1708Sstevel #define	AXQ_DOMCTRL_PIOFIX	0x40
104*1708Sstevel 
105*1708Sstevel /*
106*1708Sstevel  * Bits for CDC registers
107*1708Sstevel  */
108*1708Sstevel /* CDC control test register */
109*1708Sstevel #define	AXQ_CDC_TMODE_WR		0x20000
110*1708Sstevel #define	AXQ_CDC_TMODE_RDCMP		0x40000
111*1708Sstevel #define	AXQ_CDC_TMODE_WR_RDCMP0		0x60000
112*1708Sstevel #define	AXQ_CDC_TMODE_WR_RDCMP1		0x80000
113*1708Sstevel #define	AXQ_CDC_DATA_ECC_CHK_EN		0x10000
114*1708Sstevel #define	AXQ_CDC_ADR_PAR_CHK_EN		0x08000
115*1708Sstevel #define	AXQ_CDC_DATA_ECC_GEN_EN		0x04000
116*1708Sstevel #define	AXQ_CDC_ADR_PAR_GEN_EN		0x02000
117*1708Sstevel #define	AXQ_CDC_DATA2PAR_MUX_SEL_DATA	0x00800
118*1708Sstevel #define	AXQ_CDC_ADR2SRAM_MUX_SEL_TEST	0x00080
119*1708Sstevel #define	AXQ_CDC_ADR_INCR_XOR_CTRL	0x00010
120*1708Sstevel #define	AXQ_CDC_DIS			0x00001
121*1708Sstevel 
122*1708Sstevel /* CDC Address Test register */
123*1708Sstevel #define	AXQ_CDC_ADR_TEST_EN		0x80000
124*1708Sstevel 
125*1708Sstevel /* CDC counter test register */
126*1708Sstevel #define	AXQ_CDC_CNT_TEST_DONE		0x80000000
127*1708Sstevel 
128*1708Sstevel /*
129*1708Sstevel  * Bits for CPU to SSC interrupt register
130*1708Sstevel  */
131*1708Sstevel #define	AXQ_CPU2SSC_INTR_PEND		0x80000000
132*1708Sstevel 
133*1708Sstevel /*
134*1708Sstevel  * Each AXQ instance has one pcr (performance control
135*1708Sstevel  * register) controlling 3 pics (performance instru-
136*1708Sstevel  * mentation counter).  pic0 and pic1 are similar
137*1708Sstevel  * and have identical inputs to their muxes. pic2
138*1708Sstevel  * only counts the clock.
139*1708Sstevel  */
140*1708Sstevel 
141*1708Sstevel /* Bit masks for selecting pic mux input */
142*1708Sstevel #define	FREEZE_CNT	0x0
143*1708Sstevel #define	COUNT_CLK	0x1
144*1708Sstevel #define	HA_INPUT_FIFO	0x2
145*1708Sstevel #define	HA_INTR_INFO	0x3
146*1708Sstevel #define	HA_PIO_FIFO	0x4
147*1708Sstevel #define	HA_ADR_FIFO_LK3	0x5
148*1708Sstevel #define	HA_ADR_FIFO_LK2	0x6
149*1708Sstevel #define	HA_ADR_FIFO_LK1	0x7
150*1708Sstevel #define	HA_ADR_FIFO_LK0	0x8
151*1708Sstevel #define	HA_DUMP_Q	0x9
152*1708Sstevel #define	HA_RD_F_STB_Q	0xA
153*1708Sstevel #define	HA_DP_WR_Q	0xB
154*1708Sstevel #define	HA_INT_Q	0xC
155*1708Sstevel #define	HA_WRB_Q	0xD
156*1708Sstevel #define	HA_WR_MP_Q	0xE
157*1708Sstevel #define	HA_WRTAG_Q	0xF
158*1708Sstevel #define	HA_WT_WAIT_FIFO	0x10
159*1708Sstevel #define	HA_WRB_STB_FIFO	0x11
160*1708Sstevel #define	HA_AP0_Q	0x12
161*1708Sstevel #define	HA_AP1_Q	0x13
162*1708Sstevel #define	HA_NEW_WR_Q	0x14
163*1708Sstevel #define	HA_DP_RD_Q	0x15
164*1708Sstevel #define	HA_UNLOCK_Q	0x16
165*1708Sstevel #define	HA_CDC_UPD_Q	0x17
166*1708Sstevel #define	HA_DS_Q		0x18
167*1708Sstevel #define	HA_UNLK_WAIT_Q	0x19
168*1708Sstevel #define	HA_RD_MP_Q	0x1A
169*1708Sstevel #define	L2_IO_Q		0x1B
170*1708Sstevel #define	L2_SB_Q		0x1C
171*1708Sstevel #define	L2_RA_Q		0x1D
172*1708Sstevel #define	L2_HA_Q		0x1E
173*1708Sstevel #define	L2_SA_Q		0x1F
174*1708Sstevel #define	RA_WAIT_FIFO	0x20
175*1708Sstevel #define	RA_WRB_INV_FIFO	0x21
176*1708Sstevel #define	RA_WRB_FIFO	0x22
177*1708Sstevel #define	RA_CC_PTR_FIFO	0x23
178*1708Sstevel #define	RA_IO_PTR_FIFO	0x24
179*1708Sstevel #define	RA_INT_PTR_FIFO	0x25
180*1708Sstevel #define	RA_RP_Q		0x26
181*1708Sstevel #define	RA_WRB_RP_Q	0x27
182*1708Sstevel #define	RA_DP_Q		0x28
183*1708Sstevel #define	RA_DP_STB_Q	0x29
184*1708Sstevel #define	RA_GTARG_Q	0x2A
185*1708Sstevel #define	SDC_RECV_Q	0x2B
186*1708Sstevel #define	SDC_REDIR_IO_Q	0x2C
187*1708Sstevel #define	SDC_REDIR_SB_Q	0x2D
188*1708Sstevel #define	SDC_OUTB_IO_Q	0x2E
189*1708Sstevel #define	SDC_OUTB_SB_Q	0x2F
190*1708Sstevel #define	SA_ADD1_INPUT_Q	0x30
191*1708Sstevel #define	SA_ADD2_INPUT_Q	0x31
192*1708Sstevel #define	SA_INV_Q	0x32
193*1708Sstevel #define	SA_NO_INV_Q	0x33
194*1708Sstevel #define	SA_INT_DP_Q	0x34
195*1708Sstevel #define	SA_DP_Q		0x35
196*1708Sstevel #define	SL_WRTAG_Q	0x36
197*1708Sstevel #define	SL_RTO_DP_Q	0x37
198*1708Sstevel #define	SYSREG_INPUT_Q	0x38
199*1708Sstevel #define	SDI_SYS_STATUS1	0x39
200*1708Sstevel #define	SDI_SYS_STATUS0	0x3A
201*1708Sstevel #define	CDC_HITS	0x3B
202*1708Sstevel #define	TOTAL_CDC_READ	0x3C
203*1708Sstevel #define	HA_WATRANID_SD	0x3D
204*1708Sstevel #define	HA_STB_SD	0x3E
205*1708Sstevel #define	HA_L2_IRQ_SD	0x3F
206*1708Sstevel #define	HA_SL_WRTAG_SD	0x40
207*1708Sstevel #define	AA_HOME_CC_FULL	0x41
208*1708Sstevel #define	AA_HOME_IO_FULL	0x42
209*1708Sstevel #define	AA_SLAVE_FULL	0x43
210*1708Sstevel #define	AA_RP_FULL	0x44
211*1708Sstevel 
212*1708Sstevel /* Shift definitions into pcr for programming pics */
213*1708Sstevel #define	AXQ_PIC_SHIFT	7
214*1708Sstevel 
215*1708Sstevel /* event constants */
216*1708Sstevel #define	AXQ_NUM_EVENTS		0x45
217*1708Sstevel #define	AXQ_PIC0_1_NUM_EVENTS	0x45
218*1708Sstevel #define	AXQ_PIC2_NUM_EVENTS	0x2
219*1708Sstevel #define	AXQ_NUM_PICS	3
220*1708Sstevel #define	AXQ_PIC_CLEAR_MASK	0x7F
221*1708Sstevel 
222*1708Sstevel /* AXQ constants */
223*1708Sstevel #define	SLOT0_AXQ		0
224*1708Sstevel #define	SLOT1_AXQ		1
225*1708Sstevel #define	AXQ_MAX_EXP		18
226*1708Sstevel #define	AXQ_MAX_SLOT_PER_EXP	2
227*1708Sstevel #define	AXQ_CDC_SRAM_SIZE	0x40000
228*1708Sstevel #define	AXQ_CDC_FLUSH_WAIT	4
229*1708Sstevel #define	AXQ_INTR_PEND_WAIT	10
230*1708Sstevel #define	AXQ_NASM_SIZE		256
231*1708Sstevel 
232*1708Sstevel /*
233*1708Sstevel  * Struct element describing a eventname and
234*1708Sstevel  * its pcr-mask.
235*1708Sstevel  */
236*1708Sstevel typedef struct axq_event_mask {
237*1708Sstevel 	char	*event_name;
238*1708Sstevel 	uint64_t pcr_mask;
239*1708Sstevel } axq_event_mask_t;
240*1708Sstevel 
241*1708Sstevel /*
242*1708Sstevel  * NASM RAM system register for reading
243*1708Sstevel  */
244*1708Sstevel typedef union {
245*1708Sstevel 	struct axq_nasm_read {
246*1708Sstevel 		uint32_t pad	: 16;
247*1708Sstevel 		uint32_t valid	: 1;
248*1708Sstevel 		uint32_t addr	: 8;
249*1708Sstevel 		uint32_t data	: 7;
250*1708Sstevel 	} bit;
251*1708Sstevel 	uint32_t val;
252*1708Sstevel } axq_nasm_read_u;
253*1708Sstevel 
254*1708Sstevel /*
255*1708Sstevel  * NASM RAM system register for reading
256*1708Sstevel  */
257*1708Sstevel typedef union {
258*1708Sstevel 	struct axq_nasm_write {
259*1708Sstevel 		uint32_t pad	: 16;
260*1708Sstevel 		uint32_t addr	: 8;
261*1708Sstevel 		uint32_t rw	: 1;
262*1708Sstevel 		uint32_t data	: 7;
263*1708Sstevel 	} bit;
264*1708Sstevel 	uint32_t val;
265*1708Sstevel } axq_nasm_write_u;
266*1708Sstevel 
267*1708Sstevel 
268*1708Sstevel /*
269*1708Sstevel  * Global data structure that is used to
270*1708Sstevel  * export certain axq registers in
271*1708Sstevel  * local space. Right now, the only
272*1708Sstevel  * register we want to access in local space
273*1708Sstevel  * is the cheetah2ssc interrupt reg. There
274*1708Sstevel  * could be more in future.
275*1708Sstevel  */
276*1708Sstevel struct axq_local_regs {
277*1708Sstevel 	kmutex_t axq_local_lock;
278*1708Sstevel 	int initflag;
279*1708Sstevel 	caddr_t laddress;
280*1708Sstevel 	ddi_acc_handle_t ac;
281*1708Sstevel 	volatile uint32_t *axq_cpu2ssc_intr;
282*1708Sstevel };
283*1708Sstevel 
284*1708Sstevel /*
285*1708Sstevel  * axq soft state data structure.
286*1708Sstevel  */
287*1708Sstevel struct axq_soft_state {
288*1708Sstevel 	dev_info_t *dip;		/* devinfo of myself */
289*1708Sstevel 	uint32_t portid;		/* port id */
290*1708Sstevel 	uint32_t expid;			/* expander id */
291*1708Sstevel 	uchar_t slotnum;		/* slot 0 or 1 */
292*1708Sstevel 	caddr_t address;		/* mapped devnode addr property */
293*1708Sstevel 	ddi_acc_handle_t ac0;		/* access handle for reg0 mapping */
294*1708Sstevel 	uint64_t axq_phyaddr;		/* physical address of conf space */
295*1708Sstevel 	kmutex_t axq_lock;		/* mutex protecting this softstate */
296*1708Sstevel 
297*1708Sstevel 	volatile uint32_t *axq_domain_ctrl;
298*1708Sstevel 
299*1708Sstevel 	/* CASM register slots */
300*1708Sstevel 	volatile uint32_t *axq_casm_slot[18];
301*1708Sstevel 
302*1708Sstevel 	/* NASM register */
303*1708Sstevel 	volatile uint32_t *axq_nasm;
304*1708Sstevel 
305*1708Sstevel 	/* CDC registers (only in slot0) */
306*1708Sstevel 	volatile uint32_t *axq_cdc_addrtest;
307*1708Sstevel 	volatile uint32_t *axq_cdc_ctrltest;
308*1708Sstevel 	volatile uint32_t *axq_cdc_datawrite0;
309*1708Sstevel 	volatile uint32_t *axq_cdc_datawrite1;
310*1708Sstevel 	volatile uint32_t *axq_cdc_datawrite2;
311*1708Sstevel 	volatile uint32_t *axq_cdc_datawrite3;
312*1708Sstevel 	volatile uint32_t *axq_cdc_counter;
313*1708Sstevel 	volatile uint32_t *axq_cdc_readdata0;
314*1708Sstevel 	volatile uint32_t *axq_cdc_readdata1;
315*1708Sstevel 	volatile uint32_t *axq_cdc_readdata2;
316*1708Sstevel 	volatile uint32_t *axq_cdc_readdata3;
317*1708Sstevel 
318*1708Sstevel 	/* performance counters */
319*1708Sstevel 	volatile uint32_t *axq_pcr;
320*1708Sstevel 	volatile uint32_t *axq_pic0;
321*1708Sstevel 	volatile uint32_t *axq_pic1;
322*1708Sstevel 	volatile uint32_t *axq_pic2;
323*1708Sstevel 	kstat_t *axq_counters_ksp;	/* perf counter kstat */
324*1708Sstevel 
325*1708Sstevel 	/* SDI timeout register */
326*1708Sstevel 	volatile uint32_t *axq_sdi_timeout_rd;
327*1708Sstevel 	volatile uint32_t *axq_sdi_timeout_rdclr;
328*1708Sstevel 
329*1708Sstevel 	uint32_t axq_cdc_state;		/* CDC state - enabled/disabled */
330*1708Sstevel 	int paused;			/* AXQ_DOMCTRL_PAUSE asserted */
331*1708Sstevel 
332*1708Sstevel #ifndef _AXQ_LOCAL_ACCESS_SUPPORTED
333*1708Sstevel 	/*
334*1708Sstevel 	 * No local access for cpu2ssc intr
335*1708Sstevel 	 * Need to provide per instance explicit expander addressing
336*1708Sstevel 	 */
337*1708Sstevel 	volatile uint32_t *axq_cpu2ssc_intr;
338*1708Sstevel #endif /* _AXQ_LOCAL_ACCESS_SUPPORTED */
339*1708Sstevel };
340*1708Sstevel 
341*1708Sstevel /*
342*1708Sstevel  * Public interface
343*1708Sstevel  */
344*1708Sstevel extern int axq_cdc_flush(uint32_t, int, int);
345*1708Sstevel extern int axq_cdc_flush_all();
346*1708Sstevel extern int axq_cdc_disable_flush_all();
347*1708Sstevel extern void axq_cdc_enable_all();
348*1708Sstevel extern int axq_iopause_enable_all(uint32_t *);
349*1708Sstevel extern void axq_iopause_disable_all();
350*1708Sstevel extern uint32_t axq_casm_read(uint32_t, uint32_t, int);
351*1708Sstevel extern int axq_casm_write(uint32_t, uint32_t, int, uint32_t);
352*1708Sstevel extern int axq_casm_write_all(int, uint32_t);
353*1708Sstevel extern int axq_do_casm_rename_script(uint64_t **, int, int);
354*1708Sstevel extern int axq_cpu2ssc_intr(uint8_t);
355*1708Sstevel extern uint32_t axq_read_sdi_timeout_reg(uint32_t, uint32_t, int);
356*1708Sstevel extern int axq_nasm_read(uint32_t expid, uint32_t slot, uint32_t nasm_entry,
357*1708Sstevel     uint32_t *data);
358*1708Sstevel extern int axq_nasm_write(uint32_t expid, uint32_t slot, uint32_t nasm_entry,
359*1708Sstevel     uint32_t data);
360*1708Sstevel extern int axq_nasm_write_all(uint32_t nasm_entry, uint32_t data);
361*1708Sstevel extern void axq_array_rw_enter(void);
362*1708Sstevel extern void axq_array_rw_exit(void);
363*1708Sstevel 
364*1708Sstevel #ifdef	__cplusplus
365*1708Sstevel }
366*1708Sstevel #endif
367*1708Sstevel 
368*1708Sstevel #endif	/* _SYS_AXQ_H */
369