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