xref: /illumos-gate/usr/src/uts/common/xen/io/xdb.h (revision 843e19887f64dde75055cf8842fc4db2171eff45)
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 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 
28 #ifndef _SYS_XDB_H
29 #define	_SYS_XDB_H
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 #include <sys/types.h>
38 #include <sys/conf.h>
39 #include <sys/ddi.h>
40 #include <sys/dditypes.h>
41 #include <sys/sunddi.h>
42 #include <sys/sunldi.h>
43 #include <sys/modctl.h>
44 #include <vm/seg_kmem.h>
45 #include <sys/gnttab.h>
46 #include <xen/sys/xenbus_impl.h>
47 #include <xen/sys/xendev.h>
48 #include "xdf.h"
49 
50 #define	XDB_DBG_ALL	0xf
51 #define	XDB_DBG_IO	0x1
52 #define	XDB_DBG_INFO	0x2
53 #define	XDB_DBPRINT(lvl, fmt) { if (xdb_debug & lvl) cmn_err fmt; }
54 
55 /*
56  * Info of the exported blk device
57  */
58 #define	XDB_DEV_RO	(1)	/* read-only or writable */
59 #define	XDB_IS_RO(vdp)	((vdp)->xs_type & XDB_DEV_RO)
60 #define	XDB_DEV_LOFI	(1 << 1) /* lofi device or physical device */
61 #define	XDB_IS_LOFI(vdp)	((vdp)->xs_type & XDB_DEV_LOFI)
62 #define	XDB_DEV_CD	(1 << 2) /* cdrom disc */
63 #define	XDB_IS_CD(vdp)	((vdp)->xs_type & XDB_DEV_CD)
64 #define	XDB_DEV_RMB	(1 << 3) /* removable device */
65 #define	XDB_IS_RMB(vdp)	((vdp)->xs_type & XDB_DEV_RMB)
66 
67 /*
68  * Xdb interface status
69  */
70 enum xdb_state {
71 	/*
72 	 * initial state
73 	 */
74 	XDB_UNKNOWN,
75 	/*
76 	 * frontend xenbus state changed to XenbusStateConnected,
77 	 * we finally connect
78 	 */
79 	XDB_CONNECTED,
80 	/*
81 	 * frontend xenbus state changed to XenbusStateClosed,
82 	 * interface disconnected
83 	 */
84 	XDB_DISCONNECTED
85 };
86 
87 /*
88  * backend device status
89  */
90 enum xdb_dev_state {
91 	/* initial state */
92 	XDB_DEV_UNKNOWN,
93 	/* backend device is ready (hotplug script finishes successfully) */
94 	XDB_DEV_READY
95 };
96 
97 /*
98  * frontend status
99  */
100 enum xdb_fe_state {
101 	/* initial state */
102 	XDB_FE_UNKNOWN,
103 	/*
104 	 * frontend's xenbus state has changed to
105 	 * XenbusStateInitialised, is ready for connecting
106 	 */
107 	XDB_FE_READY
108 };
109 
110 /*
111  * Other handy macrosx
112  */
113 #define	XDB_MINOR2INST(m)	(int)(m)
114 #define	XDB_INST2MINOR(i)	(minor_t)(i)
115 #define	XDB_INST2SOFTS(instance)			\
116 	((xdb_t *)ddi_get_soft_state(xdb_statep, (instance)))
117 #define	XDB_MAX_IO_PAGES BLKIF_RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST
118 /* get kva of a mapped-in page coresponding to (xreq-index, seg) pair */
119 #define	XDB_IOPAGE_VA(_pagebase, _xreqidx, _seg)	\
120 	((_pagebase) + ((_xreqidx)			\
121 	* BLKIF_MAX_SEGMENTS_PER_REQUEST		\
122 	+ (_seg)) * PAGESIZE)
123 #define	XDB_XREQ2BP(xreq) (&(xreq)->xr_buf)
124 #define	XDB_BP2XREQ(bp) \
125 	((xdb_request_t *)((char *)(bp) - offsetof(xdb_request_t, xr_buf)))
126 
127 /* describe one blkif segment */
128 typedef struct xdb_seg {
129 	uint8_t fs; /* start sector # within this page (segment) */
130 	uint8_t ls; /* end sector # within this page (segment) */
131 } xdb_seg_t;
132 
133 typedef struct xdb xdb_t;
134 
135 /* one blkif_request_t matches one xdb_request_t */
136 typedef struct xdb_request {
137 	/* buf associated with this I/O request */
138 	buf_t		xr_buf;
139 	/* softstate instance associated with this I/O request */
140 	xdb_t		*xr_vdp;
141 	/* the next segment we're going to process */
142 	int		xr_curseg;
143 	/* index of this xdb_request_t in vdp->xs_req */
144 	int		xr_idx;
145 	/* next index for a statical linked list */
146 	int		xr_next;
147 	/* 'id' copied from blkif_request_t */
148 	uint64_t	xr_id;
149 	/* 'operation' copied from blkif_request_t */
150 	uint8_t		xr_op;
151 	/* how many pages(segments) in this I/O request */
152 	uint8_t		xr_buf_pages;
153 	/* all segments of this I/O request */
154 	xdb_seg_t	xr_segs[BLKIF_MAX_SEGMENTS_PER_REQUEST];
155 	/* all grant table handles used in this I/O request */
156 	grant_handle_t	xr_page_hdls[BLKIF_MAX_SEGMENTS_PER_REQUEST];
157 	struct page	xr_plist[BLKIF_MAX_SEGMENTS_PER_REQUEST];
158 	struct page	*xr_pplist[BLKIF_MAX_SEGMENTS_PER_REQUEST];
159 } xdb_request_t;
160 
161 /* Soft state data structure for each backend vbd */
162 struct xdb {
163 	/* devinfo node pointer of this xdb */
164 	dev_info_t	*xs_dip;
165 	/* coresponding frontend domain id */
166 	domid_t		xs_peer;
167 	/* read-only, removable, cdrom? */
168 	uint32_t	xs_type;
169 	/* # of total sectors */
170 	uint64_t	xs_sectors;
171 	/* blkif I/O request ring buffer */
172 	xendev_ring_t	*xs_ring;
173 	/* handle to access the ring buffer */
174 	ddi_acc_handle_t xs_ring_hdl;
175 	ldi_ident_t	xs_ldi_li;
176 	ldi_handle_t	xs_ldi_hdl;
177 	/* base kva for mapped-in I/O page from frontend domain */
178 	caddr_t		xs_iopage_va;
179 	/* mutex lock for I/O related code path */
180 	kmutex_t	xs_iomutex;
181 	/*
182 	 * mutex lock for event handling related code path
183 	 * need to be grabbed before xs_iomutex
184 	 */
185 	kmutex_t	xs_cbmutex;
186 	/* # of on-going I/O buf in backend domain */
187 	uint_t		xs_ionum;
188 	/* task thread for pushing buf to underlying target driver */
189 	ddi_taskq_t	*xs_iotaskq;
190 	/* cv used in I/O code path, protected by xs_iomutex */
191 	kcondvar_t	xs_iocv;
192 	kcondvar_t	xs_ionumcv;
193 	/*
194 	 * head and tail of linked list for I/O bufs need to be pushed to
195 	 * underlying target driver
196 	 */
197 	buf_t		*xs_f_iobuf;
198 	buf_t		*xs_l_iobuf;
199 	/* xdb interface status */
200 	enum xdb_state	xs_if_status;
201 	/* backend device status */
202 	enum xdb_dev_state xs_dev_status;
203 	/* frontend status */
204 	enum xdb_fe_state xs_fe_status;
205 	/* head of free list of xdb_request_t */
206 	int		xs_free_req;
207 	/* pre-allocated xdb_request_t pool */
208 	xdb_request_t	xs_req[BLKIF_RING_SIZE];
209 	kstat_t		*xs_kstats;
210 	uint64_t	xs_stat_req_reads;
211 	uint64_t	xs_stat_req_writes;
212 	uint64_t	xs_stat_req_barriers;
213 	uint64_t	xs_stat_req_flushes;
214 #ifdef DEBUG
215 	uint64_t page_addrs[XDB_MAX_IO_PAGES]; /* for debug aid */
216 #endif /* DEBUG */
217 };
218 
219 #ifdef __cplusplus
220 }
221 #endif
222 
223 #endif	/* _SYS_XDB_H */
224