New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / bus / vmbus / private.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2018, Microsoft Corporation.
3  * All Rights Reserved.
4  */
5
6 #ifndef _VMBUS_PRIVATE_H_
7 #define _VMBUS_PRIVATE_H_
8
9 #include <stdbool.h>
10 #include <sys/uio.h>
11 #include <rte_log.h>
12 #include <rte_vmbus_reg.h>
13 #include <rte_bus_vmbus.h>
14
15 #ifndef PAGE_SIZE
16 #define PAGE_SIZE       4096
17 #endif
18
19 extern struct rte_vmbus_bus rte_vmbus_bus;
20
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", \
24                 __func__, ##args)
25
26 struct vmbus_br {
27         struct vmbus_bufring *vbr;
28         uint32_t        dsize;
29         uint32_t        windex; /* next available location */
30 };
31
32 #define UIO_NAME_MAX 64
33
34 struct vmbus_map {
35         void *addr;     /* user mmap of resource */
36         uint64_t size;  /* length */
37 };
38
39 /*
40  * For multi-process we need to reproduce all vmbus mappings in secondary
41  * processes, so save them in a tailq.
42  */
43 struct mapped_vmbus_resource {
44         TAILQ_ENTRY(mapped_vmbus_resource) next;
45
46         rte_uuid_t id;
47         int nb_maps;
48         struct vmbus_map maps[VMBUS_MAX_RESOURCE];
49         char path[PATH_MAX];
50 };
51
52 TAILQ_HEAD(mapped_vmbus_res_list, mapped_vmbus_resource);
53
54 #define HV_MON_TRIG_LEN 32
55 #define HV_MON_TRIG_MAX 4
56
57 struct vmbus_channel {
58         STAILQ_HEAD(, vmbus_channel) subchannel_list;
59         STAILQ_ENTRY(vmbus_channel) next;
60         const struct rte_vmbus_device *device;
61
62         struct vmbus_br rxbr;
63         struct vmbus_br txbr;
64
65         uint16_t relid;
66         uint16_t subchannel_id;
67         uint8_t monitor_id;
68 };
69
70 #define VMBUS_MAX_CHANNELS      64
71
72 struct rte_devargs *
73 vmbus_devargs_lookup(struct rte_vmbus_device *dev);
74
75 int vmbus_chan_create(const struct rte_vmbus_device *device,
76                       uint16_t relid, uint16_t subid, uint8_t monitor_id,
77                       struct vmbus_channel **new_chan);
78
79 void vmbus_add_device(struct rte_vmbus_device *vmbus_dev);
80 void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev,
81                          struct rte_vmbus_device *new_vmbus_dev);
82 void vmbus_remove_device(struct rte_vmbus_device *vmbus_device);
83
84 void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff);
85 int vmbus_uio_irq_read(struct rte_vmbus_device *dev);
86
87 int vmbus_uio_map_resource(struct rte_vmbus_device *dev);
88 void vmbus_uio_unmap_resource(struct rte_vmbus_device *dev);
89
90 int vmbus_uio_alloc_resource(struct rte_vmbus_device *dev,
91                 struct mapped_vmbus_resource **uio_res);
92 void vmbus_uio_free_resource(struct rte_vmbus_device *dev,
93                 struct mapped_vmbus_resource *uio_res);
94
95 struct mapped_vmbus_resource *
96 vmbus_uio_find_resource(const struct rte_vmbus_device *dev);
97 int vmbus_uio_map_resource_by_index(struct rte_vmbus_device *dev, int res_idx,
98                                     struct mapped_vmbus_resource *uio_res,
99                                     int flags);
100
101 void *vmbus_map_resource(void *requested_addr, int fd, off_t offset,
102                 size_t size, int additional_flags);
103 void vmbus_unmap_resource(void *requested_addr, size_t size);
104
105 bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev,
106                                      const struct vmbus_channel *chan);
107 int vmbus_uio_get_subchan(struct vmbus_channel *primary,
108                           struct vmbus_channel **subchan);
109 int vmbus_uio_map_rings(struct vmbus_channel *chan);
110
111 void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen);
112
113 /* Amount of space available for write */
114 static inline uint32_t
115 vmbus_br_availwrite(const struct vmbus_br *br, uint32_t windex)
116 {
117         uint32_t rindex = br->vbr->rindex;
118
119         if (windex >= rindex)
120                 return br->dsize - (windex - rindex);
121         else
122                 return rindex - windex;
123 }
124
125 static inline uint32_t
126 vmbus_br_availread(const struct vmbus_br *br)
127 {
128         return br->dsize - vmbus_br_availwrite(br, br->vbr->windex);
129 }
130
131 int vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
132                      bool *need_sig);
133
134 int vmbus_rxbr_peek(const struct vmbus_br *rbr, void *data, size_t dlen);
135
136 int vmbus_rxbr_read(struct vmbus_br *rbr, void *data, size_t dlen, size_t hlen);
137
138 #endif /* _VMBUS_PRIVATE_H_ */