linux/drivers/staging/unisys/include/iochannel.h
<<
>>
Prefs
   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 */
  65enum 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 */
  90enum 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. */
 117enum 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. */
 125enum vdisk_mgmt_types {
 126        VDISK_MGMT_ACQUIRE = 1,
 127        VDISK_MGMT_RELEASE,
 128};
 129
 130struct 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
 140struct 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 */
 151struct uisscsi_dest {
 152        u32 channel;
 153        u32 id;
 154        u32 lun;
 155} __packed;
 156
 157struct 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 */
 177struct 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 */
 211struct 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 */
 304struct 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 */
 344struct 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
 360struct 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 */
 381struct 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 */
 406struct 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
 414struct net_pkt_enbdis {
 415        void *context;
 416        /* 1 = enable, 0 = disable */
 417        u16 enable;
 418} __packed;
 419
 420struct 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 */
 439struct 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 */
 473struct 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 */
 495struct 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 */
 502struct 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 */
 526struct iochannel_vhba {
 527        /* 8 bytes */
 528        struct vhba_wwnn wwnn;
 529        /* 20 bytes */
 530        struct vhba_config_max max;
 531} __packed;
 532
 533struct 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 */
 549struct 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