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