1 /*        $NetBSD: viovar.h,v 1.1 2016/08/19 19:40:27 palle Exp $     */
2 /*        $OpenBSD: viovar.h,v 1.2 2009/01/12 19:52:39 kettenis Exp $ */
3 /*
4  * Copyright (c) 2009 Mark Kettenis
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /*
20  * Virtual IO device protocol.
21  */
22 
23 struct vio_msg_tag {
24           uint8_t             type;
25           uint8_t             stype;
26           uint16_t  stype_env;
27           uint32_t  sid;
28 };
29 
30 struct vio_msg {
31           uint64_t  hdr;
32           uint8_t             type;
33           uint8_t             stype;
34           uint16_t  stype_env;
35           uint32_t  sid;
36           uint16_t  major;
37           uint16_t  minor;
38           uint8_t             dev_class;
39 };
40 
41 /* Message types. */
42 #define VIO_TYPE_CTRL                   0x01
43 #define VIO_TYPE_DATA                   0x02
44 #define VIO_TYPE_ERR                    0x04
45 
46 /* Sub-Message types. */
47 #define VIO_SUBTYPE_INFO      0x01
48 #define VIO_SUBTYPE_ACK                 0x02
49 #define VIO_SUBTYPE_NACK      0x04
50 
51 /* Sub-Type envelopes. */
52 #define VIO_VER_INFO                    0x0001
53 #define VIO_ATTR_INFO                   0x0002
54 #define VIO_DRING_REG                   0x0003
55 #define VIO_DRING_UNREG                 0x0004
56 #define VIO_RDX                         0x0005
57 
58 #define VIO_PKT_DATA                    0x0040
59 #define VIO_DESC_DATA                   0x0041
60 #define VIO_DRING_DATA                  0x0042
61 
62 struct vio_ver_info {
63           struct vio_msg_tag  tag;
64           uint16_t            major;
65           uint16_t            minor;
66           uint8_t                       dev_class;
67           uint8_t                       _reserved1[3];
68           uint64_t            _reserved2[5];
69 };
70 
71 /* Device types. */
72 #define VDEV_NETWORK                    0x01
73 #define VDEV_NETWORK_SWITCH   0x02
74 #define VDEV_DISK             0x03
75 #define VDEV_DISK_SERVER      0x04
76 
77 struct vio_dring_reg {
78           struct vio_msg_tag  tag;
79           uint64_t            dring_ident;
80           uint32_t            num_descriptors;
81           uint32_t            descriptor_size;
82           uint16_t            options;
83           uint16_t            _reserved;
84           uint32_t            ncookies;
85           struct ldc_cookie   cookie[1];
86 };
87 
88 /* Ring options. */
89 #define VIO_TX_RING           0x0001
90 #define VIO_RX_RING           0x0002
91 
92 /* Transfer modes. */
93 #define VIO_PKT_MODE                    0x01
94 #define VIO_DESC_MODE                   0x02
95 #define VIO_DRING_MODE                  0x03
96 
97 struct vio_dring_hdr {
98           uint8_t             dstate;
99           uint8_t             ack: 1;
100           uint16_t  _reserved[3];
101 };
102 
103 /* Descriptor states. */
104 #define VIO_DESC_FREE                   0x01
105 #define VIO_DESC_READY                  0x02
106 #define VIO_DESC_ACCEPTED     0x03
107 #define VIO_DESC_DONE                   0x04
108 
109 struct vio_dring_msg {
110           struct vio_msg_tag  tag;
111           uint64_t            seq_no;
112           uint64_t            dring_ident;
113           uint32_t            start_idx;
114           uint32_t            end_idx;
115           uint8_t                       proc_state;
116           uint8_t                       _reserved1[7];
117           uint64_t            _reserved2[2];
118 };
119 
120 /* Ring states. */
121 #define VIO_DP_ACTIVE         0x01
122 #define VIO_DP_STOPPED        0x02
123 
124 struct vio_rdx {
125           struct vio_msg_tag  tag;
126           uint64_t            _reserved[6];
127 };
128 
129