1 /* 2 * Copyright (C) 2010 - 2016 UNISYS CORPORATION 3 * All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or (at 8 * your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 13 * NON INFRINGEMENT. See the GNU General Public License for more 14 * details. 15 */ 16 17 #ifndef __IOCHANNEL_H__ 18 #define __IOCHANNEL_H__ 19 20 /* 21 * Everything needed for IOPart-GuestPart communication is define in 22 * this file. Note: Everything is OS-independent because this file is 23 * used by Windows, Linux and possible EFI drivers. 24 * 25 * Communication flow between the IOPart and GuestPart uses the channel headers 26 * channel state. The following states are currently being used: 27 * UNINIT(All Zeroes), CHANNEL_ATTACHING, CHANNEL_ATTACHED, CHANNEL_OPENED 28 * 29 * Additional states will be used later. No locking is needed to switch between 30 * states due to the following rules: 31 * 32 * 1. IOPart is only the only partition allowed to change from UNIT 33 * 2. IOPart is only the only partition allowed to change from 34 * CHANNEL_ATTACHING 35 * 3. GuestPart is only the only partition allowed to change from 36 * CHANNEL_ATTACHED 37 * 38 * The state changes are the following: IOPart sees the channel is in UNINIT, 39 * UNINIT -> CHANNEL_ATTACHING (performed only by IOPart) 40 * CHANNEL_ATTACHING -> CHANNEL_ATTACHED (performed only by IOPart) 41 * CHANNEL_ATTACHED -> CHANNEL_OPENED (performed only by GuestPart) 42 */ 43 44 #include <linux/uuid.h> 45 #include <linux/skbuff.h> 46 47 #include "channel.h" 48 49 /* 50 * Must increment these whenever you insert or delete fields within this channel 51 * struct. Also increment whenever you change the meaning of fields within this 52 * channel struct so as to break pre-existing software. Note that you can 53 * usually add fields to the END of the channel struct without needing to 54 * increment this. 55 */ 56 #define VISOR_VHBA_CHANNEL_VERSIONID 2 57 #define VISOR_VNIC_CHANNEL_VERSIONID 2 58 59 /* 60 * Everything necessary to handle SCSI & NIC traffic between Guest Partition and 61 * IO Partition is defined below. 62 */ 63 64 /* 65 * Define the two queues per data channel between iopart and ioguestparts. 66 * IOCHAN_TO_IOPART -- used by guest to 'insert' signals to iopart. 67 * IOCHAN_FROM_IOPART -- used by guest to 'remove' signals from IO part. 68 */ 69 #define IOCHAN_TO_IOPART 0 70 #define IOCHAN_FROM_IOPART 1 71 72 /* Size of cdb - i.e., SCSI cmnd */ 73 #define MAX_CMND_SIZE 16 74 75 /* Unisys-specific DMA direction values */ 76 enum uis_dma_data_direction { 77 UIS_DMA_BIDIRECTIONAL = 0, 78 UIS_DMA_TO_DEVICE = 1, 79 UIS_DMA_FROM_DEVICE = 2, 80 UIS_DMA_NONE = 3 81 }; 82 83 #define MAX_SENSE_SIZE 64 84 #define MAX_PHYS_INFO 64 85 86 /* 87 * enum net_types - Various types of network packets that can be sent in cmdrsp. 88 * @NET_RCV_POST: Submit buffer to hold receiving incoming packet. 89 * @NET_RCV: visornic -> uisnic. Incoming packet received. 90 * @NET_XMIT: uisnic -> visornic. For outgoing packet. 91 * @NET_XMIT_DONE: visornic -> uisnic. Outgoing packet xmitted. 92 * @NET_RCV_ENBDIS: uisnic -> visornic. Enable/Disable packet reception. 93 * @NET_RCV_ENBDIS_ACK: visornic -> uisnic. Acknowledge enable/disable packet. 94 * @NET_RCV_PROMISC: uisnic -> visornic. Enable/Disable promiscuous mode. 95 * @NET_CONNECT_STATUS: visornic -> uisnic. Indicate the loss or restoration of 96 * a network connection. 97 * @NET_MACADDR: uisnic -> visornic. Indicates the client has requested 98 * to update it's MAC address. 99 * @NET_MACADDR_ACK: MAC address acknowledge. 100 */ 101 enum net_types { 102 NET_RCV_POST = 0, 103 NET_RCV, 104 NET_XMIT, 105 NET_XMIT_DONE, 106 NET_RCV_ENBDIS, 107 NET_RCV_ENBDIS_ACK, 108 /* Reception */ 109 NET_RCV_PROMISC, 110 NET_CONNECT_STATUS, 111 NET_MACADDR, 112 NET_MACADDR_ACK, 113 }; 114 115 /* Minimum eth data size */ 116 #define ETH_MIN_DATA_SIZE 46 117 #define ETH_MIN_PACKET_SIZE (ETH_HLEN + ETH_MIN_DATA_SIZE) 118 119 /* Maximum data size */ 120 #define VISOR_ETH_MAX_MTU 16384 121 122 #ifndef MAX_MACADDR_LEN 123 /* Number of bytes in MAC address */ 124 #define MAX_MACADDR_LEN 6 125 #endif 126 127 /* Various types of scsi task mgmt commands. */ 128 enum task_mgmt_types { 129 TASK_MGMT_ABORT_TASK = 1, 130 TASK_MGMT_BUS_RESET, 131 TASK_MGMT_LUN_RESET, 132 TASK_MGMT_TARGET_RESET, 133 }; 134 135 /* Various types of vdisk mgmt commands. */ 136 enum vdisk_mgmt_types { 137 VDISK_MGMT_ACQUIRE = 1, 138 VDISK_MGMT_RELEASE, 139 }; 140 141 struct phys_info { 142 u64 pi_pfn; 143 u16 pi_off; 144 u16 pi_len; 145 } __packed; 146 147 #define MIN_NUMSIGNALS 64 148 149 /* Structs with pragma pack. */ 150 151 struct guest_phys_info { 152 u64 address; 153 u64 length; 154 } __packed; 155 156 /* 157 * struct uisscsi_dest 158 * @channel: Bus number. 159 * @id: Target number. 160 * @lun: Logical unit number. 161 */ 162 struct uisscsi_dest { 163 u32 channel; 164 u32 id; 165 u32 lun; 166 } __packed; 167 168 struct vhba_wwnn { 169 u32 wwnn1; 170 u32 wwnn2; 171 } __packed; 172 173 /* 174 * struct vhba_config_max 175 * @max_channel: Maximum channel for devices attached to this bus. 176 * @max_id: Maximum SCSI ID for devices attached to bus. 177 * @max_lun: Maximum SCSI LUN for devices attached to bus. 178 * @cmd_per_lun: Maximum number of outstanding commands per LUN. 179 * @max_io_size: Maximum io size for devices attached to this bus. Max io size 180 * is often determined by the resource of the hba. 181 * e.g Max scatter gather list length * page size / sector size. 182 * 183 * WARNING: Values stored in this structure must contain maximum counts (not 184 * maximum values). 185 * 186 * 20 bytes 187 */ 188 struct vhba_config_max { 189 u32 max_channel; 190 u32 max_id; 191 u32 max_lun; 192 u32 cmd_per_lun; 193 u32 max_io_size; 194 } __packed; 195 196 /* 197 * struct uiscmdrsp_scsi 198 * 199 * @handle: The handle to the cmd that was received. Send it back as 200 * is in the rsp packet. 201 * @cmnd: The cdb for the command. 202 * @bufflen: Length of data to be transferred out or in. 203 * @guest_phys_entries: Number of entries in scatter-gather list. 204 * @struct gpi_list: Physical address information for each fragment. 205 * @data_dir: Direction of the data, if any. 206 * @struct vdest: Identifies the virtual hba, id, channel, lun to which 207 * cmd was sent. 208 * @linuxstat: Original Linux status used by Linux vdisk. 209 * @scsistat: The scsi status. 210 * @addlstat: Non-scsi status. 211 * @sensebuf: Sense info in case cmd failed. sensebuf holds the 212 * sense_data struct. See sense_data struct for more 213 * details. 214 * @*vdisk: Pointer to the vdisk to clean up when IO completes. 215 * @no_disk_result: Used to return no disk inquiry result when 216 * no_disk_result is set to 1 217 * scsi.scsistat is SAM_STAT_GOOD 218 * scsi.addlstat is 0 219 * scsi.linuxstat is SAM_STAT_GOOD 220 * That is, there is NO error. 221 */ 222 struct uiscmdrsp_scsi { 223 u64 handle; 224 u8 cmnd[MAX_CMND_SIZE]; 225 u32 bufflen; 226 u16 guest_phys_entries; 227 struct guest_phys_info gpi_list[MAX_PHYS_INFO]; 228 u32 data_dir; 229 struct uisscsi_dest vdest; 230 /* Needed to queue the rsp back to cmd originator. */ 231 int linuxstat; 232 u8 scsistat; 233 u8 addlstat; 234 #define ADDL_SEL_TIMEOUT 4 235 /* The following fields are need to determine the result of command. */ 236 u8 sensebuf[MAX_SENSE_SIZE]; 237 void *vdisk; 238 int no_disk_result; 239 } __packed; 240 241 /* 242 * Defines to support sending correct inquiry result when no disk is 243 * configured. 244 * 245 * From SCSI SPC2 - 246 * 247 * If the target is not capable of supporting a device on this logical unit, the 248 * device server shall set this field to 7Fh (PERIPHERAL QUALIFIER set to 011b 249 * and PERIPHERAL DEVICE TYPE set to 1Fh). 250 * 251 * The device server is capable of supporting the specified peripheral device 252 * type on this logical unit. However, the physical device is not currently 253 * connected to this logical unit. 254 */ 255 256 /* 257 * Peripheral qualifier of 0x3 258 * Peripheral type of 0x1f 259 * Specifies no device but target present 260 */ 261 #define DEV_NOT_CAPABLE 0x7f 262 /* 263 * Peripheral qualifier of 0x1 264 * Peripheral type of 0 - disk 265 * Specifies device capable, but not present 266 */ 267 #define DEV_DISK_CAPABLE_NOT_PRESENT 0x20 268 /* HiSup = 1; shows support for report luns must be returned for lun 0. */ 269 #define DEV_HISUPPORT 0x10 270 271 /* 272 * Peripheral qualifier of 0x3 273 * Peripheral type of 0x1f 274 * Specifies no device but target present 275 */ 276 #define DEV_NOT_CAPABLE 0x7f 277 /* 278 * Peripheral qualifier of 0x1 279 * Peripheral type of 0 - disk 280 * Specifies device capable, but not present 281 */ 282 #define DEV_DISK_CAPABLE_NOT_PRESENT 0x20 283 /* HiSup = 1; shows support for report luns must be returned for lun 0. */ 284 #define DEV_HISUPPORT 0x10 285 286 /* 287 * NOTE: Linux code assumes inquiry contains 36 bytes. Without checking length 288 * in buf[4] some Linux code accesses bytes beyond 5 to retrieve vendor, product 289 * and revision. Yikes! So let us always send back 36 bytes, the minimum for 290 * inquiry result. 291 */ 292 #define NO_DISK_INQUIRY_RESULT_LEN 36 293 /* 5 bytes minimum for inquiry result */ 294 #define MIN_INQUIRY_RESULT_LEN 5 295 296 /* SCSI device version for no disk inquiry result */ 297 /* indicates SCSI SPC2 (SPC3 is 5) */ 298 #define SCSI_SPC2_VER 4 299 300 /* Struct and Defines to support sense information. */ 301 302 /* 303 * The following struct is returned in sensebuf field in uiscmdrsp_scsi. It is 304 * initialized in exactly the manner that is recommended in Windows (hence the 305 * odd values). 306 * When set, these fields will have the following values: 307 * ErrorCode = 0x70 indicates current error 308 * Valid = 1 indicates sense info is valid 309 * SenseKey contains sense key as defined by SCSI specs. 310 * AdditionalSenseCode contains sense key as defined by SCSI specs. 311 * AdditionalSenseCodeQualifier contains qualifier to sense code as defined by 312 * scsi docs. 313 * AdditionalSenseLength contains will be sizeof(sense_data)-8=10. 314 */ 315 struct sense_data { 316 u8 errorcode:7; 317 u8 valid:1; 318 u8 segment_number; 319 u8 sense_key:4; 320 u8 reserved:1; 321 u8 incorrect_length:1; 322 u8 end_of_media:1; 323 u8 file_mark:1; 324 u8 information[4]; 325 u8 additional_sense_length; 326 u8 command_specific_information[4]; 327 u8 additional_sense_code; 328 u8 additional_sense_code_qualifier; 329 u8 fru_code; 330 u8 sense_key_specific[3]; 331 } __packed; 332 333 /* 334 * struct net_pkt_xmt 335 * @len: Full length of data in the packet. 336 * @num_frags: Number of fragments in frags containing data. 337 * @struct phys_info frags: Physical page information. 338 * @ethhdr: The ethernet header. 339 * @struct lincsum: These are needed for csum at uisnic end. 340 * @valid: 1 = struct is valid - else ignore. 341 * @hrawoffv: 1 = hwrafoff is valid. 342 * @nhrawoffv: 1 = nhwrafoff is valid. 343 * @protocol: Specifies packet protocol. 344 * @csum: Value used to set skb->csum at IOPart. 345 * @hrawoff: Value used to set skb->h.raw at IOPart. hrawoff points to 346 * the start of the TRANSPORT LAYER HEADER. 347 * @nhrawoff: Value used to set skb->nh.raw at IOPart. nhrawoff points to 348 * the start of the NETWORK LAYER HEADER. 349 * 350 * NOTE: 351 * The full packet is described in frags but the ethernet header is 352 * separately kept in ethhdr so that uisnic doesn't have "MAP" the 353 * guest memory to get to the header. uisnic needs ethhdr to 354 * determine how to route the packet. 355 */ 356 struct net_pkt_xmt { 357 int len; 358 int num_frags; 359 struct phys_info frags[MAX_PHYS_INFO]; 360 char ethhdr[ETH_HLEN]; 361 struct { 362 u8 valid; 363 u8 hrawoffv; 364 u8 nhrawoffv; 365 __be16 protocol; 366 __wsum csum; 367 u32 hrawoff; 368 u32 nhrawoff; 369 } lincsum; 370 } __packed; 371 372 struct net_pkt_xmtdone { 373 /* Result of NET_XMIT */ 374 u32 xmt_done_result; 375 } __packed; 376 377 /* 378 * RCVPOST_BUF_SIZE must be at most page_size(4096) - cache_line_size (64) The 379 * reason is because dev_skb_alloc which is used to generate RCV_POST skbs in 380 * visornic requires that there is "overhead" in the buffer, and pads 16 bytes. 381 * Use 1 full cache line size for "overhead" so that transfers are optimized. 382 * IOVM requires that a buffer be represented by 1 phys_info structure 383 * which can only cover page_size. 384 */ 385 #define RCVPOST_BUF_SIZE 4032 386 #define MAX_NET_RCV_CHAIN \ 387 ((VISOR_ETH_MAX_MTU + ETH_HLEN + RCVPOST_BUF_SIZE - 1) \ 388 / RCVPOST_BUF_SIZE) 389 390 /* rcv buf size must be large enough to include ethernet data len + ethernet 391 * header len - we are choosing 2K because it is guaranteed to be describable. 392 */ 393 struct net_pkt_rcvpost { 394 /* Physical page information for the single fragment 2K rcv buf */ 395 struct phys_info frag; 396 /* 397 * Ensures that receive posts are returned to the adapter which we sent 398 * them from originally. 399 */ 400 u64 unique_num; 401 402 } __packed; 403 404 /* 405 * struct net_pkt_rcv 406 * @rcv_done_len: Length of the received data. 407 * @numrcvbufs: Contains the incoming data. Guest side MUST chain these 408 * together. 409 * @*rcvbuf: List of chained rcvbufa. Each entry is a receive buffer 410 * provided by NET_RCV_POST. NOTE: First rcvbuf in the 411 * chain will also be provided in net.buf. 412 * @unique_num: 413 * @rcvs_dropped_delta: 414 * 415 * The number of rcvbuf that can be chained is based on max mtu and size of each 416 * rcvbuf. 417 */ 418 struct net_pkt_rcv { 419 u32 rcv_done_len; 420 u8 numrcvbufs; 421 void *rcvbuf[MAX_NET_RCV_CHAIN]; 422 u64 unique_num; 423 u32 rcvs_dropped_delta; 424 } __packed; 425 426 struct net_pkt_enbdis { 427 void *context; 428 /* 1 = enable, 0 = disable */ 429 u16 enable; 430 } __packed; 431 432 struct net_pkt_macaddr { 433 void *context; 434 /* 6 bytes */ 435 u8 macaddr[MAX_MACADDR_LEN]; 436 } __packed; 437 438 /* 439 * struct uiscmdrsp_net - cmd rsp packet used for VNIC network traffic. 440 * @enum type: 441 * @*buf: 442 * @union: 443 * @struct xmt: Used for NET_XMIT. 444 * @struct xmtdone: Used for NET_XMIT_DONE. 445 * @struct rcvpost: Used for NET_RCV_POST. 446 * @struct rcv: Used for NET_RCV. 447 * @struct enbdis: Used for NET_RCV_ENBDIS, NET_RCV_ENBDIS_ACK, 448 * NET_RCV_PROMSIC, and NET_CONNECT_STATUS. 449 * @struct macaddr: 450 */ 451 struct uiscmdrsp_net { 452 enum net_types type; 453 void *buf; 454 union { 455 struct net_pkt_xmt xmt; 456 struct net_pkt_xmtdone xmtdone; 457 struct net_pkt_rcvpost rcvpost; 458 struct net_pkt_rcv rcv; 459 struct net_pkt_enbdis enbdis; 460 struct net_pkt_macaddr macaddr; 461 }; 462 } __packed; 463 464 /* 465 * struct uiscmdrsp_scsitaskmgmt 466 * @enum tasktype: The type of task. 467 * @struct vdest: The vdisk for which this task mgmt is generated. 468 * @handle: This is a handle that the guest has saved off for its 469 * own use. The handle value is preserved by iopart and 470 * returned as in task mgmt rsp. 471 * @notify_handle: For Linux guests, this is a pointer to wait_queue_head 472 * that a thread is waiting on to see if the taskmgmt 473 * command has completed. When the rsp is received by 474 * guest, the thread receiving the response uses this to 475 * notify the thread waiting for taskmgmt command 476 * completion. It's value is preserved by iopart and 477 * returned as in the task mgmt rsp. 478 * @notifyresult_handle: This is a handle to the location in the guest where 479 * the result of the taskmgmt command (result field) is 480 * saved to when the response is handled. It's value is 481 * preserved by iopart and returned as is in the task mgmt 482 * rsp. 483 * @result: Result of taskmgmt command - set by IOPart. 484 */ 485 struct uiscmdrsp_scsitaskmgmt { 486 enum task_mgmt_types tasktype; 487 struct uisscsi_dest vdest; 488 u64 handle; 489 u64 notify_handle; 490 u64 notifyresult_handle; 491 char result; 492 493 #define TASK_MGMT_FAILED 0 494 } __packed; 495 496 /* 497 * struct uiscmdrsp_disknotify - Used by uissd to send disk add/remove 498 * notifications to Guest. 499 * @add: 0-remove, 1-add. 500 * @*v_hba: Channel info to route msg. 501 * @channel: SCSI Path of Disk to added or removed. 502 * @id: SCSI Path of Disk to added or removed. 503 * @lun: SCSI Path of Disk to added or removed. 504 * 505 * Note that the vHba pointer is not used by the Client/Guest side. 506 */ 507 struct uiscmdrsp_disknotify { 508 u8 add; 509 void *v_hba; 510 u32 channel, id, lun; 511 } __packed; 512 513 /* Keeping cmd and rsp info in one structure for now cmd rsp packet for SCSI */ 514 struct uiscmdrsp { 515 char cmdtype; 516 /* Describes what type of information is in the struct */ 517 #define CMD_SCSI_TYPE 1 518 #define CMD_NET_TYPE 2 519 #define CMD_SCSITASKMGMT_TYPE 3 520 #define CMD_NOTIFYGUEST_TYPE 4 521 union { 522 struct uiscmdrsp_scsi scsi; 523 struct uiscmdrsp_net net; 524 struct uiscmdrsp_scsitaskmgmt scsitaskmgmt; 525 struct uiscmdrsp_disknotify disknotify; 526 }; 527 /* Send the response when the cmd is done (scsi and scsittaskmgmt). */ 528 void *private_data; 529 /* General Purpose Queue Link */ 530 struct uiscmdrsp *next; 531 /* Pointer to the nextactive commands */ 532 struct uiscmdrsp *activeQ_next; 533 /* Pointer to the prevactive commands */ 534 struct uiscmdrsp *activeQ_prev; 535 } __packed; 536 537 /* total = 28 bytes */ 538 struct iochannel_vhba { 539 /* 8 bytes */ 540 struct vhba_wwnn wwnn; 541 /* 20 bytes */ 542 struct vhba_config_max max; 543 } __packed; 544 545 struct iochannel_vnic { 546 /* 6 bytes */ 547 u8 macaddr[6]; 548 /* 4 bytes */ 549 u32 num_rcv_bufs; 550 /* 4 bytes */ 551 u32 mtu; 552 /* 16 bytes */ 553 guid_t zone_guid; 554 } __packed; 555 556 /* 557 * This is just the header of the IO channel. It is assumed that directly after 558 * this header there is a large region of memory which contains the command and 559 * response queues as specified in cmd_q and rsp_q SIGNAL_QUEUE_HEADERS. 560 */ 561 struct visor_io_channel { 562 struct channel_header channel_header; 563 struct signal_queue_header cmd_q; 564 struct signal_queue_header rsp_q; 565 union { 566 struct iochannel_vhba vhba; 567 struct iochannel_vnic vnic; 568 } __packed; 569 570 #define MAX_CLIENTSTRING_LEN 1024 571 /* client_string is NULL termimated so holds max-1 bytes */ 572 u8 client_string[MAX_CLIENTSTRING_LEN]; 573 } __packed; 574 575 /* INLINE functions for initializing and accessing I/O data channels. */ 576 #define SIZEOF_CMDRSP (64 * DIV_ROUND_UP(sizeof(struct uiscmdrsp), 64)) 577 578 /* Use 4K page sizes when passing page info between Guest and IOPartition. */ 579 #define PI_PAGE_SIZE 0x1000 580 #define PI_PAGE_MASK 0x0FFF 581 582 /* __IOCHANNEL_H__ */ 583 #endif 584