e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev/*
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Copyright (c) 2010 Minoura Makoto.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * All rights reserved.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev *
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Redistribution and use in source and binary forms, with or without
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * modification, are permitted provided that the following conditions
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * are met:
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * 1. Redistributions of source code must retain the above copyright
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * notice, this list of conditions and the following disclaimer.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * 2. Redistributions in binary form must reproduce the above copyright
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * notice, this list of conditions and the following disclaimer in the
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * documentation and/or other materials provided with the distribution.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev *
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev/*
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Part of the file derived from `Virtio PCI Card Specification v0.8.6 DRAFT'
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Appendix A.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev/*
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * An interface for efficient virtio implementation.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev *
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * This header is BSD licensed so anyone can use the definitions
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * to implement compatible drivers/servers.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev *
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Copyright 2007, 2009, IBM Corporation
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * All rights reserved.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev *
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Redistribution and use in source and binary forms, with or without
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * modification, are permitted provided that the following conditions
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * are met:
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * 1. Redistributions of source code must retain the above copyright
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * notice, this list of conditions and the following disclaimer.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * 2. Redistributions in binary form must reproduce the above copyright
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * notice, this list of conditions and the following disclaimer in the
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * documentation and/or other materials provided with the distribution.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * 3. Neither the name of IBM nor the names of its contributors
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * may be used to endorse or promote products derived from this software
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * without specific prior written permission.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * ``AS IS'' ANDANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * SUCH DAMAGE.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev/*
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#ifndef __VIRTIOVAR_H__
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#define __VIRTIOVAR_H__
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#include <sys/types.h>
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#include <sys/dditypes.h>
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#include <sys/cmn_err.h>
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#include <sys/list.h>
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#ifdef DEBUG
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#define dev_debug(dip, fmt, arg...) \
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev dev_err(dip, fmt, ##arg)
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#else
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#define dev_debug(dip, fmt, arg...)
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#endif
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct vq_entry {
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev list_node_t qe_list;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct virtqueue *qe_queue;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev uint16_t qe_index; /* index in vq_desc array */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev /* followings are used only when it is the `head' entry */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vq_entry *qe_next;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vring_desc *qe_desc;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_dma_cookie_t qe_indirect_dma_cookie;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_dma_handle_t qe_indirect_dma_handle;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_acc_handle_t qe_indirect_dma_acch;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vring_desc *qe_indirect_descs;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int qe_indirect_next;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev};
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct virtqueue {
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct virtio_softc *vq_owner;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int vq_num; /* queue size (# of entries) */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int vq_indirect_num;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int vq_index; /* queue number (0, 1, ...) */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev /* vring pointers (KVA) */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vring_desc *vq_descs;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vring_avail *vq_avail;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vring_used *vq_used;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev /* virtqueue allocation info */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev void *vq_vaddr;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int vq_availoffset;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int vq_usedoffset;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_dma_cookie_t vq_dma_cookie;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_dma_handle_t vq_dma_handle;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_acc_handle_t vq_dma_acch;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int vq_maxsegsize;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev /* free entry management */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct vq_entry *vq_entries;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev list_t vq_freelist;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev kmutex_t vq_freelist_lock;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int vq_used_entries;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev /* enqueue/dequeue status */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev uint16_t vq_avail_idx;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev kmutex_t vq_avail_lock;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev uint16_t vq_used_idx;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev kmutex_t vq_used_lock;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev};
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct virtio_softc {
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev dev_info_t *sc_dev;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev uint_t sc_intr_prio;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_acc_handle_t sc_ioh;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev caddr_t sc_io_addr;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int sc_config_offset;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev uint32_t sc_features;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int sc_nvqs; /* set by the user */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_intr_handle_t *sc_intr_htable;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int sc_intr_num;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev boolean_t sc_intr_config;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev int sc_intr_cap;
17ad7f9fd28ceea21aea94421cb8ada963285765Andriy Gapon int sc_int_type;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev};
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct virtio_int_handler {
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_intr_handler_t *vh_func;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev void *vh_priv;
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev};
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev/* public interface */
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevuint32_t virtio_negotiate_features(struct virtio_softc *, uint32_t);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevsize_t virtio_show_features(uint32_t features, char *buffer, size_t len);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevboolean_t virtio_has_feature(struct virtio_softc *sc, uint32_t feature);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_set_status(struct virtio_softc *sc, unsigned int);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#define virtio_device_reset(sc) virtio_set_status((sc), 0)
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevuint8_t virtio_read_device_config_1(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevuint16_t virtio_read_device_config_2(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevuint32_t virtio_read_device_config_4(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevuint64_t virtio_read_device_config_8(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_write_device_config_1(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index, uint8_t value);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_write_device_config_2(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index, uint16_t value);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_write_device_config_4(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index, uint32_t value);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_write_device_config_8(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index, uint64_t value);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct virtqueue *virtio_alloc_vq(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int index, unsigned int size,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev unsigned int indirect_num, const char *name);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_free_vq(struct virtqueue *);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_reset(struct virtio_softc *);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct vq_entry *vq_alloc_entry(struct virtqueue *vq);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid vq_free_entry(struct virtqueue *vq, struct vq_entry *qe);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevuint_t vq_num_used(struct virtqueue *vq);
8a324c92216752a3ac2de7c31f554588932de707Dan McDonaldunsigned int virtio_ve_indirect_available(struct vq_entry *qe);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_stop_vq_intr(struct virtqueue *);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_start_vq_intr(struct virtqueue *);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_ve_add_cookie(struct vq_entry *qe, ddi_dma_handle_t dma_handle,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev ddi_dma_cookie_t dma_cookie, unsigned int ncookies, boolean_t write);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_ve_add_indirect_buf(struct vq_entry *qe, uint64_t paddr,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev uint32_t len, boolean_t write);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_ve_set(struct vq_entry *qe, uint64_t paddr, uint32_t len,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev boolean_t write);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_push_chain(struct vq_entry *qe, boolean_t sync);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevstruct vq_entry *virtio_pull_chain(struct virtqueue *vq, uint32_t *len);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_free_chain(struct vq_entry *ve);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_sync_vq(struct virtqueue *vq);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevint virtio_register_ints(struct virtio_softc *sc,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct virtio_int_handler *config_handler,
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev struct virtio_int_handler vq_handlers[]);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevvoid virtio_release_ints(struct virtio_softc *sc);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsevint virtio_enable_ints(struct virtio_softc *sc);
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev
e0724c534a46ca4754330bc022bf1e2a68f5bb93Alexey Zaytsev#endif /* __VIRTIOVAR_H__ */