36 #define VIRTIO_PCI_NO_LEGACY 45 #ifdef WPP_EVENT_TRACING 46 #include "VirtIOPCIModern.tmh" 50 size_t minlen,
u32 alignment,
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);
69 if (bar_offset & (alignment - 1)) {
70 DPrintf(0,
"bar %i offset %u not aligned to %u\n",
bar, bar_offset, alignment);
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");
209 DPrintf(0,
"virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1\n", 0);
248 unsigned short *pNumEntries,
249 unsigned long *pRingSize,
250 unsigned long *pHeapSize)
272 DPrintf(0,
"%p: bad queue size %u", vdev,
num);
293 unsigned long ring_size, heap_size;
315 if (vq_addr ==
NULL) {
349 "%p: bad notification offset %u (x %u) " 350 "for queue %u > %zd",
372 msix_vec =
vdev->
device->set_queue_vector(vq, msix_vec);
375 goto err_assign_vector;
438 while (iterations-- &&
offset >= 0x40) {
441 CapabilityID), &
id) != 0) {
501 cfg_type < nOffsets &&
503 Offsets[cfg_type] =
offset;
529 DPrintf(0,
"%s(%p): missing capabilities %i/%i/%i\n",
555 notify_off_multiplier),
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
void vp_notify(struct virtqueue *vq)
#define PCI_TYPE0_ADDRESSES
#define PCI_STATUS_CAPABILITIES_LIST
#define pci_read_config_dword(vdev, where, dwVal)
#define pci_read_config_byte(vdev, where, bVal)
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)
#define STATUS_INSUFFICIENT_RESOURCES
#define VIRTIO_PCI_CAP_NOTIFY_CFG
GLuint GLenum GLsizei GLsizei GLint GLint GLboolean packed
#define pci_read_config_word(vdev, where, wVal)
static NTSTATUS vio_modern_setup_vq(struct virtqueue **queue, VirtIODevice *vdev, VirtIOQueueInfo *info, unsigned index, u16 msix_vec)
#define STATUS_INVALID_PARAMETER
#define PCI_MULTIFUNCTION
static u8 find_first_pci_vendor_capability(VirtIODevice *vdev)
#define iowrite32(vdev, val, addr)
#define ioread8(vdev, addr)
unsigned int vring_control_block_size(u16 qsize, bool packed)
#define VIRTIO_PCI_CAP_COMMON_CFG
#define pci_map_address_range(vdev, bar, offset, maxlen)
static size_t vring_pci_size(u16 num, bool packed)
#define iowrite8(vdev, val, addr)
void vring_transport_features(VirtIODevice *vdev, u64 *features)
#define pci_get_resource_len(vdev, bar)
static void vio_modern_set_config(VirtIODevice *vdev, unsigned offset, const void *buf, unsigned len)
static u32 vio_modern_get_generation(VirtIODevice *vdev)
GLenum GLuint GLenum GLsizei const GLchar * buf
#define mem_alloc_nonpaged_block(vdev, size)
u32 notify_offset_multiplier
static u64 vio_modern_get_features(VirtIODevice *vdev)
static void vio_modern_set_status(VirtIODevice *vdev, u8 status)
volatile unsigned char * config
static void vio_modern_del_vq(VirtIOQueueInfo *info)
const struct virtio_device_ops * device
volatile unsigned char * notify_base
static u16 vio_modern_set_config_vector(VirtIODevice *vdev, u16 vector)
#define virtio_is_feature_enabled(FeaturesList, Feature)
#define vdev_sleep(vdev, msecs)
GLenum GLuint GLenum GLsizei length
#define DPrintf(Level, Fmt)
#define offsetof(TYPE, MEMBER)
static void * vio_modern_map_capability(VirtIODevice *vdev, int cap_offset, size_t minlen, u32 alignment, u32 start, u32 size, size_t *len)
#define VIRTIO_PCI_CAP_DEVICE_CFG
static NTSTATUS vio_modern_set_features(VirtIODevice *vdev, u64 features)
static void * vio_modern_map_simple_capability(VirtIODevice *vdev, int cap_offset, size_t length, u32 alignment)
#define STATUS_DEVICE_NOT_CONNECTED
#define iowrite64_twopart(vdev, val, lo_addr, hi_addr)
#define NT_SUCCESS(StatCode)
#define mem_free_nonpaged_block(vdev, addr)
NTSTATUS vio_modern_initialize(VirtIODevice *vdev)
volatile struct virtio_pci_common_cfg * common
static void vio_modern_get_config(VirtIODevice *vdev, unsigned offset, void *buf, unsigned len)
static void vio_modern_reset(VirtIODevice *vdev)
GLenum const GLvoid * addr
static void virtqueue_shutdown(struct virtqueue *vq)
#define VIRTIO_PCI_CAP_PCI_CFG
static const struct virtio_device_ops virtio_pci_device_ops
static NTSTATUS vio_modern_query_vq_alloc(VirtIODevice *vdev, unsigned index, unsigned short *pNumEntries, unsigned long *pRingSize, unsigned long *pHeapSize)
static void find_pci_vendor_capabilities(VirtIODevice *vdev, int *Offsets, size_t nOffsets)
#define ROUND_TO_PAGES(Size)
#define STATUS_DEVICE_BUSY
#define VIRTIO_MSI_NO_VECTOR
static u8 find_next_pci_vendor_capability(VirtIODevice *vdev, u8 offset)
unsigned long vring_size(unsigned int num, unsigned long align, bool packed)
static u8 vio_modern_get_status(VirtIODevice *vdev)
#define mem_alloc_contiguous_pages(vdev, size)
#define mem_free_contiguous_pages(vdev, virt)
#define ioread32(vdev, addr)
#define iowrite16(vdev, val, addr)
#define RtlZeroMemory(Destination, Length)
#define ioread16(vdev, addr)
#define VIRTIO_F_VERSION_1
#define VIRTIO_PCI_CAP_ISR_CFG
static SERVICE_STATUS status
#define mem_get_physical_address(vdev, virt)
#define PCI_CARDBUS_BRIDGE_TYPE
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)
static u16 vio_modern_set_queue_vector(struct virtqueue *vq, u16 vector)
#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC