xref: /freebsd/sys/xen/xenbus/xenbusb.h (revision 076b94438c7d42c1b4661ed1e12e3b12ca69361a)
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  */
53 typedef 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  */
62 struct 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  */
116 typedef 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. */
126 struct 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  */
187 void 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  */
206 int 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  */
216 int 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  */
227 int 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  */
240 int 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  */
254 int 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  */
264 void 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  */
275 void 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  */
298 int 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