1332f791dSJuergen Gross /* 2332f791dSJuergen Gross * Private include for xenbus communications. 3332f791dSJuergen Gross * 4332f791dSJuergen Gross * Copyright (C) 2005 Rusty Russell, IBM Corporation 5332f791dSJuergen Gross * Copyright (C) 2005 XenSource Ltd. 6332f791dSJuergen Gross * 7332f791dSJuergen Gross * This program is free software; you can redistribute it and/or 8332f791dSJuergen Gross * modify it under the terms of the GNU General Public License version 2 9332f791dSJuergen Gross * as published by the Free Software Foundation; or, when distributed 10332f791dSJuergen Gross * separately from the Linux kernel or incorporated into other 11332f791dSJuergen Gross * software packages, subject to the following license: 12332f791dSJuergen Gross * 13332f791dSJuergen Gross * Permission is hereby granted, free of charge, to any person obtaining a copy 14332f791dSJuergen Gross * of this source file (the "Software"), to deal in the Software without 15332f791dSJuergen Gross * restriction, including without limitation the rights to use, copy, modify, 16332f791dSJuergen Gross * merge, publish, distribute, sublicense, and/or sell copies of the Software, 17332f791dSJuergen Gross * and to permit persons to whom the Software is furnished to do so, subject to 18332f791dSJuergen Gross * the following conditions: 19332f791dSJuergen Gross * 20332f791dSJuergen Gross * The above copyright notice and this permission notice shall be included in 21332f791dSJuergen Gross * all copies or substantial portions of the Software. 22332f791dSJuergen Gross * 23332f791dSJuergen Gross * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24332f791dSJuergen Gross * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25332f791dSJuergen Gross * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26332f791dSJuergen Gross * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27332f791dSJuergen Gross * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28332f791dSJuergen Gross * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 29332f791dSJuergen Gross * IN THE SOFTWARE. 30332f791dSJuergen Gross */ 31332f791dSJuergen Gross 32332f791dSJuergen Gross #ifndef _XENBUS_XENBUS_H 33332f791dSJuergen Gross #define _XENBUS_XENBUS_H 34332f791dSJuergen Gross 35fd8aa909SJuergen Gross #include <linux/mutex.h> 36fd8aa909SJuergen Gross #include <linux/uio.h> 37fd8aa909SJuergen Gross #include <xen/xenbus.h> 38fd8aa909SJuergen Gross 39332f791dSJuergen Gross #define XEN_BUS_ID_SIZE 20 40332f791dSJuergen Gross 41332f791dSJuergen Gross struct xen_bus_type { 42332f791dSJuergen Gross char *root; 43332f791dSJuergen Gross unsigned int levels; 44332f791dSJuergen Gross int (*get_bus_id)(char bus_id[XEN_BUS_ID_SIZE], const char *nodename); 45332f791dSJuergen Gross int (*probe)(struct xen_bus_type *bus, const char *type, 46332f791dSJuergen Gross const char *dir); 47be987200SSeongJae Park bool (*otherend_will_handle)(struct xenbus_watch *watch, 48be987200SSeongJae Park const char *path, const char *token); 495584ea25SJuergen Gross void (*otherend_changed)(struct xenbus_watch *watch, const char *path, 505584ea25SJuergen Gross const char *token); 51332f791dSJuergen Gross struct bus_type bus; 52332f791dSJuergen Gross }; 53332f791dSJuergen Gross 54332f791dSJuergen Gross enum xenstore_init { 55332f791dSJuergen Gross XS_UNKNOWN, 56332f791dSJuergen Gross XS_PV, 57332f791dSJuergen Gross XS_HVM, 58332f791dSJuergen Gross XS_LOCAL, 59332f791dSJuergen Gross }; 60332f791dSJuergen Gross 61fd8aa909SJuergen Gross struct xs_watch_event { 62fd8aa909SJuergen Gross struct list_head list; 63fd8aa909SJuergen Gross unsigned int len; 64fd8aa909SJuergen Gross struct xenbus_watch *handle; 65fd8aa909SJuergen Gross const char *path; 66fd8aa909SJuergen Gross const char *token; 67fd8aa909SJuergen Gross char body[]; 68fd8aa909SJuergen Gross }; 69fd8aa909SJuergen Gross 70fd8aa909SJuergen Gross enum xb_req_state { 71fd8aa909SJuergen Gross xb_req_state_queued, 72fd8aa909SJuergen Gross xb_req_state_wait_reply, 73fd8aa909SJuergen Gross xb_req_state_got_reply, 74fd8aa909SJuergen Gross xb_req_state_aborted 75fd8aa909SJuergen Gross }; 76fd8aa909SJuergen Gross 77fd8aa909SJuergen Gross struct xb_req_data { 78fd8aa909SJuergen Gross struct list_head list; 79fd8aa909SJuergen Gross wait_queue_head_t wq; 80fd8aa909SJuergen Gross struct xsd_sockmsg msg; 8129fee6eeSJoao Martins uint32_t caller_req_id; 82fd8aa909SJuergen Gross enum xsd_sockmsg_type type; 83fd8aa909SJuergen Gross char *body; 84fd8aa909SJuergen Gross const struct kvec *vec; 85fd8aa909SJuergen Gross int num_vecs; 86fd8aa909SJuergen Gross int err; 87fd8aa909SJuergen Gross enum xb_req_state state; 88d10e0cc1SRoss Lagerwall bool user_req; 89fd8aa909SJuergen Gross void (*cb)(struct xb_req_data *); 90fd8aa909SJuergen Gross void *par; 91fd8aa909SJuergen Gross }; 92fd8aa909SJuergen Gross 93332f791dSJuergen Gross extern enum xenstore_init xen_store_domain_type; 94332f791dSJuergen Gross extern const struct attribute_group *xenbus_dev_groups[]; 95fd8aa909SJuergen Gross extern struct mutex xs_response_mutex; 96fd8aa909SJuergen Gross extern struct list_head xs_reply_list; 97fd8aa909SJuergen Gross extern struct list_head xb_write_list; 98fd8aa909SJuergen Gross extern wait_queue_head_t xb_waitq; 99fd8aa909SJuergen Gross extern struct mutex xb_write_mutex; 100332f791dSJuergen Gross 101332f791dSJuergen Gross int xs_init(void); 102332f791dSJuergen Gross int xb_init_comms(void); 103332f791dSJuergen Gross void xb_deinit_comms(void); 104fd8aa909SJuergen Gross int xs_watch_msg(struct xs_watch_event *event); 105fd8aa909SJuergen Gross void xs_request_exit(struct xb_req_data *req); 106332f791dSJuergen Gross 107332f791dSJuergen Gross int xenbus_match(struct device *_dev, struct device_driver *_drv); 108332f791dSJuergen Gross int xenbus_dev_probe(struct device *_dev); 109*fc7a6209SUwe Kleine-König void xenbus_dev_remove(struct device *_dev); 110332f791dSJuergen Gross int xenbus_register_driver_common(struct xenbus_driver *drv, 111332f791dSJuergen Gross struct xen_bus_type *bus, 112332f791dSJuergen Gross struct module *owner, 113332f791dSJuergen Gross const char *mod_name); 114332f791dSJuergen Gross int xenbus_probe_node(struct xen_bus_type *bus, 115332f791dSJuergen Gross const char *type, 116332f791dSJuergen Gross const char *nodename); 117332f791dSJuergen Gross int xenbus_probe_devices(struct xen_bus_type *bus); 118332f791dSJuergen Gross 119332f791dSJuergen Gross void xenbus_dev_changed(const char *node, struct xen_bus_type *bus); 120332f791dSJuergen Gross 121332f791dSJuergen Gross int xenbus_dev_suspend(struct device *dev); 122332f791dSJuergen Gross int xenbus_dev_resume(struct device *dev); 123332f791dSJuergen Gross int xenbus_dev_cancel(struct device *dev); 124332f791dSJuergen Gross 125332f791dSJuergen Gross void xenbus_otherend_changed(struct xenbus_watch *watch, 1265584ea25SJuergen Gross const char *path, const char *token, 127332f791dSJuergen Gross int ignore_on_shutdown); 128332f791dSJuergen Gross 129332f791dSJuergen Gross int xenbus_read_otherend_details(struct xenbus_device *xendev, 130332f791dSJuergen Gross char *id_node, char *path_node); 131332f791dSJuergen Gross 132332f791dSJuergen Gross void xenbus_ring_ops_init(void); 133332f791dSJuergen Gross 134fd8aa909SJuergen Gross int xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void *par); 135fd8aa909SJuergen Gross void xenbus_dev_queue_reply(struct xb_req_data *req); 136332f791dSJuergen Gross 137d10e0cc1SRoss Lagerwall extern unsigned int xb_dev_generation_id; 138d10e0cc1SRoss Lagerwall 139332f791dSJuergen Gross #endif 140