vmbus.h revision 307459
1302876Ssephe/*-
2302876Ssephe * Copyright (c) 2016 Microsoft Corp.
3302876Ssephe * All rights reserved.
4302876Ssephe *
5302876Ssephe * Redistribution and use in source and binary forms, with or without
6302876Ssephe * modification, are permitted provided that the following conditions
7302876Ssephe * are met:
8302876Ssephe * 1. Redistributions of source code must retain the above copyright
9302876Ssephe *    notice unmodified, this list of conditions, and the following
10302876Ssephe *    disclaimer.
11302876Ssephe * 2. Redistributions in binary form must reproduce the above copyright
12302876Ssephe *    notice, this list of conditions and the following disclaimer in the
13302876Ssephe *    documentation and/or other materials provided with the distribution.
14302876Ssephe *
15302876Ssephe * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16302876Ssephe * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17302876Ssephe * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18302876Ssephe * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19302876Ssephe * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20302876Ssephe * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21302876Ssephe * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22302876Ssephe * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23302876Ssephe * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24302876Ssephe * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25302876Ssephe *
26302876Ssephe * $FreeBSD: stable/11/sys/dev/hyperv/include/vmbus.h 307459 2016-10-17 02:44:27Z sephe $
27302876Ssephe */
28302876Ssephe
29302876Ssephe#ifndef _VMBUS_H_
30302876Ssephe#define _VMBUS_H_
31302876Ssephe
32302876Ssephe#include <sys/param.h>
33302876Ssephe
34307455Ssephe/*
35307455Ssephe * GPA stuffs.
36307455Ssephe */
37307455Ssephestruct vmbus_gpa_range {
38307455Ssephe	uint32_t	gpa_len;
39307455Ssephe	uint32_t	gpa_ofs;
40307455Ssephe	uint64_t	gpa_page[0];
41307455Ssephe} __packed;
42307455Ssephe
43302876Ssephe/* This is actually vmbus_gpa_range.gpa_page[1] */
44302876Ssephestruct vmbus_gpa {
45302876Ssephe	uint32_t	gpa_len;
46302876Ssephe	uint32_t	gpa_ofs;
47302876Ssephe	uint64_t	gpa_page;
48302876Ssephe} __packed;
49302876Ssephe
50307457Ssephe#define VMBUS_CHANPKT_SIZE_SHIFT	3
51307457Ssephe
52307457Ssephe#define VMBUS_CHANPKT_GETLEN(pktlen)	\
53307457Ssephe	(((int)(pktlen)) << VMBUS_CHANPKT_SIZE_SHIFT)
54307457Ssephe
55307457Ssephestruct vmbus_chanpkt_hdr {
56307457Ssephe	uint16_t	cph_type;	/* VMBUS_CHANPKT_TYPE_ */
57307457Ssephe	uint16_t	cph_hlen;	/* header len, in 8 bytes */
58307457Ssephe	uint16_t	cph_tlen;	/* total len, in 8 bytes */
59307457Ssephe	uint16_t	cph_flags;	/* VMBUS_CHANPKT_FLAG_ */
60307457Ssephe	uint64_t	cph_xactid;
61307457Ssephe} __packed;
62307457Ssephe
63307455Ssephe#define VMBUS_CHANPKT_TYPE_INBAND	0x0006
64307455Ssephe#define VMBUS_CHANPKT_TYPE_RXBUF	0x0007
65307455Ssephe#define VMBUS_CHANPKT_TYPE_GPA		0x0009
66307455Ssephe#define VMBUS_CHANPKT_TYPE_COMP		0x000b
67302876Ssephe
68307455Ssephe#define VMBUS_CHANPKT_FLAG_RC		0x0001	/* report completion */
69307455Ssephe
70307457Ssephe#define VMBUS_CHANPKT_CONST_DATA(pkt)		\
71307457Ssephe	(const void *)((const uint8_t *)(pkt) +	\
72307457Ssephe	VMBUS_CHANPKT_GETLEN((pkt)->cph_hlen))
73307457Ssephe
74307457Ssephestruct vmbus_rxbuf_desc {
75307457Ssephe	uint32_t	rb_len;
76307457Ssephe	uint32_t	rb_ofs;
77307457Ssephe} __packed;
78307457Ssephe
79307457Ssephestruct vmbus_chanpkt_rxbuf {
80307457Ssephe	struct vmbus_chanpkt_hdr cp_hdr;
81307457Ssephe	uint16_t	cp_rxbuf_id;
82307457Ssephe	uint16_t	cp_rsvd;
83307457Ssephe	uint32_t	cp_rxbuf_cnt;
84307457Ssephe	struct vmbus_rxbuf_desc cp_rxbuf[];
85307457Ssephe} __packed;
86307457Ssephe
87307455Ssephe#define VMBUS_CHAN_SGLIST_MAX		32
88307455Ssephe#define VMBUS_CHAN_PRPLIST_MAX		32
89307455Ssephe
90302876Ssephestruct hv_vmbus_channel;
91302876Ssephe
92307459Ssepheint	vmbus_chan_open(struct hv_vmbus_channel *chan,
93307459Ssephe	    int txbr_size, int rxbr_size, const void *udata, int udlen,
94307459Ssephe	    vmbus_chan_callback_t cb, void *cbarg);
95307459Ssephevoid	vmbus_chan_close(struct hv_vmbus_channel *chan);
96307459Ssephe
97307459Ssepheint	vmbus_chan_gpadl_connect(struct hv_vmbus_channel *chan,
98307459Ssephe	    bus_addr_t paddr, int size, uint32_t *gpadl);
99307459Ssepheint	vmbus_chan_gpadl_disconnect(struct hv_vmbus_channel *chan,
100307459Ssephe	    uint32_t gpadl);
101307459Ssephe
102307459Ssephevoid	vmbus_chan_cpu_set(struct hv_vmbus_channel *chan, int cpu);
103307459Ssephevoid	vmbus_chan_cpu_rr(struct hv_vmbus_channel *chan);
104307459Ssephestruct hv_vmbus_channel *
105307459Ssephe	vmbus_chan_cpu2chan(struct hv_vmbus_channel *chan, int cpu);
106307459Ssephevoid	vmbus_chan_set_readbatch(struct hv_vmbus_channel *chan, bool on);
107307459Ssephe
108307459Ssephestruct hv_vmbus_channel **
109307459Ssephe	vmbus_subchan_get(struct hv_vmbus_channel *pri_chan, int subchan_cnt);
110307459Ssephevoid	vmbus_subchan_rel(struct hv_vmbus_channel **subchan, int subchan_cnt);
111307459Ssephevoid	vmbus_subchan_drain(struct hv_vmbus_channel *pri_chan);
112307459Ssephe
113307457Ssepheint	vmbus_chan_recv(struct hv_vmbus_channel *chan, void *data, int *dlen,
114307457Ssephe	    uint64_t *xactid);
115307457Ssepheint	vmbus_chan_recv_pkt(struct hv_vmbus_channel *chan,
116307457Ssephe	    struct vmbus_chanpkt_hdr *pkt, int *pktlen);
117307457Ssephe
118307456Ssepheint	vmbus_chan_send(struct hv_vmbus_channel *chan, uint16_t type,
119307456Ssephe	    uint16_t flags, void *data, int dlen, uint64_t xactid);
120302876Ssepheint	vmbus_chan_send_sglist(struct hv_vmbus_channel *chan,
121302876Ssephe	    struct vmbus_gpa sg[], int sglen, void *data, int dlen,
122302876Ssephe	    uint64_t xactid);
123307455Ssepheint	vmbus_chan_send_prplist(struct hv_vmbus_channel *chan,
124307455Ssephe	    struct vmbus_gpa_range *prp, int prp_cnt, void *data, int dlen,
125307455Ssephe	    uint64_t xactid);
126302876Ssephe
127302876Ssephe#endif	/* !_VMBUS_H_ */
128