dpdk/drivers/bus/vmbus/rte_bus_vmbus.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright (c) 2018, Microsoft Corporation.
   3 * All Rights Reserved.
   4 */
   5
   6#ifndef _VMBUS_H_
   7#define _VMBUS_H_
   8
   9/**
  10 * @file
  11 *
  12 * VMBUS Interface
  13 */
  14#ifdef __cplusplus
  15extern "C" {
  16#endif
  17
  18#include <stdio.h>
  19#include <stdlib.h>
  20#include <limits.h>
  21#include <stdbool.h>
  22#include <errno.h>
  23#include <sys/queue.h>
  24#include <stdint.h>
  25#include <inttypes.h>
  26
  27#include <rte_compat.h>
  28#include <rte_uuid.h>
  29#include <rte_debug.h>
  30#include <rte_interrupts.h>
  31#include <rte_dev.h>
  32#include <rte_vmbus_reg.h>
  33
  34/* Forward declarations */
  35struct rte_vmbus_device;
  36struct rte_vmbus_driver;
  37struct rte_vmbus_bus;
  38struct vmbus_channel;
  39struct vmbus_mon_page;
  40
  41TAILQ_HEAD(rte_vmbus_device_list, rte_vmbus_device);
  42TAILQ_HEAD(rte_vmbus_driver_list, rte_vmbus_driver);
  43
  44/* VMBus iterators */
  45#define FOREACH_DEVICE_ON_VMBUS(p)      \
  46        TAILQ_FOREACH(p, &(rte_vmbus_bus.device_list), next)
  47
  48#define FOREACH_DRIVER_ON_VMBUS(p)      \
  49        TAILQ_FOREACH(p, &(rte_vmbus_bus.driver_list), next)
  50
  51/** Maximum number of VMBUS resources. */
  52enum hv_uio_map {
  53        HV_TXRX_RING_MAP = 0,
  54        HV_INT_PAGE_MAP,
  55        HV_MON_PAGE_MAP,
  56        HV_RECV_BUF_MAP,
  57        HV_SEND_BUF_MAP
  58};
  59#define VMBUS_MAX_RESOURCE 5
  60
  61/**
  62 * A structure describing a VMBUS device.
  63 */
  64struct rte_vmbus_device {
  65        TAILQ_ENTRY(rte_vmbus_device) next;    /**< Next probed VMBUS device */
  66        const struct rte_vmbus_driver *driver; /**< Associated driver */
  67        struct rte_device device;              /**< Inherit core device */
  68        rte_uuid_t device_id;                  /**< VMBUS device id */
  69        rte_uuid_t class_id;                   /**< VMBUS device type */
  70        uint32_t relid;                        /**< id for primary */
  71        uint8_t monitor_id;                    /**< monitor page */
  72        int uio_num;                           /**< UIO device number */
  73        uint32_t *int_page;                    /**< VMBUS interrupt page */
  74        struct vmbus_channel *primary;         /**< VMBUS primary channel */
  75        struct vmbus_mon_page *monitor_page;   /**< VMBUS monitor page */
  76
  77        struct rte_intr_handle intr_handle;    /**< Interrupt handle */
  78        struct rte_mem_resource resource[VMBUS_MAX_RESOURCE];
  79};
  80
  81/**
  82 * Initialization function for the driver called during VMBUS probing.
  83 */
  84typedef int (vmbus_probe_t)(struct rte_vmbus_driver *,
  85                            struct rte_vmbus_device *);
  86
  87/**
  88 * Initialization function for the driver called during hot plugging.
  89 */
  90typedef int (vmbus_remove_t)(struct rte_vmbus_device *);
  91
  92/**
  93 * A structure describing a VMBUS driver.
  94 */
  95struct rte_vmbus_driver {
  96        TAILQ_ENTRY(rte_vmbus_driver) next; /**< Next in list. */
  97        struct rte_driver driver;
  98        struct rte_vmbus_bus *bus;          /**< VM bus reference. */
  99        vmbus_probe_t *probe;               /**< Device Probe function. */
 100        vmbus_remove_t *remove;             /**< Device Remove function. */
 101
 102        const rte_uuid_t *id_table;         /**< ID table. */
 103};
 104
 105
 106/**
 107 * Structure describing the VM bus
 108 */
 109struct rte_vmbus_bus {
 110        struct rte_bus bus;               /**< Inherit the generic class */
 111        struct rte_vmbus_device_list device_list;  /**< List of devices */
 112        struct rte_vmbus_driver_list driver_list;  /**< List of drivers */
 113};
 114
 115/**
 116 * Scan the content of the VMBUS bus, and the devices in the devices
 117 * list
 118 *
 119 * @return
 120 *  0 on success, negative on error
 121 */
 122int rte_vmbus_scan(void);
 123
 124/**
 125 * Probe the VMBUS bus
 126 *
 127 * @return
 128 *   - 0 on success.
 129 *   - !0 on error.
 130 */
 131int rte_vmbus_probe(void);
 132
 133/**
 134 * Map the VMBUS device resources in user space virtual memory address
 135 *
 136 * @param dev
 137 *   A pointer to a rte_vmbus_device structure describing the device
 138 *   to use
 139 *
 140 * @return
 141 *   0 on success, negative on error and positive if no driver
 142 *   is found for the device.
 143 */
 144int rte_vmbus_map_device(struct rte_vmbus_device *dev);
 145
 146/**
 147 * Unmap this device
 148 *
 149 * @param dev
 150 *   A pointer to a rte_vmbus_device structure describing the device
 151 *   to use
 152 */
 153void rte_vmbus_unmap_device(struct rte_vmbus_device *dev);
 154
 155/**
 156 * Get connection to primary VMBUS channel
 157 *
 158 * @param device
 159 *   A pointer to a rte_vmbus_device structure describing the device
 160 * @param chan
 161 *   A pointer to a VMBUS channel pointer that will be filled.
 162 * @return
 163 *   - 0 Success; channel opened.
 164 *   - -ENOMEM: Not enough memory available.
 165 *   - -EINVAL: Regions could not be mapped.
 166 */
 167int rte_vmbus_chan_open(struct rte_vmbus_device *device,
 168                        struct vmbus_channel **chan);
 169
 170/**
 171 * Free connection to VMBUS channel
 172 *
 173 * @param chan
 174 *    VMBUS channel
 175 */
 176void rte_vmbus_chan_close(struct vmbus_channel *chan);
 177
 178/**
 179 * Gets the maximum number of channels supported on device
 180 *
 181 * @param device
 182 *   A pointer to a rte_vmbus_device structure describing the device
 183 * @return
 184 *   Number of channels available.
 185 */
 186int rte_vmbus_max_channels(const struct rte_vmbus_device *device);
 187
 188/**
 189 * Get a connection to new secondary vmbus channel
 190 *
 191 * @param primary
 192 *   A pointer to primary VMBUS channel
 193 * @param chan
 194 *   A pointer to a secondary VMBUS channel pointer that will be filled.
 195 * @return
 196 *   - 0 Success; channel opened.
 197 *   - -ENOMEM: Not enough memory available.
 198 *   - -EINVAL: Regions could not be mapped.
 199 */
 200int rte_vmbus_subchan_open(struct vmbus_channel *primary,
 201                           struct vmbus_channel **new_chan);
 202
 203/**
 204 * Disable IRQ for device
 205 *
 206 * @param device
 207 *    VMBUS device
 208 */
 209void rte_vmbus_irq_mask(struct rte_vmbus_device *device);
 210
 211/**
 212 * Enable IRQ for device
 213 *
 214 * @param device
 215 *    VMBUS device
 216 */
 217void rte_vmbus_irq_unmask(struct rte_vmbus_device *device);
 218
 219/**
 220 * Read (and wait) for IRQ
 221 *
 222 * @param device
 223 *    VMBUS device
 224 */
 225int rte_vmbus_irq_read(struct rte_vmbus_device *device);
 226
 227/**
 228 * Test if channel is empty
 229 *
 230 * @param channel
 231 *      Pointer to vmbus_channel structure.
 232 * @return
 233 *      Return true if no data present in incoming ring.
 234 */
 235bool rte_vmbus_chan_rx_empty(const struct vmbus_channel *channel);
 236
 237/**
 238 * Send the specified buffer on the given channel
 239 *
 240 * @param channel
 241 *      Pointer to vmbus_channel structure.
 242 * @param type
 243 *      Type of packet that is being send e.g. negotiate, time
 244 *      packet etc.
 245 * @param data
 246 *      Pointer to the buffer to send
 247 * @param dlen
 248 *      Number of bytes of data to send
 249 * @param xact
 250 *      Identifier of the request
 251 * @param flags
 252 *      Message type inband, rxbuf, gpa
 253 * @param need_sig
 254 *      Is host signal tx is required (optional)
 255 *
 256 * Sends data in buffer directly to hyper-v via the vmbus
 257 */
 258int rte_vmbus_chan_send(struct vmbus_channel *channel, uint16_t type,
 259                        void *data, uint32_t dlen,
 260                        uint64_t xact, uint32_t flags, bool *need_sig);
 261
 262/**
 263 * Explicitly signal host that data is available
 264 *
 265 * @param
 266 *      Pointer to vmbus_channel structure.
 267 *
 268 * Used when batching multiple sends and only signaling host
 269 * after the last send.
 270 */
 271void rte_vmbus_chan_signal_tx(const struct vmbus_channel *channel);
 272
 273/* Structure for scatter/gather I/O */
 274struct iova_list {
 275        rte_iova_t      addr;
 276        uint32_t        len;
 277};
 278#define MAX_PAGE_BUFFER_COUNT           32
 279
 280/**
 281 * Send a scattered buffer on the given channel
 282 *
 283 * @param channel
 284 *      Pointer to vmbus_channel structure.
 285 * @param type
 286 *      Type of packet that is being send e.g. negotiate, time
 287 *      packet etc.
 288 * @param gpa
 289 *      Array of buffers to send
 290 * @param gpacnt
 291 *      Number of elements in iov
 292 * @param data
 293 *      Pointer to the buffer additional data to send
 294 * @param dlen
 295 *       Maximum size of what the the buffer will hold
 296 * @param xact
 297 *      Identifier of the request
 298 * @param flags
 299 *      Message type inband, rxbuf, gpa
 300 * @param need_sig
 301 *      Is host signal tx is required (optional)
 302 *
 303 * Sends data in buffer directly to hyper-v via the vmbus
 304 */
 305int rte_vmbus_chan_send_sglist(struct vmbus_channel *channel,
 306                               struct vmbus_gpa gpa[], uint32_t gpacnt,
 307                               void *data, uint32_t dlen,
 308                               uint64_t xact, bool *need_sig);
 309/**
 310 * Receive response to request on the given channel
 311 * skips the channel header.
 312 *
 313 * @param channel
 314 *      Pointer to vmbus_channel structure.
 315 * @param data
 316 *      Pointer to the buffer you want to receive the data into.
 317 * @param len
 318 *      Pointer to size of receive buffer (in/out)
 319 * @param
 320 *      Pointer to received transaction_id
 321 * @return
 322 *   On success, returns 0
 323 *   On failure, returns negative errno.
 324 */
 325int rte_vmbus_chan_recv(struct vmbus_channel *chan,
 326                        void *data, uint32_t *len,
 327                        uint64_t *request_id);
 328
 329/**
 330 * Receive response to request on the given channel
 331 * includes the channel header.
 332 *
 333 * @param channel
 334 *      Pointer to vmbus_channel structure.
 335 * @param data
 336 *      Pointer to the buffer you want to receive the data into.
 337 * @param len
 338 *      Pointer to size of receive buffer (in/out)
 339 * @return
 340 *   On success, returns number of bytes read.
 341 *   On failure, returns negative errno.
 342 */
 343int rte_vmbus_chan_recv_raw(struct vmbus_channel *chan,
 344                            void *data, uint32_t *len);
 345
 346/**
 347 * Notify host of bytes read (after recv_raw)
 348 * Signals host if required.
 349 *
 350 * @param channel
 351 *      Pointer to vmbus_channel structure.
 352 * @param bytes_read
 353 *      Number of bytes read since last signal
 354 */
 355void rte_vmbus_chan_signal_read(struct vmbus_channel *chan, uint32_t bytes_read);
 356
 357/**
 358 * Determine sub channel index of the given channel
 359 *
 360 * @param channel
 361 *      Pointer to vmbus_channel structure.
 362 * @return
 363 *   Sub channel index (0 for primary)
 364 */
 365uint16_t rte_vmbus_sub_channel_index(const struct vmbus_channel *chan);
 366
 367/**
 368 * Set the host monitor latency hint
 369 *
 370 * @param dev
 371 *    VMBUS device
 372 * @param chan
 373 *      Pointer to vmbus_channel structure.
 374 * @param latency
 375 *      Approximate wait period between hypervisor examinations of
 376 *      the trigger page (in nanoseconds).
 377 */
 378void rte_vmbus_set_latency(const struct rte_vmbus_device *dev,
 379                           const struct vmbus_channel *chan,
 380                           uint32_t latency);
 381
 382/**
 383 * Register a VMBUS driver.
 384 *
 385 * @param driver
 386 *   A pointer to a rte_vmbus_driver structure describing the driver
 387 *   to be registered.
 388 */
 389void rte_vmbus_register(struct rte_vmbus_driver *driver);
 390
 391/**
 392 * For debug dump contents of ring buffer.
 393 *
 394 * @param channel
 395 *      Pointer to vmbus_channel structure.
 396 */
 397void rte_vmbus_chan_dump(FILE *f, const struct vmbus_channel *chan);
 398
 399/**
 400 * Unregister a VMBUS driver.
 401 *
 402 * @param driver
 403 *   A pointer to a rte_vmbus_driver structure describing the driver
 404 *   to be unregistered.
 405 */
 406void rte_vmbus_unregister(struct rte_vmbus_driver *driver);
 407
 408/** Helper for VMBUS device registration from driver instance */
 409#define RTE_PMD_REGISTER_VMBUS(nm, vmbus_drv)           \
 410        RTE_INIT(vmbusinitfn_ ##nm)                     \
 411        {                                               \
 412                (vmbus_drv).driver.name = RTE_STR(nm);  \
 413                rte_vmbus_register(&vmbus_drv);         \
 414        }                                               \
 415        RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
 416
 417#ifdef __cplusplus
 418}
 419#endif
 420
 421#endif /* _VMBUS_H_ */
 422