1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2018, Microsoft Corporation.
6 #ifndef _VMBUS_PRIVATE_H_
7 #define _VMBUS_PRIVATE_H_
12 #include <rte_vmbus_reg.h>
13 #include <rte_bus_vmbus.h>
16 #define PAGE_SIZE 4096
19 extern struct rte_vmbus_bus rte_vmbus_bus
;
21 extern int vmbus_logtype_bus
;
22 #define VMBUS_LOG(level, fmt, args...) \
23 rte_log(RTE_LOG_ ## level, vmbus_logtype_bus, "%s(): " fmt "\n", \
27 struct vmbus_bufring
*vbr
;
29 uint32_t windex
; /* next available location */
32 #define UIO_NAME_MAX 64
35 void *addr
; /* user mmap of resource */
36 uint64_t size
; /* length */
40 * For multi-process we need to reproduce all vmbus mappings in secondary
41 * processes, so save them in a tailq.
43 struct mapped_vmbus_resource
{
44 TAILQ_ENTRY(mapped_vmbus_resource
) next
;
48 struct vmbus_channel
*primary
;
49 struct vmbus_map maps
[VMBUS_MAX_RESOURCE
];
53 TAILQ_HEAD(mapped_vmbus_res_list
, mapped_vmbus_resource
);
55 #define HV_MON_TRIG_LEN 32
56 #define HV_MON_TRIG_MAX 4
58 struct vmbus_channel
{
59 STAILQ_HEAD(, vmbus_channel
) subchannel_list
;
60 STAILQ_ENTRY(vmbus_channel
) next
;
61 const struct rte_vmbus_device
*device
;
67 uint16_t subchannel_id
;
71 #define VMBUS_MAX_CHANNELS 64
74 vmbus_devargs_lookup(struct rte_vmbus_device
*dev
);
76 int vmbus_chan_create(const struct rte_vmbus_device
*device
,
77 uint16_t relid
, uint16_t subid
, uint8_t monitor_id
,
78 struct vmbus_channel
**new_chan
);
80 void vmbus_add_device(struct rte_vmbus_device
*vmbus_dev
);
81 void vmbus_insert_device(struct rte_vmbus_device
*exist_vmbus_dev
,
82 struct rte_vmbus_device
*new_vmbus_dev
);
83 void vmbus_remove_device(struct rte_vmbus_device
*vmbus_device
);
85 void vmbus_uio_irq_control(struct rte_vmbus_device
*dev
, int32_t onoff
);
86 int vmbus_uio_irq_read(struct rte_vmbus_device
*dev
);
88 int vmbus_uio_map_resource(struct rte_vmbus_device
*dev
);
89 void vmbus_uio_unmap_resource(struct rte_vmbus_device
*dev
);
91 int vmbus_uio_alloc_resource(struct rte_vmbus_device
*dev
,
92 struct mapped_vmbus_resource
**uio_res
);
93 void vmbus_uio_free_resource(struct rte_vmbus_device
*dev
,
94 struct mapped_vmbus_resource
*uio_res
);
96 struct mapped_vmbus_resource
*
97 vmbus_uio_find_resource(const struct rte_vmbus_device
*dev
);
98 int vmbus_uio_map_resource_by_index(struct rte_vmbus_device
*dev
, int res_idx
,
99 struct mapped_vmbus_resource
*uio_res
,
102 void *vmbus_map_resource(void *requested_addr
, int fd
, off_t offset
,
103 size_t size
, int additional_flags
);
104 void vmbus_unmap_resource(void *requested_addr
, size_t size
);
106 bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device
*dev
,
107 const struct vmbus_channel
*chan
);
108 int vmbus_uio_get_subchan(struct vmbus_channel
*primary
,
109 struct vmbus_channel
**subchan
);
110 int vmbus_uio_map_rings(struct vmbus_channel
*chan
);
111 int vmbus_uio_map_secondary_subchan(const struct rte_vmbus_device
*dev
,
112 const struct vmbus_channel
*chan
);
114 void vmbus_br_setup(struct vmbus_br
*br
, void *buf
, unsigned int blen
);
116 /* Amount of space available for write */
117 static inline uint32_t
118 vmbus_br_availwrite(const struct vmbus_br
*br
, uint32_t windex
)
120 uint32_t rindex
= br
->vbr
->rindex
;
122 if (windex
>= rindex
)
123 return br
->dsize
- (windex
- rindex
);
125 return rindex
- windex
;
128 static inline uint32_t
129 vmbus_br_availread(const struct vmbus_br
*br
)
131 return br
->dsize
- vmbus_br_availwrite(br
, br
->vbr
->windex
);
134 int vmbus_txbr_write(struct vmbus_br
*tbr
, const struct iovec iov
[], int iovlen
,
137 int vmbus_rxbr_peek(const struct vmbus_br
*rbr
, void *data
, size_t dlen
);
139 int vmbus_rxbr_read(struct vmbus_br
*rbr
, void *data
, size_t dlen
, size_t hlen
);
141 #endif /* _VMBUS_PRIVATE_H_ */