36#define VIRTIO_PCI_NO_LEGACY
45#ifdef WPP_EVENT_TRACING
46#include "VirtIOPCIModern.tmh"
54 u32 bar_offset, bar_length;
61 if (
start + minlen > bar_length) {
62 DPrintf(0,
"bar %i cap is not large enough to map %zu bytes at offset %u\n",
bar, minlen,
start);
74 if (bar_length >
size) {
83 DPrintf(0,
"bar %i is not large enough to map %zu bytes at offset %u\n",
bar, minlen, bar_offset);
89 DPrintf(0,
"unable to map %u bytes at bar %i offset %u\n", bar_length,
bar, bar_offset);
110 ASSERT(!
"Device has no config to read");
114 ASSERT(!
"Can't read beyond the config length");
129 ASSERT(!
"Only 1, 2, 4 byte config reads are supported");
134 const void *
buf,
unsigned len)
137 ASSERT(!
"Device has no config to write");
141 ASSERT(!
"Can't write beyond the config length");
156 ASSERT(!
"Only 1, 2, 4 byte config writes are supported");
189 DPrintf(0,
"PCI config space is not readable, probably the device is removed\n", 0);
214 DPrintf(0,
"virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1\n", 0);
253 unsigned short *pNumEntries,
254 unsigned long *pRingSize,
255 unsigned long *pHeapSize)
277 DPrintf(0,
"%p: bad queue size %u", vdev,
num);
298 unsigned long ring_size, heap_size;
320 if (vq_addr ==
NULL) {
354 "%p: bad notification offset %u (x %u) "
355 "for queue %u > %zd",
377 msix_vec =
vdev->
device->set_queue_vector(vq, msix_vec);
380 goto err_assign_vector;
443 while (iterations-- &&
offset >= 0x40) {
446 CapabilityID), &
id) != 0) {
506 cfg_type < nOffsets &&
508 Offsets[cfg_type] =
offset;
534 DPrintf(0,
"%s(%p): missing capabilities %i/%i/%i\n",
560 notify_off_multiplier),
static u8 vio_modern_get_status(VirtIODevice *vdev)
static void * vio_modern_map_simple_capability(VirtIODevice *vdev, int cap_offset, size_t length, u32 alignment)
static u8 find_first_pci_vendor_capability(VirtIODevice *vdev)
static u32 vio_modern_get_generation(VirtIODevice *vdev)
static u64 vio_modern_get_features(VirtIODevice *vdev)
static u16 vio_modern_set_queue_vector(struct virtqueue *vq, u16 vector)
static u8 find_next_pci_vendor_capability(VirtIODevice *vdev, u8 offset)
static void find_pci_vendor_capabilities(VirtIODevice *vdev, int *Offsets, size_t nOffsets)
static const struct virtio_device_ops virtio_pci_device_ops
static u16 vio_modern_set_config_vector(VirtIODevice *vdev, u16 vector)
static void vio_modern_get_config(VirtIODevice *vdev, unsigned offset, void *buf, unsigned len)
static void vio_modern_reset(VirtIODevice *vdev)
static void vio_modern_del_vq(VirtIOQueueInfo *info)
NTSTATUS vio_modern_initialize(VirtIODevice *vdev)
static void * vio_modern_map_capability(VirtIODevice *vdev, int cap_offset, size_t minlen, u32 alignment, u32 start, u32 size, size_t *len)
static NTSTATUS vio_modern_setup_vq(struct virtqueue **queue, VirtIODevice *vdev, VirtIOQueueInfo *info, unsigned index, u16 msix_vec)
static void vio_modern_set_status(VirtIODevice *vdev, u8 status)
static void vio_modern_set_config(VirtIODevice *vdev, unsigned offset, const void *buf, unsigned len)
static NTSTATUS vio_modern_query_vq_alloc(VirtIODevice *vdev, unsigned index, unsigned short *pNumEntries, unsigned long *pRingSize, unsigned long *pHeapSize)
static NTSTATUS vio_modern_set_features(VirtIODevice *vdev, u64 features)
static size_t vring_pci_size(u16 num, bool packed)
struct virtqueue * vring_new_virtqueue_packed(unsigned int index, unsigned int num, unsigned int vring_align, VirtIODevice *vdev, void *pages, void(*notify)(struct virtqueue *), void *control)
struct virtqueue * vring_new_virtqueue_split(unsigned int index, unsigned int num, unsigned int vring_align, VirtIODevice *vdev, void *pages, void(*notify)(struct virtqueue *), void *control)
unsigned int vring_control_block_size(u16 qsize, bool packed)
static void virtqueue_shutdown(struct virtqueue *vq)
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
#define NT_SUCCESS(StatCode)
#define DPrintf(Level, Fmt)
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLsizei GLsizei * length
GLenum const GLvoid * addr
GLuint GLenum GLsizei GLsizei GLint GLint GLboolean packed
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
#define offsetof(TYPE, MEMBER)
STDMETHOD() Next(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE
volatile unsigned char * config
volatile struct virtio_pci_common_cfg * common
const struct virtio_device_ops * device
volatile unsigned char * notify_base
u32 notify_offset_multiplier
#define RtlZeroMemory(Destination, Length)
#define STATUS_DEVICE_NOT_CONNECTED
#define STATUS_INVALID_PARAMETER
#define STATUS_DEVICE_BUSY
#define STATUS_INSUFFICIENT_RESOURCES
#define VIRTIO_F_VERSION_1
#define VIRTIO_PCI_CAP_PCI_CFG
#define VIRTIO_PCI_CAP_DEVICE_CFG
#define virtio_is_feature_enabled(FeaturesList, Feature)
#define VIRTIO_MSI_NO_VECTOR
#define VIRTIO_PCI_CAP_ISR_CFG
#define VIRTIO_PCI_CAP_NOTIFY_CFG
#define VIRTIO_PCI_CAP_COMMON_CFG
#define pci_read_config_byte(vdev, where, bVal)
#define mem_get_physical_address(vdev, virt)
#define mem_free_nonpaged_block(vdev, addr)
#define ioread16(vdev, addr)
#define pci_read_config_word(vdev, where, wVal)
#define mem_alloc_nonpaged_block(vdev, size)
#define pci_map_address_range(vdev, bar, offset, maxlen)
#define iowrite64_twopart(vdev, val, lo_addr, hi_addr)
#define mem_alloc_contiguous_pages(vdev, size)
#define mem_free_contiguous_pages(vdev, virt)
#define iowrite32(vdev, val, addr)
#define vdev_sleep(vdev, msecs)
#define pci_read_config_dword(vdev, where, dwVal)
void vp_notify(struct virtqueue *vq)
#define pci_get_resource_len(vdev, bar)
#define iowrite16(vdev, val, addr)
#define ioread8(vdev, addr)
#define iowrite8(vdev, val, addr)
#define ioread32(vdev, addr)
unsigned long vring_size(unsigned int num, unsigned long align, bool packed)
void vring_transport_features(VirtIODevice *vdev, u64 *features)
#define PCI_MULTIFUNCTION
#define PCI_TYPE0_ADDRESSES
#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC
#define PCI_STATUS_CAPABILITIES_LIST
#define PCI_CARDBUS_BRIDGE_TYPE
#define ROUND_TO_PAGES(Size)