xref: /titanic_52/usr/src/uts/sun4u/montecarlo/sys/acebus.h (revision e1c679fa4b0ab8c4bcaa6263974ca0c46e5b027f)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SYS_ACEBUS_H
28 #define	_SYS_ACEBUS_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * driver state type:
38  */
39 typedef enum { NEW = 0, ATTACHED, RESUMED, DETACHED,
40 		SUSPENDED, PM_SUSPENDED } driver_state_t;
41 
42 /*
43  * The i86pc specific code fragments are to support the debug of "honeynut"
44  * and "multigrain" prototypes on i86pc platform.  Most of the fragments
45  * deal with differences in the interrupt dispatching between the prototypes
46  * and the cheerio ebus.  On the prototype boards, all interrupt lines are
47  * tied together.  For this case, the nexus driver uses a common interrupt
48  * handler to poll all of its children.
49  */
50 #if defined(i86pc)
51 #define	MAX_EBUS_DEVS	6
52 
53 /*
54  * ebus device interrupt info;
55  */
56 typedef struct {
57 	char *name;
58 	uint_t inuse;
59 	uint_t (*handler)();
60 	caddr_t arg;
61 } ebus_intr_slot_t;
62 #endif
63 
64 struct ebus_intr_map {
65 	uint32_t ebus_phys_hi;
66 	uint32_t ebus_phys_low;
67 	uint32_t ebus_intr;
68 	uint32_t intr_ctlr_nodeid;
69 	uint32_t ino;
70 };
71 
72 struct ebus_intr_map_mask {
73 	uint32_t ebus_phys_hi;
74 	uint32_t ebus_phys_low;
75 	uint32_t ebus_intr;
76 };
77 
78 /*
79  * driver soft state structure:
80  */
81 typedef struct {
82 	dev_info_t *dip;
83 	driver_state_t state;
84 	pci_regspec_t *reg;
85 	int nreg;
86 	struct ebus_pci_rangespec *rangep;
87 	int range_cnt;
88 
89 #if defined(i86pc)
90 	ddi_iblock_cookie_t iblock;
91 	ddi_idevice_cookie_t idevice;
92 	ebus_intr_slot_t intr_slot[MAX_EBUS_DEVS];
93 #endif
94 #if defined(__sparc)
95 	/* Interrupt support */
96 	int intr_map_size;
97 	struct ebus_intr_map *intr_map;
98 	struct ebus_intr_map_mask *intr_map_mask;
99 #endif
100 } ebus_devstate_t;
101 
102 /*
103  * definition of ebus reg spec entry:
104  */
105 typedef struct {
106 	uint32_t addr_hi;
107 	uint32_t addr_low;
108 	uint32_t size;
109 } ebus_regspec_t;
110 
111 /* EBUS range entry */
112 struct ebus_pci_rangespec {
113 	uint32_t ebus_phys_hi;			/* Child hi range address */
114 	uint32_t ebus_phys_low;			/* Child low range address */
115 	uint32_t pci_phys_hi;			/* Parent hi rng addr */
116 	uint32_t pci_phys_mid;			/* Parent mid rng addr */
117 	uint32_t pci_phys_low;			/* Parent low rng addr */
118 	uint32_t rng_size;			/* Range size */
119 };
120 
121 /*
122  * use macros for soft state and driver properties:
123  */
124 #define	get_acebus_soft_state(i)	\
125 	((ebus_devstate_t *)ddi_get_soft_state(per_acebus_state, (i)))
126 
127 #define	alloc_acebus_soft_state(i)	\
128 	ddi_soft_state_zalloc(per_acebus_state, (i))
129 
130 #define	free_acebus_soft_state(i)	\
131 	ddi_soft_state_free(per_acebus_state, (i))
132 
133 
134 #define	getprop(dip, name, addr, intp)		\
135 		ddi_getlongprop(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
136 				(name), (caddr_t)(addr), (intp))
137 
138 /*
139  * register offsets and lengths:
140  */
141 #define	TCR_OFFSET	0x710000
142 #define	TCR_LENGTH	12
143 
144 #define	CSR_IO_RINDEX		2
145 #define	CSR_SIZE		0x00800000
146 #define	TCR1_OFF		0x00710000
147 #define	TCR2_OFF		0x00710004
148 #define	TCR3_OFF		0x00710008
149 #define	PMD_AUX_OFF		0x00728000
150 #define	FREQ_AUX_OFF		0x0072a000
151 #define	DCSR1_OFF		0x00700000
152 #define	DACR1_OFF		0x00700004
153 #define	DBCR1_OFF		0x00700008
154 #define	DCSR2_OFF		0x00702000
155 #define	DACR2_OFF		0x00702004
156 #define	DBCR2_OFF		0x00702008
157 #define	DCSR3_OFF		0x00704000
158 #define	DACR3_OFF		0x00704004
159 #define	DBCR3_OFF		0x00704008
160 #define	DCSR4_OFF		0x00706000
161 #define	DACR4_OFF		0x00706004
162 #define	DBCR4_OFF		0x00706008
163 
164 /*
165  * timing control register settings:
166  */
167 #define	TCR1		0x08101008
168 #define	TCR2		0x08100020
169 #define	TCR3		0x00000020
170 #define	TCR1_REGVAL	0xe3080808
171 #define	TCR2_REGVAL	0x0808ff20
172 #define	TCR3_REGVAL	0x91f3c420
173 
174 
175 
176 #if defined(DEBUG)
177 #define	D_IDENTIFY	0x00000001
178 #define	D_ATTACH	0x00000002
179 #define	D_DETACH	0x00000004
180 #define	D_MAP		0x00000008
181 #define	D_CTLOPS	0x00000010
182 #define	D_INTR		0x00000100
183 
184 #define	DBG(flag, psp, fmt)	\
185 	acebus_debug(flag, psp, fmt, 0, 0, 0, 0, 0);
186 #define	DBG1(flag, psp, fmt, a1)	\
187 	acebus_debug(flag, psp, fmt, (uintptr_t)(a1), 0, 0, 0, 0);
188 #define	DBG2(flag, psp, fmt, a1, a2)	\
189 	acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), 0, 0, 0);
190 #define	DBG3(flag, psp, fmt, a1, a2, a3)	\
191 	acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), \
192 	    (uintptr_t)(a3), 0, 0);
193 #define	DBG4(flag, psp, fmt, a1, a2, a3, a4)	\
194 	acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), \
195 	    (uintptr_t)(a3), \
196 		(uintptr_t)(a4), 0);
197 #define	DBG5(flag, psp, fmt, a1, a2, a3, a4, a5)	\
198 	acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), \
199 	    (uintptr_t)(a3), \
200 		(uintptr_t)(a4), (uintptr_t)(a5));
201 static void
202 acebus_debug(uint_t, ebus_devstate_t *, char *, uintptr_t, uintptr_t, uintptr_t,
203     uintptr_t, uintptr_t);
204 #else
205 #define	DBG(flag, psp, fmt)
206 #define	DBG1(flag, psp, fmt, a1)
207 #define	DBG2(flag, psp, fmt, a1, a2)
208 #define	DBG3(flag, psp, fmt, a1, a2, a3)
209 #define	DBG4(flag, psp, fmt, a1, a2, a3, a4)
210 #define	DBG5(flag, psp, fmt, a1, a2, a3, a4, a5)
211 #endif
212 
213 #ifdef	__cplusplus
214 }
215 #endif
216 
217 #endif	/* _SYS_ACEBUS_H */
218