1/* visorchipset.h 2 * 3 * Copyright (C) 2010 - 2013 UNISYS CORPORATION 4 * All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or (at 9 * your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 14 * NON INFRINGEMENT. See the GNU General Public License for more 15 * details. 16 */ 17 18#ifndef __VISORCHIPSET_H__ 19#define __VISORCHIPSET_H__ 20 21#include <linux/uuid.h> 22 23#include "timskmod.h" 24#include "channel.h" 25#include "controlvmchannel.h" 26#include "parser.h" 27#include "procobjecttree.h" 28#include "vbusdeviceinfo.h" 29#include "vbushelper.h" 30 31/** Describes the state from the perspective of which controlvm messages have 32 * been received for a bus or device. 33 */ 34typedef struct { 35 u32 created:1; 36 u32 attached:1; 37 u32 configured:1; 38 u32 running:1; 39 /* Add new fields above. */ 40 /* Remaining bits in this 32-bit word are unused. */ 41} VISORCHIPSET_STATE; 42 43typedef enum { 44 /** address is guest physical, but outside of the physical memory 45 * region that is controlled by the running OS (this is the normal 46 * address type for Supervisor channels) 47 */ 48 ADDRTYPE_localPhysical, 49 50 /** address is guest physical, and withIN the confines of the 51 * physical memory controlled by the running OS. 52 */ 53 ADDRTYPE_localTest, 54} VISORCHIPSET_ADDRESSTYPE; 55 56typedef enum { 57 CRASH_dev, 58 CRASH_bus, 59} CRASH_OBJ_TYPE; 60 61/** Attributes for a particular Supervisor channel. 62 */ 63typedef struct { 64 VISORCHIPSET_ADDRESSTYPE addrType; 65 HOSTADDRESS channelAddr; 66 struct InterruptInfo intr; 67 u64 nChannelBytes; 68 uuid_le channelTypeGuid; 69 uuid_le channelInstGuid; 70 71} VISORCHIPSET_CHANNEL_INFO; 72 73/** Attributes for a particular Supervisor device. 74 * Any visorchipset client can query these attributes using 75 * visorchipset_get_client_device_info() or 76 * visorchipset_get_server_device_info(). 77 */ 78typedef struct { 79 struct list_head entry; 80 u32 busNo; 81 u32 devNo; 82 uuid_le devInstGuid; 83 VISORCHIPSET_STATE state; 84 VISORCHIPSET_CHANNEL_INFO chanInfo; 85 u32 Reserved1; /* CONTROLVM_ID */ 86 u64 Reserved2; 87 u32 switchNo; /* when devState.attached==1 */ 88 u32 internalPortNo; /* when devState.attached==1 */ 89 CONTROLVM_MESSAGE_HEADER pendingMsgHdr; /* CONTROLVM_MESSAGE */ 90 /** For private use by the bus driver */ 91 void *bus_driver_context; 92 93} VISORCHIPSET_DEVICE_INFO; 94 95static inline VISORCHIPSET_DEVICE_INFO * 96finddevice(struct list_head *list, u32 busNo, u32 devNo) 97{ 98 VISORCHIPSET_DEVICE_INFO *p; 99 100 list_for_each_entry(p, list, entry) { 101 if (p->busNo == busNo && p->devNo == devNo) 102 return p; 103 } 104 return NULL; 105} 106 107static inline void delbusdevices(struct list_head *list, u32 busNo) 108{ 109 VISORCHIPSET_DEVICE_INFO *p, *tmp; 110 111 list_for_each_entry_safe(p, tmp, list, entry) { 112 if (p->busNo == busNo) { 113 list_del(&p->entry); 114 kfree(p); 115 } 116 } 117} 118 119/** Attributes for a particular Supervisor bus. 120 * (For a service partition acting as the server for buses/devices, there 121 * is a 1-to-1 relationship between busses and guest partitions.) 122 * Any visorchipset client can query these attributes using 123 * visorchipset_get_client_bus_info() or visorchipset_get_bus_info(). 124 */ 125typedef struct { 126 struct list_head entry; 127 u32 busNo; 128 VISORCHIPSET_STATE state; 129 VISORCHIPSET_CHANNEL_INFO chanInfo; 130 uuid_le partitionGuid; 131 u64 partitionHandle; 132 u8 *name; /* UTF8 */ 133 u8 *description; /* UTF8 */ 134 u64 Reserved1; 135 u32 Reserved2; 136 MYPROCOBJECT *procObject; 137 struct { 138 u32 server:1; 139 /* Add new fields above. */ 140 /* Remaining bits in this 32-bit word are unused. */ 141 } flags; 142 CONTROLVM_MESSAGE_HEADER pendingMsgHdr; /* CONTROLVM MsgHdr */ 143 /** For private use by the bus driver */ 144 void *bus_driver_context; 145 u64 devNo; 146 147} VISORCHIPSET_BUS_INFO; 148 149static inline VISORCHIPSET_BUS_INFO * 150findbus(struct list_head *list, u32 busNo) 151{ 152 VISORCHIPSET_BUS_INFO *p; 153 154 list_for_each_entry(p, list, entry) { 155 if (p->busNo == busNo) 156 return p; 157 } 158 return NULL; 159} 160 161/** Attributes for a particular Supervisor switch. 162 */ 163typedef struct { 164 u32 switchNo; 165 VISORCHIPSET_STATE state; 166 uuid_le switchTypeGuid; 167 u8 *authService1; 168 u8 *authService2; 169 u8 *authService3; 170 u8 *securityContext; 171 u64 Reserved; 172 u32 Reserved2; /* CONTROLVM_ID */ 173 struct device dev; 174 BOOL dev_exists; 175 CONTROLVM_MESSAGE_HEADER pendingMsgHdr; 176 177} VISORCHIPSET_SWITCH_INFO; 178 179/** Attributes for a particular Supervisor external port, which is connected 180 * to a specific switch. 181 */ 182typedef struct { 183 u32 switchNo; 184 u32 externalPortNo; 185 VISORCHIPSET_STATE state; 186 uuid_le networkZoneGuid; 187 int pdPort; 188 u8 *ip; 189 u8 *ipNetmask; 190 u8 *ipBroadcast; 191 u8 *ipNetwork; 192 u8 *ipGateway; 193 u8 *ipDNS; 194 u64 Reserved1; 195 u32 Reserved2; /* CONTROLVM_ID */ 196 struct device dev; 197 BOOL dev_exists; 198 CONTROLVM_MESSAGE_HEADER pendingMsgHdr; 199 200} VISORCHIPSET_EXTERNALPORT_INFO; 201 202/** Attributes for a particular Supervisor internal port, which is how a 203 * device connects to a particular switch. 204 */ 205typedef struct { 206 u32 switchNo; 207 u32 internalPortNo; 208 VISORCHIPSET_STATE state; 209 u32 busNo; /* valid only when state.attached == 1 */ 210 u32 devNo; /* valid only when state.attached == 1 */ 211 u64 Reserved1; 212 u32 Reserved2; /* CONTROLVM_ID */ 213 CONTROLVM_MESSAGE_HEADER pendingMsgHdr; 214 MYPROCOBJECT *procObject; 215 216} VISORCHIPSET_INTERNALPORT_INFO; 217 218/* These functions will be called from within visorchipset when certain 219 * events happen. (The implementation of these functions is outside of 220 * visorchipset.) 221 */ 222typedef struct { 223 void (*bus_create)(ulong busNo); 224 void (*bus_destroy)(ulong busNo); 225 void (*device_create)(ulong busNo, ulong devNo); 226 void (*device_destroy)(ulong busNo, ulong devNo); 227 void (*device_pause)(ulong busNo, ulong devNo); 228 void (*device_resume)(ulong busNo, ulong devNo); 229 int (*get_channel_info)(uuid_le typeGuid, ulong *minSize, 230 ulong *maxSize); 231} VISORCHIPSET_BUSDEV_NOTIFIERS; 232 233/* These functions live inside visorchipset, and will be called to indicate 234 * responses to specific events (by code outside of visorchipset). 235 * For now, the value for each response is simply either: 236 * 0 = it worked 237 * -1 = it failed 238 */ 239typedef struct { 240 void (*bus_create)(ulong busNo, int response); 241 void (*bus_destroy)(ulong busNo, int response); 242 void (*device_create)(ulong busNo, ulong devNo, int response); 243 void (*device_destroy)(ulong busNo, ulong devNo, int response); 244 void (*device_pause)(ulong busNo, ulong devNo, int response); 245 void (*device_resume)(ulong busNo, ulong devNo, int response); 246} VISORCHIPSET_BUSDEV_RESPONDERS; 247 248/** Register functions (in the bus driver) to get called by visorchipset 249 * whenever a bus or device appears for which this service partition is 250 * to be the server for. visorchipset will fill in <responders>, to 251 * indicate functions the bus driver should call to indicate message 252 * responses. 253 */ 254void 255visorchipset_register_busdev_client(VISORCHIPSET_BUSDEV_NOTIFIERS *notifiers, 256 VISORCHIPSET_BUSDEV_RESPONDERS *responders, 257 ULTRA_VBUS_DEVICEINFO *driverInfo); 258 259/** Register functions (in the bus driver) to get called by visorchipset 260 * whenever a bus or device appears for which this service partition is 261 * to be the client for. visorchipset will fill in <responders>, to 262 * indicate functions the bus driver should call to indicate message 263 * responses. 264 */ 265void 266visorchipset_register_busdev_server(VISORCHIPSET_BUSDEV_NOTIFIERS *notifiers, 267 VISORCHIPSET_BUSDEV_RESPONDERS *responders, 268 ULTRA_VBUS_DEVICEINFO *driverInfo); 269 270typedef void (*SPARREPORTEVENT_COMPLETE_FUNC) (CONTROLVM_MESSAGE *msg, 271 int status); 272 273void visorchipset_device_pause_response(ulong busNo, ulong devNo, int response); 274 275BOOL visorchipset_get_bus_info(ulong busNo, VISORCHIPSET_BUS_INFO *busInfo); 276BOOL visorchipset_get_device_info(ulong busNo, ulong devNo, 277 VISORCHIPSET_DEVICE_INFO *devInfo); 278BOOL visorchipset_get_switch_info(ulong switchNo, 279 VISORCHIPSET_SWITCH_INFO *switchInfo); 280BOOL visorchipset_get_externalport_info(ulong switchNo, ulong externalPortNo, 281 VISORCHIPSET_EXTERNALPORT_INFO 282 *externalPortInfo); 283BOOL visorchipset_set_bus_context(ulong busNo, void *context); 284BOOL visorchipset_set_device_context(ulong busNo, ulong devNo, void *context); 285int visorchipset_chipset_ready(void); 286int visorchipset_chipset_selftest(void); 287int visorchipset_chipset_notready(void); 288void visorchipset_controlvm_respond_reportEvent(CONTROLVM_MESSAGE *msg, 289 void *payload); 290void visorchipset_save_message(CONTROLVM_MESSAGE *msg, CRASH_OBJ_TYPE type); 291void *visorchipset_cache_alloc(struct kmem_cache *pool, 292 BOOL ok_to_block, char *fn, int ln); 293void visorchipset_cache_free(struct kmem_cache *pool, void *p, 294 char *fn, int ln); 295 296#if defined(TRANSMITFILE_DEBUG) || defined(DEBUG) 297#define DBG_GETFILE_PAYLOAD(msg, controlvm_header) \ 298 LOGINF(msg, \ 299 (ulong)controlvm_header.PayloadVmOffset, \ 300 (ulong)controlvm_header.PayloadMaxBytes) 301#define DBG_GETFILE(fmt, ...) LOGINF(fmt, ##__VA_ARGS__) 302#define DBG_PUTFILE(fmt, ...) LOGINF(fmt, ##__VA_ARGS__) 303#else 304#define DBG_GETFILE_PAYLOAD(msg, controlvm_header) 305#define DBG_GETFILE(fmt, ...) 306#define DBG_PUTFILE(fmt, ...) 307#endif 308 309#endif 310