hyperv/vmbus: Move channel offer message definition to vmbus_reg.h
- Avoid bit fields. - Avoid unnecessary indirection. MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7093
This commit is contained in:
@@ -42,7 +42,7 @@ typedef void (*vmbus_chanmsg_proc_t)
|
||||
|
||||
static struct hv_vmbus_channel *hv_vmbus_allocate_channel(struct vmbus_softc *);
|
||||
static void vmbus_channel_on_offer_internal(struct vmbus_softc *,
|
||||
const hv_vmbus_channel_offer_channel *offer);
|
||||
const struct vmbus_chanmsg_choffer *);
|
||||
static void vmbus_chan_detach_task(void *, int);
|
||||
|
||||
static void vmbus_channel_on_offer(struct vmbus_softc *,
|
||||
@@ -267,18 +267,16 @@ vmbus_channel_select_defcpu(struct hv_vmbus_channel *chan)
|
||||
static void
|
||||
vmbus_channel_on_offer(struct vmbus_softc *sc, const struct vmbus_message *msg)
|
||||
{
|
||||
const hv_vmbus_channel_offer_channel *offer;
|
||||
|
||||
/* New channel is offered by vmbus */
|
||||
vmbus_scan_newchan(sc);
|
||||
|
||||
offer = (const hv_vmbus_channel_offer_channel *)msg->msg_data;
|
||||
vmbus_channel_on_offer_internal(sc, offer);
|
||||
vmbus_channel_on_offer_internal(sc,
|
||||
(const struct vmbus_chanmsg_choffer *)msg->msg_data);
|
||||
}
|
||||
|
||||
static void
|
||||
vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
|
||||
const hv_vmbus_channel_offer_channel *offer)
|
||||
const struct vmbus_chanmsg_choffer *offer)
|
||||
{
|
||||
hv_vmbus_channel* new_channel;
|
||||
|
||||
@@ -286,14 +284,14 @@ vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
|
||||
* Allocate the channel object and save this offer
|
||||
*/
|
||||
new_channel = hv_vmbus_allocate_channel(sc);
|
||||
new_channel->ch_id = offer->child_rel_id;
|
||||
new_channel->ch_subidx = offer->offer.sub_channel_index;
|
||||
new_channel->ch_guid_type = offer->offer.interface_type;
|
||||
new_channel->ch_guid_inst = offer->offer.interface_instance;
|
||||
new_channel->ch_id = offer->chm_chanid;
|
||||
new_channel->ch_subidx = offer->chm_subidx;
|
||||
new_channel->ch_guid_type = offer->chm_chtype;
|
||||
new_channel->ch_guid_inst = offer->chm_chinst;
|
||||
|
||||
/* Batch reading is on by default */
|
||||
new_channel->ch_flags |= VMBUS_CHAN_FLAG_BATCHREAD;
|
||||
if (offer->monitor_allocated)
|
||||
if (offer->chm_flags1 & VMBUS_CHOFFER_FLAG1_HASMNF)
|
||||
new_channel->ch_flags |= VMBUS_CHAN_FLAG_HASMNF;
|
||||
|
||||
new_channel->ch_monprm = hyperv_dmamem_alloc(
|
||||
@@ -309,15 +307,15 @@ vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
|
||||
}
|
||||
new_channel->ch_monprm->mp_connid = VMBUS_CONNID_EVENT;
|
||||
if (sc->vmbus_version != VMBUS_VERSION_WS2008)
|
||||
new_channel->ch_monprm->mp_connid = offer->connection_id;
|
||||
new_channel->ch_monprm->mp_connid = offer->chm_connid;
|
||||
|
||||
if (new_channel->ch_flags & VMBUS_CHAN_FLAG_HASMNF) {
|
||||
new_channel->ch_montrig_idx =
|
||||
offer->monitor_id / VMBUS_MONTRIG_LEN;
|
||||
offer->chm_montrig / VMBUS_MONTRIG_LEN;
|
||||
if (new_channel->ch_montrig_idx >= VMBUS_MONTRIGS_MAX)
|
||||
panic("invalid monitor id %u", offer->monitor_id);
|
||||
panic("invalid monitor trigger %u", offer->chm_montrig);
|
||||
new_channel->ch_montrig_mask =
|
||||
1 << (offer->monitor_id % VMBUS_MONTRIG_LEN);
|
||||
1 << (offer->chm_montrig % VMBUS_MONTRIG_LEN);
|
||||
}
|
||||
|
||||
/* Select default cpu for this channel. */
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <dev/hyperv/vmbus/hyperv_reg.h>
|
||||
#include <dev/hyperv/include/hyperv.h> /* XXX for hyperv_guid */
|
||||
|
||||
/*
|
||||
* Hyper-V SynIC message format.
|
||||
@@ -121,6 +122,7 @@ struct vmbus_gpa_range {
|
||||
* - Embedded in hypercall_postmsg_in.hc_data, e.g. request.
|
||||
*/
|
||||
|
||||
#define VMBUS_CHANMSG_TYPE_CHOFFER 1 /* NOTE */
|
||||
#define VMBUS_CHANMSG_TYPE_CHRESCIND 2 /* NOTE */
|
||||
#define VMBUS_CHANMSG_TYPE_CHREQUEST 3 /* REQ */
|
||||
#define VMBUS_CHANMSG_TYPE_CHOPEN 5 /* REQ */
|
||||
@@ -248,4 +250,27 @@ struct vmbus_chanmsg_chrescind {
|
||||
uint32_t chm_chanid;
|
||||
} __packed;
|
||||
|
||||
/* VMBUS_CHANMSG_TYPE_CHOFFER */
|
||||
struct vmbus_chanmsg_choffer {
|
||||
struct vmbus_chanmsg_hdr chm_hdr;
|
||||
struct hyperv_guid chm_chtype;
|
||||
struct hyperv_guid chm_chinst;
|
||||
uint64_t chm_chlat; /* unit: 100ns */
|
||||
uint32_t chm_chrev;
|
||||
uint32_t chm_svrctx_sz;
|
||||
uint16_t chm_chflags;
|
||||
uint16_t chm_mmio_sz; /* unit: MB */
|
||||
uint8_t chm_udata[120];
|
||||
uint16_t chm_subidx;
|
||||
uint16_t chm_rsvd;
|
||||
uint32_t chm_chanid;
|
||||
uint8_t chm_montrig;
|
||||
uint8_t chm_flags1; /* VMBUS_CHOFFER_FLAG1_ */
|
||||
uint16_t chm_flags2;
|
||||
uint32_t chm_connid;
|
||||
} __packed;
|
||||
CTASSERT(sizeof(struct vmbus_chanmsg_choffer) <= VMBUS_MSG_DSIZE_MAX);
|
||||
|
||||
#define VMBUS_CHOFFER_FLAG1_HASMNF 0x01
|
||||
|
||||
#endif /* !_VMBUS_REG_H_ */
|
||||
|
||||
Reference in New Issue
Block a user