summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u/sys/starfire.h
blob: 038f0b3c0e451b04a1d47757944bc2bd922aa03d (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
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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 (c) 1996-2000 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_STARFIRE_H
#define	_STARFIRE_H

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

#ifdef	__cplusplus
extern "C" {
#endif

/* I/O space definitions */
#define	STARFIRE_IO_BASE 0x10000000000ULL

/* UPA Port Space (UPS) definitions */
#define	STARFIRE_UPS_MID_SHIFT 33	/* MID is 7 bits */
#define	STARFIRE_UPS_BRD_SHIFT 36
#define	STARFIRE_UPS_BUS_SHIFT 6

/* Starfire Interconnect Space (IS) definitions */
#define	STARFIRE_IS_MC_BASE	0x10e80000000ULL /* MC Register Space */


/* Port Specific Interconnect Space (PSI) */
#define	STARFIRE_PSI_BASE \
		0x100f8000000ULL	/* put mid in [39:33] */
#define	STARFIRE_PSI_PCREG_OFF \
		0x4000000ULL		/* PSI offset for PC regs */
#define	STARFIRE_BRD_TO_PSI(board) \
		(STARFIRE_PSI_BASE | \
			(((uint64_t)board) << STARFIRE_UPS_BRD_SHIFT))


/* Starfire BootBus Space (BS) definitions */
#define	STARFIRE_PSI_BS_BASE \
		STARFIRE_PSI_BASE	/* BS at start of PSI Space */

#define	STARFIRE_UPAID2PSI_BS(upaid) \
		(STARFIRE_PSI_BS_BASE | \
		((u_longlong_t)STARFIRE_UPAID2HWMID(upaid) << \
			STARFIRE_UPS_MID_SHIFT))

#define	STARFIRE_DEV2UPAID(b, p, i) \
		((((i) & 0x1) << 6) | \
		(((b) & 0xf) << 2) | \
		((p) & 0x3))

/* Starfire Port Controller Register offsets */
#define	STARFIRE_PC_CONF		0x000000UL /* Configuration Reg */
#define	STARFIRE_PC_COMP_ID		0x000010UL /* Component ID Reg */
#define	STARFIRE_PC_BUS_CONF		0x000020UL /* Bus Configuration Reg */
#define	STARFIRE_PC_TO_HOLD_CONF	0x000030UL /* Timeout/Hold Config Reg */
#define	STARFIRE_PC_CIC_WRITE_DATA	0x000040UL /* CIC Write Data Reg */
#define	STARFIRE_PC_FORCE_PARITY_ERR	0x000050UL /* Force Parity Err Reg */
#define	STARFIRE_PC_ERR_0_MASK		0x000060UL /* Err 0 Mask Reg */
#define	STARFIRE_PC_ERR_1_MASK		0x000070UL /* Err 1 Mask Reg */
#define	STARFIRE_PC_ERR_0		0x000080UL /* Err 0 Reg */
#define	STARFIRE_PC_ERR_1		0x000090UL /* Err 1 Reg */
#define	STARFIRE_PC_ERR_DATA_SRC	0x0000a0UL /* Err Data Src Reg */
#define	STARFIRE_PC_ERR_DATA_LOW	0x0000b0UL /* Err Data Lower Reg */
#define	STARFIRE_PC_ERR_DATA_HI		0x0000c0UL /* Err Data Upper Reg */
#define	STARFIRE_PC_PORT_ID		0x0000d0UL
#define	STARFIRE_PC_PERF_COUNT_0	0x0000e0UL
#define	STARFIRE_PC_PERF_COUNT_1	0x0000f0UL
#define	STARFIRE_PC_PERF_COUNT_CNTRL	0x000100UL
#define	STARFIRE_PC_BLOCK		0x0001c0UL /* 512 Byte scr area */
#define	STARFIRE_PC_INT_MAP		0x000200UL /* 32 regs 00.0200-00.03f0 */
#define	STARFIRE_PC_MADR		0x000400UL /* 16 regs 00.0400-00.04f0 */

/* Starfire PC definitions/macros */
#define	STARFIRE_PC_MADR_BOARD_SHIFT	4
#define	STARFIRE_PC_MADR_ADDR(bb, rb, p) \
		(STARFIRE_BRD_TO_PSI(bb) | \
		((uint64_t)(p) << STARFIRE_UPS_MID_SHIFT) | \
		((uint64_t)(rb) << STARFIRE_PC_MADR_BOARD_SHIFT) | \
		STARFIRE_PSI_PCREG_OFF | \
		STARFIRE_PC_MADR)

/* Starfire BB (BootBus) definitions/macros */
#define	STARFIRE_BB_SYSRESET_CNTRL	0x800000ULL
#define	STARFIRE_BB_PAUSE_FLUSH		0x800016ULL

#define	STARFIRE_BB_PC_PAUSE(i)		((uchar_t)(1 << (i)))
#define	STARFIRE_BB_PC_FLUSH(i)		((uchar_t)(1 << ((i)+2)))
#define	STARFIRE_BB_PC_IDLE(i)		((uchar_t)(1 << ((i)+4)))

#define	STARFIRE_BB_SYSRESET(i)		((uchar_t)(1 << (i)))

#define	STARFIRE_BB_PC_ADDR(bb, p, io) \
		(STARFIRE_UPAID2PSI_BS(STARFIRE_DEV2UPAID((bb), (p), (io))) | \
		STARFIRE_BB_PAUSE_FLUSH)
#define	STARFIRE_BB_RESET_ADDR(bb, p) \
		(STARFIRE_UPAID2PSI_BS(STARFIRE_DEV2UPAID((bb), (p), 0)) | \
		STARFIRE_BB_SYSRESET_CNTRL)

/* Starfire Memory Controller Register offsets */
#define	STARFIRE_MC_ASR			0x000400U	/* Addr Select Reg */
#define	STARFIRE_MC_DIMMTYPE		0x00c800U	/* DIMM Type Code Reg */
#define	STARFIRE_MC_IDLE		0x00cc00U	/* Idle MC Reg */

/* Starfire MC definitions/macros */
#define	STARFIRE_MC_MEM_PRESENT_MASK	0x80000000U
#define	STARFIRE_MC_MEM_BASEADDR_MASK	0x7fff0000U
#define	STARFIRE_MC_IDLE_MASK		0x00008000U
#define	STARFIRE_MC_MASK_MASK		0x00007f00U
#define	STARFIRE_MC_DIMMSIZE_MASK	0x0000001fU
#define	STARFIRE_MC_INTERLEAVE_MASK	0x00000001U
#define	STARFIRE_MC_MASK_SHIFT		18
#define	STARFIRE_MC_BASE_SHIFT		10
#define	STARFIRE_MC_ADDR_HIBITS		0x1fe00000000ULL
#define	STARFIRE_MC_ASR_ADDR(reg)	((reg) | (uint64_t)STARFIRE_MC_ASR)
#define	STARFIRE_MC_IDLE_ADDR(reg)	((reg) | (uint64_t)STARFIRE_MC_IDLE)
#define	STARFIRE_MC_DIMMTYPE_ADDR(reg)	((reg) | (uint64_t)STARFIRE_MC_DIMMTYPE)
#define	STARFIRE_MC_ASR_ADDR_BOARD(b) \
		(((uint64_t)(b) << STARFIRE_UPS_BRD_SHIFT) | \
		STARFIRE_IS_MC_BASE | \
		(uint64_t)STARFIRE_MC_ASR)

/*
 * Memory boards on Starfire are aligned on 8GB
 * boundaries, i.e. the physical address space
 * is not physically contiguous.
 */
#define	STARFIRE_MC_MEMBOARD_SHIFT	33
#define	STARFIRE_MC_MEMBOARD_ALIGNMENT	\
		(UINT64_C(1) << STARFIRE_MC_MEMBOARD_SHIFT)

/*
 * Starfire has a special regspec for the "reg" property of the
 * mem-unit node since this node is homegrown.
 */
struct sf_memunit_regspec {
	uint_t	regspec_addr_hi;
	uint_t	regspec_addr_lo;
	uint_t	regspec_size_hi;
	uint_t	regspec_size_lo;
};

/*
 * Conversion macros
 */

/*
 * Starfire hardware version of the upaid (commonly known as
 * HWMID) is different from the software version (also known as upaid).
 *  HW version BBBBIPp   == SW version IBBBBPp
 */
#define	STARFIRE_UPAID2HWMID(upaid) (((upaid & 0x3C) << 1) | \
				((upaid & 0x40) >> 4) | (upaid & 0x3))


/* Xfire UPA ID to UPA Port Specific Space */
#define	STARFIRE_UPAID2UPS(upaid) \
		(((u_longlong_t)STARFIRE_UPAID2HWMID(upaid) << \
				STARFIRE_UPS_MID_SHIFT) | STARFIRE_IO_BASE)

/*
 * Macro to convert our 7 bits HW MID to 7 bits SW MID
 * That is "BBBBIPp" to "IBBBBPp".
 */
#define	STARFIRE_HWMID2SWMID(mid) ((mid & 0x3) | ((mid & 0x78) >> 1) | \
					((mid & 0x4) << 4))

/*
 * Macro to convert our 7 bits UPAid to Sun's 5 bit HW Interrupt
 * group number required in some hardware registers (sysios).
 * That is "IBBBBPp" to "BBBBp", where "BBBB" is the board number,
 * "IP" is the PC id and "p" is the port number.
 */
#define	STARFIRE_UPAID2HWIGN(upaid) \
		(((upaid & 0x3C) >> 1) | (upaid & 0x1))

/*
 * Macro to convert our UPAid to a 7 bit Starfire version of the
 * interrupt group number. This so-called IGN is part of
 * the interrupt vector number read by the CPU serving this interrupt.
 * Thanks to the warp minds of our hardware guys, it is in this
 * convoluted weird format. Note that the interrupt vector number is
 * then used to index into the interrupt dispatch table to get its
 * interrupt handler.
 * Convert "IBBBBPp" to "XPBBBBp" where "BBBB" is the 4bit board #,
 * "IP" is the 2 bit PC id, "p" is the port # and "X" is ~I.
 */
#define	STARFIRE_UPAID2IGN(upaid)  (STARFIRE_UPAID2HWIGN(upaid) | \
			((upaid & 0x2) << 4) |  \
			((upaid & 0x40) ^ 0x40))

/*
 * Starfire platform specific routines currently only defined
 * in starfire.c and referenced by DR.
 */
extern int	plat_max_boards();
extern int	plat_max_cpu_units_per_board();
extern int	plat_max_mem_units_per_board();
extern int	plat_max_io_units_per_board();

/*
 * Starfire platform specific interrupt translation routines
 */
extern void pc_ittrans_init(int, caddr_t *);
extern void pc_ittrans_uninit(caddr_t);
extern int pc_translate_tgtid(caddr_t, int, volatile uint64_t *);
extern void pc_ittrans_cleanup(caddr_t, volatile uint64_t *);

/*
 * Maximum number of system boards supported in a Starfire.
 */
#define	STARFIRE_MAX_BOARDS	16

/*
 * We reserve some "fake" DMV values for Starfire IDN.  These are treated
 * as hardware interrupt numbers, but they don't correspond to an actual UPA
 * port; they can thus be allocated as "well-known" numbers for IDN purposes.
 */
#define	STARFIRE_DMV_EXTRA	4
#define	STARFIRE_DMV_HWINT	(MAX_UPA+STARFIRE_DMV_EXTRA)
#define	STARFIRE_DMV_IDN_BASE	(MAX_UPA)


#ifdef	__cplusplus
}
#endif

#endif	/* _STARFIRE_H */