1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Core definitions and data structures shareable across OS platforms.
5 *
6 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
7 *
8 * Copyright (c) 2010 Spectra Logic Corporation
9 * Copyright (C) 2008 Doug Rabson
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions, and the following disclaimer,
17 *    without modification.
18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 *    substantially similar to the "NO WARRANTY" disclaimer below
20 *    ("Disclaimer") and any redistribution must be conditioned upon
21 *    including a substantially similar Disclaimer requirement for further
22 *    binary redistribution.
23 *
24 * NO WARRANTY
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
34 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGES.
36 *
37 * $FreeBSD$
38 */
39#ifndef _XEN_XENBUS_XENBUSB_H
40#define _XEN_XENBUS_XENBUSB_H
41
42/**
43 * \file xenbusb.h
44 *
45 * Datastructures and function declarations for use in implementing
46 * bus attachements (e.g. frontend and backend device buses) for XenBus.
47 */
48
49/**
50 * Enumeration of state flag values for the xbs_flags field of
51 * the xenbusb_softc structure.
52 */
53typedef enum {
54	/** */
55	XBS_ATTACH_CH_ACTIVE = 0x01
56} xenbusb_softc_flag;
57
58/**
59 * \brief Container for all state needed to manage a Xenbus Bus
60 *	  attachment.
61 */
62struct xenbusb_softc {
63	/**
64	 * XenStore watch used to monitor the subtree of the
65	 * XenStore where devices for this bus attachment arrive
66	 * and depart.
67	 */
68	struct xs_watch	        xbs_device_watch;
69
70	/** Mutex used to protect fields of the xenbusb_softc. */
71	struct mtx		xbs_lock;
72
73	/** State flags. */
74	xenbusb_softc_flag	xbs_flags;
75
76	/**
77	 * A dedicated task for processing child arrival and
78	 * departure events.
79	 */
80	struct task		xbs_probe_children;
81
82	/**
83	 * Config Hook used to block boot processing until
84	 * XenBus devices complete their connection processing
85	 * with other VMs.
86	 */
87	struct intr_config_hook xbs_attach_ch;
88
89	/**
90	 * The number of children for this bus that are still
91	 * in the connecting (to other VMs) state.  This variable
92	 * is used to determine when to release xbs_attach_ch.
93	 */
94	u_int			xbs_connecting_children;
95
96	/** The NewBus device_t for this bus attachment. */
97	device_t		xbs_dev;
98
99	/**
100	 * The VM relative path to the XenStore subtree this
101	 * bus attachment manages.
102	 */
103	const char	       *xbs_node;
104
105	/**
106	 * The number of path components (strings separated by the '/'
107	 * character) that make up the device ID on this bus.
108	 */
109	u_int			xbs_id_components;
110};
111
112/**
113 * Enumeration of state flag values for the xbs_flags field of
114 * the xenbusb_softc structure.
115 */
116typedef enum {
117
118	/**
119	 * This device is contributing to the xbs_connecting_children
120	 * count of its parent bus.
121	 */
122	XDF_CONNECTING = 0x01
123} xenbus_dev_flag;
124
125/** Instance variables for devices on a XenBus bus. */
126struct xenbus_device_ivars {
127	/**
128	 * XenStore watch used to monitor the subtree of the
129	 * XenStore where information about the otherend of
130	 * the split Xen device this device instance represents.
131	 */
132	struct xs_watch		xd_otherend_watch;
133
134	/**
135	 * XenStore watch used to monitor the XenStore sub-tree
136	 * associated with this device.  This watch will fire
137	 * for modifications that we make from our domain as
138	 * well as for those made by the control domain.
139	 */
140	struct xs_watch		xd_local_watch;
141
142	/** Sleepable lock used to protect instance data. */
143	struct sx		xd_lock;
144
145	/** State flags. */
146	xenbus_dev_flag		xd_flags;
147
148	/** The NewBus device_t for this XenBus device instance. */
149	device_t		xd_dev;
150
151	/**
152	 * The VM relative path to the XenStore subtree representing
153	 * this VMs half of this device.
154	 */
155	char		       *xd_node;
156
157	/** The length of xd_node.  */
158	int			xd_node_len;
159
160	/** XenBus device type ("vbd", "vif", etc.). */
161	char		       *xd_type;
162
163	/**
164	 * Cached version of <xd_node>/state node in the XenStore.
165	 */
166	enum xenbus_state	xd_state;
167
168	/** The VM identifier of the other end of this split device. */
169	int			xd_otherend_id;
170
171	/**
172	 * The path to the subtree of the XenStore where information
173	 * about the otherend of this split device instance.
174	 */
175	char		       *xd_otherend_path;
176
177	/** The length of xd_otherend_path.  */
178	int			xd_otherend_path_len;
179};
180
181/**
182 * \brief Identify instances of this device type in the system.
183 *
184 * \param driver  The driver performing this identify action.
185 * \param parent  The NewBus parent device for any devices this method adds.
186 */
187void xenbusb_identify(driver_t *driver __unused, device_t parent);
188
189/**
190 * \brief Perform common XenBus bus attach processing.
191 *
192 * \param dev            The NewBus device representing this XenBus bus.
193 * \param bus_node       The XenStore path to the XenStore subtree for
194 *                       this XenBus bus.
195 * \param id_components  The number of '/' separated path components that
196 *                       make up a unique device ID on this XenBus bus.
197 *
198 * \return  On success, 0. Otherwise an errno value indicating the
199 *          type of failure.
200 *
201 * Intiailizes the softc for this bus, installs an interrupt driven
202 * configuration hook to block boot processing until XenBus devices fully
203 * configure, performs an initial probe/attach of the bus, and registers
204 * a XenStore watch so we are notified when the bus topology changes.
205 */
206int xenbusb_attach(device_t dev, char *bus_node, u_int id_components);
207
208/**
209 * \brief Perform common XenBus bus resume handling.
210 *
211 * \param dev  The NewBus device representing this XenBus bus.
212 *
213 * \return  On success, 0. Otherwise an errno value indicating the
214 *          type of failure.
215 */
216int xenbusb_resume(device_t dev);
217
218/**
219 * \brief Pretty-prints information about a child of a XenBus bus.
220 *
221 * \param dev    The NewBus device representing this XenBus bus.
222 * \param child	 The NewBus device representing a child of dev%'s XenBus bus.
223 *
224 * \return  On success, 0. Otherwise an errno value indicating the
225 *          type of failure.
226 */
227int xenbusb_print_child(device_t dev, device_t child);
228
229/**
230 * \brief Common XenBus child instance variable read access method.
231 *
232 * \param dev     The NewBus device representing this XenBus bus.
233 * \param child	  The NewBus device representing a child of dev%'s XenBus bus.
234 * \param index	  The index of the instance variable to access.
235 * \param result  The value of the instance variable accessed.
236 *
237 * \return  On success, 0. Otherwise an errno value indicating the
238 *          type of failure.
239 */
240int xenbusb_read_ivar(device_t dev, device_t child, int index,
241		      uintptr_t *result);
242
243/**
244 * \brief Common XenBus child instance variable write access method.
245 *
246 * \param dev    The NewBus device representing this XenBus bus.
247 * \param child	 The NewBus device representing a child of dev%'s XenBus bus.
248 * \param index	 The index of the instance variable to access.
249 * \param value  The new value to set in the instance variable accessed.
250 *
251 * \return  On success, 0. Otherwise an errno value indicating the
252 *          type of failure.
253 */
254int xenbusb_write_ivar(device_t dev, device_t child, int index,
255		       uintptr_t value);
256
257/**
258 * \brief Common XenBus method implementing responses to peer state changes.
259 *
260 * \param bus       The XenBus bus parent of child.
261 * \param child     The XenBus child whose peer stat has changed.
262 * \param state     The current state of the peer.
263 */
264void xenbusb_otherend_changed(device_t bus, device_t child,
265			      enum xenbus_state state);
266
267/**
268 * \brief Common XenBus method implementing responses to local XenStore changes.
269 *
270 * \param bus    The XenBus bus parent of child.
271 * \param child  The XenBus child whose peer stat has changed.
272 * \param path   The tree relative sub-path to the modified node.  The empty
273 *               string indicates the root of the tree was destroyed.
274 */
275void xenbusb_localend_changed(device_t bus, device_t child, const char *path);
276
277/**
278 * \brief Attempt to add a XenBus device instance to this XenBus bus.
279 *
280 * \param dev   The NewBus device representing this XenBus bus.
281 * \param type  The device type being added (e.g. "vbd", "vif").
282 * \param id	The device ID for this device.
283 *
284 * \return  On success, 0. Otherwise an errno value indicating the
285 *          type of failure.  Failure indicates that either the
286 *          path to this device no longer exists or insufficient
287 *          information exists in the XenStore to create a new
288 *          device.
289 *
290 * If successful, this routine will add a device_t with instance
291 * variable storage to the NewBus device topology.  Probe/Attach
292 * processing is not performed by this routine, but must be scheduled
293 * via the xbs_probe_children task.  This separation of responsibilities
294 * is required to avoid hanging up the XenStore event delivery thread
295 * with our probe/attach work in the event a device is added via
296 * a callback from the XenStore.
297 */
298int xenbusb_add_device(device_t dev, const char *type, const char *id);
299
300#include "xenbusb_if.h"
301
302#endif /* _XEN_XENBUS_XENBUSB_H */
303