/*      $NetBSD: viovar.h,v 1.1 2016/08/19 19:40:27 palle Exp $ */
/*      $OpenBSD: viovar.h,v 1.2 2009/01/12 19:52:39 kettenis Exp $     */
/*
* Copyright (c) 2009 Mark Kettenis
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

/*
* Virtual IO device protocol.
*/

struct vio_msg_tag {
       uint8_t         type;
       uint8_t         stype;
       uint16_t        stype_env;
       uint32_t        sid;
};

struct vio_msg {
       uint64_t        hdr;
       uint8_t         type;
       uint8_t         stype;
       uint16_t        stype_env;
       uint32_t        sid;
       uint16_t        major;
       uint16_t        minor;
       uint8_t         dev_class;
};

/* Message types. */
#define VIO_TYPE_CTRL           0x01
#define VIO_TYPE_DATA           0x02
#define VIO_TYPE_ERR            0x04

/* Sub-Message types. */
#define VIO_SUBTYPE_INFO        0x01
#define VIO_SUBTYPE_ACK         0x02
#define VIO_SUBTYPE_NACK        0x04

/* Sub-Type envelopes. */
#define VIO_VER_INFO            0x0001
#define VIO_ATTR_INFO           0x0002
#define VIO_DRING_REG           0x0003
#define VIO_DRING_UNREG         0x0004
#define VIO_RDX                 0x0005

#define VIO_PKT_DATA            0x0040
#define VIO_DESC_DATA           0x0041
#define VIO_DRING_DATA          0x0042

struct vio_ver_info {
       struct vio_msg_tag      tag;
       uint16_t                major;
       uint16_t                minor;
       uint8_t                 dev_class;
       uint8_t                 _reserved1[3];
       uint64_t                _reserved2[5];
};

/* Device types. */
#define VDEV_NETWORK            0x01
#define VDEV_NETWORK_SWITCH     0x02
#define VDEV_DISK               0x03
#define VDEV_DISK_SERVER        0x04

struct vio_dring_reg {
       struct vio_msg_tag      tag;
       uint64_t                dring_ident;
       uint32_t                num_descriptors;
       uint32_t                descriptor_size;
       uint16_t                options;
       uint16_t                _reserved;
       uint32_t                ncookies;
       struct ldc_cookie       cookie[1];
};

/* Ring options. */
#define VIO_TX_RING             0x0001
#define VIO_RX_RING             0x0002

/* Transfer modes. */
#define VIO_PKT_MODE            0x01
#define VIO_DESC_MODE           0x02
#define VIO_DRING_MODE          0x03

struct vio_dring_hdr {
       uint8_t         dstate;
       uint8_t         ack: 1;
       uint16_t        _reserved[3];
};

/* Descriptor states. */
#define VIO_DESC_FREE           0x01
#define VIO_DESC_READY          0x02
#define VIO_DESC_ACCEPTED       0x03
#define VIO_DESC_DONE           0x04

struct vio_dring_msg {
       struct vio_msg_tag      tag;
       uint64_t                seq_no;
       uint64_t                dring_ident;
       uint32_t                start_idx;
       uint32_t                end_idx;
       uint8_t                 proc_state;
       uint8_t                 _reserved1[7];
       uint64_t                _reserved2[2];
};

/* Ring states. */
#define VIO_DP_ACTIVE   0x01
#define VIO_DP_STOPPED  0x02

struct vio_rdx {
       struct vio_msg_tag      tag;
       uint64_t                _reserved[6];
};