| /* visorbus.h |
| * |
| * Copyright (C) 2010 - 2013 UNISYS CORPORATION |
| * All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or (at |
| * your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or |
| * NON INFRINGEMENT. See the GNU General Public License for more |
| * details. |
| */ |
| |
| /* |
| * This header file is to be included by other kernel mode components that |
| * implement a particular kind of visor_device. Each of these other kernel |
| * mode components is called a visor device driver. Refer to visortemplate |
| * for a minimal sample visor device driver. |
| * |
| * There should be nothing in this file that is private to the visorbus |
| * bus implementation itself. |
| * |
| */ |
| |
| #ifndef __VISORBUS_H__ |
| #define __VISORBUS_H__ |
| |
| #include <linux/device.h> |
| #include <linux/module.h> |
| #include <linux/poll.h> |
| #include <linux/kernel.h> |
| #include <linux/uuid.h> |
| |
| #include "periodic_work.h" |
| #include "channel.h" |
| |
| struct visor_driver; |
| struct visor_device; |
| extern struct bus_type visorbus_type; |
| |
| typedef void (*visorbus_state_complete_func) (struct visor_device *dev, |
| int status); |
| struct visorchipset_state { |
| u32 created:1; |
| u32 attached:1; |
| u32 configured:1; |
| u32 running:1; |
| /* Add new fields above. */ |
| /* Remaining bits in this 32-bit word are unused. */ |
| }; |
| |
| /** This struct describes a specific Supervisor channel, by providing its |
| * GUID, name, and sizes. |
| */ |
| struct visor_channeltype_descriptor { |
| const uuid_le guid; |
| const char *name; |
| }; |
| |
| /** Information provided by each visor driver when it registers with the |
| * visorbus driver. |
| */ |
| struct visor_driver { |
| const char *name; |
| const char *version; |
| const char *vertag; |
| const char *build_date; |
| const char *build_time; |
| struct module *owner; |
| |
| /** Types of channels handled by this driver, ending with 0 GUID. |
| * Our specialized BUS.match() method knows about this list, and |
| * uses it to determine whether this driver will in fact handle a |
| * new device that it has detected. |
| */ |
| struct visor_channeltype_descriptor *channel_types; |
| |
| /** Called when a new device comes online, by our probe() function |
| * specified by driver.probe() (triggered ultimately by some call |
| * to driver_register() / bus_add_driver() / driver_attach()). |
| */ |
| int (*probe)(struct visor_device *dev); |
| |
| /** Called when a new device is removed, by our remove() function |
| * specified by driver.remove() (triggered ultimately by some call |
| * to device_release_driver()). |
| */ |
| void (*remove)(struct visor_device *dev); |
| |
| /** Called periodically, whenever there is a possibility that |
| * "something interesting" may have happened to the channel state. |
| */ |
| void (*channel_interrupt)(struct visor_device *dev); |
| |
| /** Called to initiate a change of the device's state. If the return |
| * valu`e is < 0, there was an error and the state transition will NOT |
| * occur. If the return value is >= 0, then the state transition was |
| * INITIATED successfully, and complete_func() will be called (or was |
| * just called) with the final status when either the state transition |
| * fails or completes successfully. |
| */ |
| int (*pause)(struct visor_device *dev, |
| visorbus_state_complete_func complete_func); |
| int (*resume)(struct visor_device *dev, |
| visorbus_state_complete_func complete_func); |
| |
| /** These fields are for private use by the bus driver only. */ |
| struct device_driver driver; |
| struct driver_attribute version_attr; |
| }; |
| |
| #define to_visor_driver(x) ((x) ? \ |
| (container_of(x, struct visor_driver, driver)) : (NULL)) |
| |
| /** A device type for things "plugged" into the visorbus bus */ |
| |
| struct visor_device { |
| /** visor driver can use the visorchannel member with the functions |
| * defined in visorchannel.h to access the channel |
| */ |
| struct visorchannel *visorchannel; |
| uuid_le channel_type_guid; |
| u64 channel_bytes; |
| |
| /** These fields are for private use by the bus driver only. |
| * A notable exception is that the visor driver can use |
| * visor_get_drvdata() and visor_set_drvdata() to retrieve or stash |
| * private visor driver specific data within the device member. |
| */ |
| struct device device; |
| struct list_head list_all; |
| struct periodic_work *periodic_work; |
| bool being_removed; |
| bool responded_to_device_create; |
| struct kobject kobjdevmajorminor; /* visorbus<x>/dev<y>/devmajorminor/*/ |
| struct { |
| int major, minor; |
| void *attr; /* private use by devmajorminor_attr.c you can |
| * change this constant to whatever you |
| * want; */ |
| } devnodes[5]; |
| /* the code will detect and behave appropriately) */ |
| struct semaphore visordriver_callback_lock; |
| bool pausing; |
| bool resuming; |
| u32 chipset_bus_no; |
| u32 chipset_dev_no; |
| struct visorchipset_state state; |
| uuid_le type; |
| uuid_le inst; |
| u8 *name; |
| u8 *description; |
| struct controlvm_message_header *pending_msg_hdr; |
| void *vbus_hdr_info; |
| u32 switch_no; |
| u32 internal_port_no; |
| uuid_le partition_uuid; |
| }; |
| |
| #define to_visor_device(x) container_of(x, struct visor_device, device) |
| |
| #ifndef STANDALONE_CLIENT |
| int visorbus_register_visor_driver(struct visor_driver *); |
| void visorbus_unregister_visor_driver(struct visor_driver *); |
| int visorbus_read_channel(struct visor_device *dev, |
| unsigned long offset, void *dest, |
| unsigned long nbytes); |
| int visorbus_write_channel(struct visor_device *dev, |
| unsigned long offset, void *src, |
| unsigned long nbytes); |
| int visorbus_clear_channel(struct visor_device *dev, |
| unsigned long offset, u8 ch, unsigned long nbytes); |
| int visorbus_registerdevnode(struct visor_device *dev, |
| const char *name, int major, int minor); |
| void visorbus_enable_channel_interrupts(struct visor_device *dev); |
| void visorbus_disable_channel_interrupts(struct visor_device *dev); |
| #endif |
| |
| /* Note that for visorchannel_create() |
| * <channel_bytes> and <guid> arguments may be 0 if we are a channel CLIENT. |
| * In this case, the values can simply be read from the channel header. |
| */ |
| struct visorchannel *visorchannel_create(u64 physaddr, |
| unsigned long channel_bytes, |
| gfp_t gfp, uuid_le guid); |
| struct visorchannel *visorchannel_create_with_lock(u64 physaddr, |
| unsigned long channel_bytes, |
| gfp_t gfp, uuid_le guid); |
| void visorchannel_destroy(struct visorchannel *channel); |
| int visorchannel_read(struct visorchannel *channel, ulong offset, |
| void *local, ulong nbytes); |
| int visorchannel_write(struct visorchannel *channel, ulong offset, |
| void *local, ulong nbytes); |
| int visorchannel_clear(struct visorchannel *channel, ulong offset, |
| u8 ch, ulong nbytes); |
| bool visorchannel_signalremove(struct visorchannel *channel, u32 queue, |
| void *msg); |
| bool visorchannel_signalinsert(struct visorchannel *channel, u32 queue, |
| void *msg); |
| bool visorchannel_signalempty(struct visorchannel *channel, u32 queue); |
| |
| int visorchannel_signalqueue_slots_avail(struct visorchannel *channel, |
| u32 queue); |
| int visorchannel_signalqueue_max_slots(struct visorchannel *channel, u32 queue); |
| u64 visorchannel_get_physaddr(struct visorchannel *channel); |
| ulong visorchannel_get_nbytes(struct visorchannel *channel); |
| char *visorchannel_id(struct visorchannel *channel, char *s); |
| char *visorchannel_zoneid(struct visorchannel *channel, char *s); |
| u64 visorchannel_get_clientpartition(struct visorchannel *channel); |
| int visorchannel_set_clientpartition(struct visorchannel *channel, |
| u64 partition_handle); |
| uuid_le visorchannel_get_uuid(struct visorchannel *channel); |
| char *visorchannel_uuid_id(uuid_le *guid, char *s); |
| void visorchannel_debug(struct visorchannel *channel, int num_queues, |
| struct seq_file *seq, u32 off); |
| void __iomem *visorchannel_get_header(struct visorchannel *channel); |
| |
| #define BUS_ROOT_DEVICE UINT_MAX |
| struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no, |
| struct visor_device *from); |
| #endif |