xref: /titanic_41/usr/src/uts/sun4u/sys/zulumod.h (revision 37714ae43602c675f9dc59b070bfdf9fa702872c)
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  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_ZULUMOD_H
27 #define	_ZULUMOD_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/int_const.h>
36 #include <sys/zuluvm.h>
37 
38 #ifndef _ASM
39 
40 #include <sys/zulu_hat.h>
41 #include <sys/sysmacros.h>
42 
43 #define	ZULUVM_VERSION_STR(a)	#a
44 #define	ZULUVM_VERSION(a)	ZULUVM_VERSION_STR(a)
45 #define	ZULUVM_MOD_VERSION \
46 	ZULUVM_VERSION(XHAT_PROVIDER_VERSION) "." \
47 	ZULUVM_VERSION(ZULUVM_INTERFACE_VERSION)
48 
49 #define	ZULUDCHKFUNC(_p1, _p2, _p3) \
50 	((_p1) != NULL && (_p1)->_p2 != NULL) ? \
51 	(_p1)->_p2 _p3 : ZULUVM_NO_SUPPORT
52 #define	ZULUDCHKPROC(_p1, _p2, _p3) \
53 	if ((_p1) != NULL && (_p1)->_p2 != NULL) (_p1)->_p2 _p3
54 
55 #define	zulud_set_itlb_pc(_devp, _a, _b) \
56 	ZULUDCHKPROC((_devp)->dops, set_itlb_pc, (_a, _b))
57 #define	zulud_set_dtlb_pc(_devp, _a, _b) \
58 	ZULUDCHKPROC((_devp)->dops, set_dtlb_pc, (_a, _b))
59 #define	zulud_write_tte(_devp, _a, _b, _c, _d, _e, _f) \
60 	ZULUDCHKFUNC((_devp)->dops, write_tte, (_a, _b, _c, _d, _e, _f))
61 #define	zulud_tlb_done(_devp, _a, _b, _c) \
62 	ZULUDCHKPROC((_devp)->dops, tlb_done, (_a, _b, _c))
63 #define	zulud_demap_page(_devp, _a, _b, _c) \
64 	ZULUDCHKPROC((_devp)->dops, demap_page, (_a, _b, _c))
65 #define	zulud_demap_ctx(_devp, _a, _b) \
66 	ZULUDCHKPROC((_devp)->dops, demap_ctx, (_a, _b))
67 
68 #endif
69 
70 #define	ZULUVM_DATA0_IDX	0
71 #define	ZULUVM_DATA1_IDX	1
72 #define	ZULUVM_DATA2_IDX	2
73 #define	ZULUVM_DATA3_IDX	3
74 #define	ZULUVM_DATA4_IDX	4
75 #define	ZULUVM_DATA5_IDX	5
76 #define	ZULUVM_DATA6_IDX	6
77 #define	ZULUVM_DATA7_IDX	7
78 
79 #define	ZULUVM_IDX2FLAG(i)	(1 << (7 - i))
80 #define	ZULUVM_DATA0_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA0_IDX)
81 #define	ZULUVM_DATA1_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA1_IDX)
82 #define	ZULUVM_DATA2_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA2_IDX)
83 #define	ZULUVM_DATA3_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA3_IDX)
84 #define	ZULUVM_DATA4_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA4_IDX)
85 #define	ZULUVM_DATA5_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA5_IDX)
86 #define	ZULUVM_DATA6_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA6_IDX)
87 #define	ZULUVM_DATA7_FLAG	ZULUVM_IDX2FLAG(ZULUVM_DATA7_IDX)
88 
89 #define	ZULUVM_TLB_ADDR_IDX	ZULUVM_DATA0_IDX
90 #define	ZULUVM_TLB_TYPE_IDX	ZULUVM_DATA1_IDX
91 #define	ZULUVM_TLB_TTE_IDX	ZULUVM_DATA2_IDX
92 #define	ZULUVM_TLB_ERRCODE_IDX	ZULUVM_DATA3_IDX
93 
94 #define	ZULUVM_DATA_FLAGS	(ZULUVM_DATA1_FLAG | \
95 				ZULUVM_DATA6_FLAG)
96 
97 #define	ZULUVM_GET_TLB_TTE(devp) \
98 		(devp)->zvm.idata[ZULUVM_TLB_TTE_IDX]
99 #define	ZULUVM_GET_TLB_ADDR(devp) \
100 		(devp)->zvm.idata[ZULUVM_TLB_ADDR_IDX]
101 #define	ZULUVM_GET_TLB_TYPE(devp) (ZULUVM_DMA_MASK & \
102 		(devp)->zvm.idata[ZULUVM_TLB_TYPE_IDX])
103 #define	ZULUVM_GET_TLB_ERRCODE(devp) (int)(0xffffffff & \
104 		(devp)->zvm.idata[ZULUVM_TLB_ERRCODE_IDX])
105 
106 #define	ZULUVM_MAX_DEV		2
107 #define	ZULUVM_PIL		PIL_2
108 #define	ZULUVM_NUM_PGSZS	4
109 
110 #define	ZULUVM_STATE_IDLE		0
111 #define	ZULUVM_STATE_STOPPED		1
112 #define	ZULUVM_STATE_CANCELED		2
113 #define	ZULUVM_STATE_TLB_PENDING	3
114 #define	ZULUVM_STATE_INTR_QUEUED	4
115 #define	ZULUVM_STATE_INTR_PENDING	5
116 #define	ZULUVM_STATE_WRITE_TTE		6
117 
118 #ifndef _ASM
119 
120 typedef struct {
121 	uint64_t	idata[4];	/* mondo pkt copy area */
122 	void		*arg;		/* arg for device calls */
123 	uint64_t	mmu_pa;		/* phy. addr of MMU regs */
124 	struct zuluvm_proc *proc1;
125 	struct zuluvm_proc *proc2;
126 	volatile uint32_t state;	/* state of tlb miss handling */
127 	uint64_t	intr_num;	/* our soft intr number */
128 	short		dmv_intr;	/* dmv interrupt handle */
129 #ifdef ZULUVM_STATS
130 	int 		cancel;
131 	int		tlb_miss[ZULUVM_NUM_PGSZS];
132 	int		pagefault;
133 	int		no_mapping;
134 	int		preload;
135 	int		migrate;
136 	int		pagesize;
137 	int		itlb1miss;
138 	int		dtlb1miss;
139 	int		itlb2miss;
140 	int		dtlb2miss;
141 	int		demap_page;
142 	int		demap_ctx;
143 #endif
144 	uint64_t	pfnbuf[50];
145 	int		pfncnt;
146 } zuluvm_miss_t;
147 
148 #ifdef ZULUVM_STATS
149 #define	ZULUVM_STATS_MISS(devp, sz)	(devp)->zvm.tlb_miss[sz]++
150 #define	ZULUVM_STATS_PAGEFAULT(devp)	(devp)->zvm.pagefault++
151 #define	ZULUVM_STATS_NOMAP(devp)	(devp)->zvm.no_mapping++
152 #define	ZULUVM_STATS_PRELOAD(devp)	(devp)->zvm.preload++
153 #define	ZULUVM_STATS_MIGRATE(devp)	(devp)->zvm.migrate++
154 #define	ZULUVM_STATS_PAGEZISE(devp)	(devp)->zvm.pagesize++
155 #define	ZULUVM_STATS_CANCEL(devp)	(devp)->zvm.cancel++
156 #define	ZULUVM_STATS_DEMAP_PAGE(devp)	(devp)->zvm.demap_page++
157 #define	ZULUVM_STATS_DEMAP_CTX(devp)	(devp)->zvm.demap_ctx++
158 #else
159 #define	ZULUVM_STATS_MISS(devp, sz)
160 #define	ZULUVM_STATS_PAGEFAULT(devp)
161 #define	ZULUVM_STATS_NOMAP(devp)
162 #define	ZULUVM_STATS_PRELOAD(devp)
163 #define	ZULUVM_STATS_MIGRATE(devp)
164 #define	ZULUVM_STATS_PAGEZISE(devp)
165 #define	ZULUVM_STATS_CANCEL(devp)
166 #define	ZULUVM_STATS_DEMAP_PAGE(devp)
167 #define	ZULUVM_STATS_DEMAP_CTX(devp)
168 #endif
169 
170 #define	ZULUVM_MAX_INTR 32
171 
172 typedef struct {
173 	short offset;
174 	short ino;
175 } zuluvm_intr_t;
176 
177 /*
178  * This structure contains per device data.
179  * It is protected by dev_lck.
180  */
181 typedef struct {
182 	zuluvm_miss_t		zvm;		/* tlb miss state */
183 	volatile uint64_t	*imr;		/* intr mapping regs */
184 	struct zuluvm_proc 	*procs; 	/* protected by proc_lck */
185 	dev_info_t		*dip;		/* device driver instance */
186 	zulud_ops_t		*dops;		/* device drv operations */
187 	kmutex_t		load_lck;	/* protects in_intr */
188 	kmutex_t		dev_lck;	/* protects this struct */
189 	kmutex_t 		proc_lck;	/* protects active procs */
190 	kcondvar_t 		intr_wait;	/* sync for as_free */
191 	int			intr_flags;
192 	int			in_intr;
193 	kmutex_t		park_lck;	/* page fault thread */
194 	kcondvar_t		park_cv;
195 	int			parking;
196 	int			agentid;	/* zulu's agent id */
197 	zuluvm_intr_t		interrupts[ZULUVM_MAX_INTR];
198 } zuluvm_state_t;
199 
200 #define	ZULUVM_INTR_OFFSET	offsetof(zuluvm_state_t, interrupts)
201 #define	ZULUVM_INTR2INO(addr)	(((zuluvm_intr_t *)(addr))->ino)
202 #define	ZULUVM_INTR2ZDEV(addr) \
203 	(zuluvm_state_t *)((caddr_t)addr - (ZULUVM_INTR2INO(addr) * \
204 	sizeof (zuluvm_intr_t)) - ZULUVM_INTR_OFFSET)
205 
206 typedef struct zuluvm_proc {
207 	struct zulu_hat	*zhat;
208 	zuluvm_state_t  *zdev;  /* back ptr to dev instance */
209 	unsigned short	refcnt;	/* keep this until ref == 0 */
210 	short		valid;	/* if valid is 0 then don't use */
211 	struct zuluvm_proc *next;
212 	struct zuluvm_proc *prev;
213 } zuluvm_proc_t;
214 
215 #define	ZULUVM_DO_INTR1		INT32_C(1)
216 #define	ZULUVM_WAIT_INTR1	INT32_C(2)
217 #define	ZULUVM_DO_INTR2		INT32_C(4)
218 #define	ZULUVM_WAIT_INTR2	INT32_C(8)
219 
220 int zuluvm_change_state(uint32_t *state_pa, int new, int assume);
221 void zuluvm_demap_page(void *, struct hat *, short, caddr_t, uint_t);
222 void zuluvm_demap_ctx(void *, short);
223 void zuluvm_dmv_tlbmiss_tl1(void);
224 void zuluvm_load_tte(struct zulu_hat *zhat, caddr_t addr, uint64_t pfn,
225 		int perm, int size);
226 
227 
228 #endif
229 
230 /*
231  * The following defines are copied from the ZFB and ZULU
232  * workspaces. We re-define them here since we can't have
233  * a dependency onto files outside our consolidation
234  */
235 #define	ZULUVM_IMR_V_MASK	UINT64_C(0x0000000080000000)
236 #define	ZULUVM_IMR_TARGET_SHIFT INT32_C(26)
237 #define	ZULUVM_IMR_MAX		INT32_C(0x3f)
238 
239 #define	ZULUVM_ZFB_MMU_TLB_D_V_MASK	  0x8000000000000000
240 #define	ZULUVM_ZFB_MMU_TLB_D_PA_SHIFT	  0xD	/* 13 bits */
241 #define	ZULUVM_ZFB_MMU_TLB_D_C_MASK	  0x20
242 #define	ZULUVM_ZFB_MMU_TLB_D_SZ_SHIFT	  0x3D	/* 61 */
243 #define	ZULUVM_ZFB_MMU_TLB_D_SZ_MASK	  0x6000000000000000
244 #define	ZULUVM_ZFB_MMU_TLB_D_W_MASK	  0x2
245 #define	ZULUVM_ZFB_MMU_TLB_CR_IMISS_MASK  0x2
246 #define	ZULUVM_ZFB_MMU_TLB_CR_DMISS_MASK  0x1
247 #define	ZULUVM_ZFB_MMU_DTLB_PAGE_SZ_2_MASK  0xc /* DTLB2 Page size */
248 #define	ZULUVM_ZFB_MMU_DTLB_PAGE_SZ_2_SHIFT 2
249 #define	ZULUVM_DTLB_PAGE_SZ	0x8
250 #define	ZULUVM_ITLB_DATA_IN	0x18
251 #define	ZULUVM_DTLB_DATA_IN	0x28
252 #define	ZULUVM_TLB_CONTROL	0
253 #define	ZULUVM_ITLB_MISS_ICR	0x0
254 #define	ZULUVM_DTLB_MISS_ICR	0x8
255 #define	ZULUVM_DMA1_TSB_BASE	0x50
256 #define	ZULUVM_DMA2_TSB_BASE	0x68
257 
258 #ifdef	__cplusplus
259 }
260 #endif
261 
262 #endif	/* _ZULUMOD_H */
263