]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/dev/hyperv/vmbus/vmbus_chanvar.h
MFC 306360,306387,306389
[FreeBSD/stable/10.git] / sys / dev / hyperv / vmbus / vmbus_chanvar.h
1 /*-
2  * Copyright (c) 2016 Microsoft Corp.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice unmodified, this list of conditions, and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef _VMBUS_CHANVAR_H_
30 #define _VMBUS_CHANVAR_H_
31
32 #include <sys/param.h>
33 #include <sys/lock.h>
34 #include <sys/mutex.h>
35 #include <sys/queue.h>
36 #include <sys/taskqueue.h>
37 #include <sys/sysctl.h>
38
39 #include <dev/hyperv/include/hyperv.h>
40 #include <dev/hyperv/include/hyperv_busdma.h>
41 #include <dev/hyperv/include/vmbus.h>
42 #include <dev/hyperv/vmbus/vmbus_brvar.h>
43
44 struct vmbus_channel {
45         /*
46          * NOTE:
47          * Fields before ch_txbr are only accessed on this channel's
48          * target CPU.
49          */
50         uint32_t                        ch_flags;       /* VMBUS_CHAN_FLAG_ */
51
52         /*
53          * RX bufring; immediately following ch_txbr.
54          */
55         struct vmbus_rxbr               ch_rxbr;
56
57         struct taskqueue                *ch_tq;
58         struct task                     ch_task;
59         vmbus_chan_callback_t           ch_cb;
60         void                            *ch_cbarg;
61
62         /*
63          * TX bufring; at the beginning of ch_bufring.
64          *
65          * NOTE:
66          * Put TX bufring and the following MNF/evtflag to a new
67          * cacheline, since they will be accessed on all CPUs by
68          * locking ch_txbr first.
69          *
70          * XXX
71          * TX bufring and following MNF/evtflags do _not_ fit in
72          * one 64B cacheline.
73          */
74         struct vmbus_txbr               ch_txbr __aligned(CACHE_LINE_SIZE);
75         uint32_t                        ch_txflags;     /* VMBUS_CHAN_TXF_ */
76
77         /*
78          * These are based on the vmbus_chanmsg_choffer.chm_montrig.
79          * Save it here for easy access.
80          */
81         uint32_t                        ch_montrig_mask;/* MNF trig mask */
82         volatile uint32_t               *ch_montrig;    /* MNF trigger loc. */
83
84         /*
85          * These are based on the vmbus_chanmsg_choffer.chm_chanid.
86          * Save it here for easy access.
87          */
88         u_long                          ch_evtflag_mask;/* event flag */
89         volatile u_long                 *ch_evtflag;    /* event flag loc. */
90
91         /*
92          * Rarely used fields.
93          */
94
95         struct hyperv_mon_param         *ch_monprm;
96         struct hyperv_dma               ch_monprm_dma;
97
98         uint32_t                        ch_id;          /* channel id */
99         device_t                        ch_dev;
100         struct vmbus_softc              *ch_vmbus;
101
102         int                             ch_cpuid;       /* owner cpu */
103         /*
104          * Virtual cpuid for ch_cpuid; it is used to communicate cpuid
105          * related information w/ Hyper-V.  If MSR_HV_VP_INDEX does not
106          * exist, ch_vcpuid will always be 0 for compatibility.
107          */
108         uint32_t                        ch_vcpuid;
109
110         /*
111          * If this is a primary channel, ch_subchan* fields
112          * contain sub-channels belonging to this primary
113          * channel.
114          */
115         struct mtx                      ch_subchan_lock;
116         TAILQ_HEAD(, vmbus_channel)     ch_subchans;
117         int                             ch_subchan_cnt;
118
119         /* If this is a sub-channel */
120         TAILQ_ENTRY(vmbus_channel)      ch_sublink;     /* sub-channel link */
121         struct vmbus_channel            *ch_prichan;    /* owner primary chan */
122
123         void                            *ch_bufring;    /* TX+RX bufrings */
124         struct hyperv_dma               ch_bufring_dma;
125         uint32_t                        ch_bufring_gpadl;
126
127         struct task                     ch_attach_task; /* run in ch_mgmt_tq */
128         struct task                     ch_detach_task; /* run in ch_mgmt_tq */
129         struct taskqueue                *ch_mgmt_tq;
130
131         /* If this is a primary channel */
132         TAILQ_ENTRY(vmbus_channel)      ch_prilink;     /* primary chan link */
133
134         TAILQ_ENTRY(vmbus_channel)      ch_link;        /* channel link */
135         uint32_t                        ch_subidx;      /* subchan index */
136         volatile uint32_t               ch_stflags;     /* atomic-op */
137                                                         /* VMBUS_CHAN_ST_ */
138         struct hyperv_guid              ch_guid_type;
139         struct hyperv_guid              ch_guid_inst;
140
141         struct sysctl_ctx_list          ch_sysctl_ctx;
142 } __aligned(CACHE_LINE_SIZE);
143
144 #define VMBUS_CHAN_ISPRIMARY(chan)      ((chan)->ch_subidx == 0)
145
146 /*
147  * If this flag is set, this channel's interrupt will be masked in ISR,
148  * and the RX bufring will be drained before this channel's interrupt is
149  * unmasked.
150  *
151  * This flag is turned on by default.  Drivers can turn it off according
152  * to their own requirement.
153  */
154 #define VMBUS_CHAN_FLAG_BATCHREAD       0x0002
155
156 #define VMBUS_CHAN_TXF_HASMNF           0x0001
157
158 #define VMBUS_CHAN_ST_OPENED_SHIFT      0
159 #define VMBUS_CHAN_ST_ONPRIL_SHIFT      1
160 #define VMBUS_CHAN_ST_ONSUBL_SHIFT      2
161 #define VMBUS_CHAN_ST_ONLIST_SHIFT      3
162 #define VMBUS_CHAN_ST_OPENED            (1 << VMBUS_CHAN_ST_OPENED_SHIFT)
163 #define VMBUS_CHAN_ST_ONPRIL            (1 << VMBUS_CHAN_ST_ONPRIL_SHIFT)
164 #define VMBUS_CHAN_ST_ONSUBL            (1 << VMBUS_CHAN_ST_ONSUBL_SHIFT)
165 #define VMBUS_CHAN_ST_ONLIST            (1 << VMBUS_CHAN_ST_ONLIST_SHIFT)
166
167 struct vmbus_softc;
168 struct vmbus_message;
169
170 void            vmbus_event_proc(struct vmbus_softc *, int);
171 void            vmbus_event_proc_compat(struct vmbus_softc *, int);
172 void            vmbus_chan_msgproc(struct vmbus_softc *,
173                     const struct vmbus_message *);
174 void            vmbus_chan_destroy_all(struct vmbus_softc *);
175
176 #endif  /* !_VMBUS_CHANVAR_H_ */