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