]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/dpdk/drivers/bus/vmbus/private.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / spdk / dpdk / drivers / bus / vmbus / private.h
CommitLineData
11fdf7f2
TL
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>
9f95a23c 13#include <rte_bus_vmbus.h>
11fdf7f2
TL
14
15#ifndef PAGE_SIZE
16#define PAGE_SIZE 4096
17#endif
18
9f95a23c
TL
19extern struct rte_vmbus_bus rte_vmbus_bus;
20
11fdf7f2
TL
21extern 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
26struct 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
34struct 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 */
43struct mapped_vmbus_resource {
44 TAILQ_ENTRY(mapped_vmbus_resource) next;
45
46 rte_uuid_t id;
47 int nb_maps;
9f95a23c 48 struct vmbus_channel *primary;
11fdf7f2
TL
49 struct vmbus_map maps[VMBUS_MAX_RESOURCE];
50 char path[PATH_MAX];
51};
52
53TAILQ_HEAD(mapped_vmbus_res_list, mapped_vmbus_resource);
54
55#define HV_MON_TRIG_LEN 32
56#define HV_MON_TRIG_MAX 4
57
58struct vmbus_channel {
59 STAILQ_HEAD(, vmbus_channel) subchannel_list;
60 STAILQ_ENTRY(vmbus_channel) next;
61 const struct rte_vmbus_device *device;
62
63 struct vmbus_br rxbr;
64 struct vmbus_br txbr;
65
66 uint16_t relid;
67 uint16_t subchannel_id;
68 uint8_t monitor_id;
69};
70
71#define VMBUS_MAX_CHANNELS 64
72
9f95a23c
TL
73struct rte_devargs *
74vmbus_devargs_lookup(struct rte_vmbus_device *dev);
75
11fdf7f2
TL
76int 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);
79
80void vmbus_add_device(struct rte_vmbus_device *vmbus_dev);
81void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev,
82 struct rte_vmbus_device *new_vmbus_dev);
83void vmbus_remove_device(struct rte_vmbus_device *vmbus_device);
84
85void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff);
86int vmbus_uio_irq_read(struct rte_vmbus_device *dev);
87
88int vmbus_uio_map_resource(struct rte_vmbus_device *dev);
89void vmbus_uio_unmap_resource(struct rte_vmbus_device *dev);
90
91int vmbus_uio_alloc_resource(struct rte_vmbus_device *dev,
92 struct mapped_vmbus_resource **uio_res);
93void vmbus_uio_free_resource(struct rte_vmbus_device *dev,
94 struct mapped_vmbus_resource *uio_res);
95
96struct mapped_vmbus_resource *
97vmbus_uio_find_resource(const struct rte_vmbus_device *dev);
98int vmbus_uio_map_resource_by_index(struct rte_vmbus_device *dev, int res_idx,
99 struct mapped_vmbus_resource *uio_res,
100 int flags);
101
102void *vmbus_map_resource(void *requested_addr, int fd, off_t offset,
103 size_t size, int additional_flags);
104void vmbus_unmap_resource(void *requested_addr, size_t size);
105
106bool vmbus_uio_subchannels_supported(const struct rte_vmbus_device *dev,
107 const struct vmbus_channel *chan);
108int vmbus_uio_get_subchan(struct vmbus_channel *primary,
109 struct vmbus_channel **subchan);
110int vmbus_uio_map_rings(struct vmbus_channel *chan);
9f95a23c
TL
111int vmbus_uio_map_secondary_subchan(const struct rte_vmbus_device *dev,
112 const struct vmbus_channel *chan);
11fdf7f2
TL
113
114void vmbus_br_setup(struct vmbus_br *br, void *buf, unsigned int blen);
115
116/* Amount of space available for write */
117static inline uint32_t
118vmbus_br_availwrite(const struct vmbus_br *br, uint32_t windex)
119{
120 uint32_t rindex = br->vbr->rindex;
121
122 if (windex >= rindex)
123 return br->dsize - (windex - rindex);
124 else
125 return rindex - windex;
126}
127
128static inline uint32_t
129vmbus_br_availread(const struct vmbus_br *br)
130{
131 return br->dsize - vmbus_br_availwrite(br, br->vbr->windex);
132}
133
134int vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
135 bool *need_sig);
136
137int vmbus_rxbr_peek(const struct vmbus_br *rbr, void *data, size_t dlen);
138
139int vmbus_rxbr_read(struct vmbus_br *rbr, void *data, size_t dlen, size_t hlen);
140
141#endif /* _VMBUS_PRIVATE_H_ */