ReactOS  0.4.15-dev-1177-g6cb3b62
VirtIOPCICommon.c File Reference
#include "osdep.h"
#include "virtio_pci.h"
#include "VirtIO.h"
#include "kdebugprint.h"
#include <stddef.h>
#include "virtio_pci_common.h"
Include dependency graph for VirtIOPCICommon.c:

Go to the source code of this file.

Functions

NTSTATUS virtio_device_initialize (VirtIODevice *vdev, const VirtIOSystemOps *pSystemOps, PVOID DeviceContext, bool msix_used)
 
void virtio_device_shutdown (VirtIODevice *vdev)
 
u8 virtio_get_status (VirtIODevice *vdev)
 
void virtio_set_status (VirtIODevice *vdev, u8 status)
 
void virtio_add_status (VirtIODevice *vdev, u8 status)
 
void virtio_device_reset (VirtIODevice *vdev)
 
void virtio_device_ready (VirtIODevice *vdev)
 
u64 virtio_get_features (VirtIODevice *vdev)
 
NTSTATUS virtio_set_features (VirtIODevice *vdev, u64 features)
 
static void virtio_cread_many (VirtIODevice *vdev, unsigned int offset, void *buf, size_t count, size_t bytes)
 
void virtio_get_config (VirtIODevice *vdev, unsigned offset, void *buf, unsigned len)
 
static void virtio_cwrite_many (VirtIODevice *vdev, unsigned int offset, void *buf, size_t count, size_t bytes)
 
void virtio_set_config (VirtIODevice *vdev, unsigned offset, void *buf, unsigned len)
 
NTSTATUS virtio_query_queue_allocation (VirtIODevice *vdev, unsigned index, unsigned short *pNumEntries, unsigned long *pRingSize, unsigned long *pHeapSize)
 
NTSTATUS virtio_reserve_queue_memory (VirtIODevice *vdev, unsigned nvqs)
 
static NTSTATUS vp_setup_vq (struct virtqueue **queue, VirtIODevice *vdev, unsigned index, u16 msix_vec)
 
NTSTATUS virtio_find_queue (VirtIODevice *vdev, unsigned index, struct virtqueue **vq)
 
NTSTATUS virtio_find_queues (VirtIODevice *vdev, unsigned nvqs, struct virtqueue *vqs[])
 
void virtio_delete_queue (struct virtqueue *vq)
 
void virtio_delete_queues (VirtIODevice *vdev)
 
u32 virtio_get_queue_size (struct virtqueue *vq)
 
u16 virtio_set_config_vector (VirtIODevice *vdev, u16 vector)
 
u16 virtio_set_queue_vector (struct virtqueue *vq, u16 vector)
 
u8 virtio_read_isr_status (VirtIODevice *vdev)
 
int virtio_get_bar_index (PPCI_COMMON_HEADER pPCIHeader, PHYSICAL_ADDRESS BasePA)
 
void vp_notify (struct virtqueue *vq)
 
void virtqueue_notify (struct virtqueue *vq)
 
void virtqueue_kick (struct virtqueue *vq)
 

Function Documentation

◆ virtio_add_status()

void virtio_add_status ( VirtIODevice vdev,
u8  status 
)

Definition at line 96 of file VirtIOPCICommon.c.

97 {
98  vdev->device->set_status(vdev, (u8)(vdev->device->get_status(vdev) | status));
99 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
UCHAR u8
Definition: btrfs.h:12
static SERVICE_STATUS status
Definition: service.c:31

Referenced by ParaNdis_FinishInitialization(), ParaNdis_InitializeContext(), ParaNdis_PowerOn(), virtio_device_initialize(), and virtio_set_features().

◆ virtio_cread_many()

static void virtio_cread_many ( VirtIODevice vdev,
unsigned int  offset,
void buf,
size_t  count,
size_t  bytes 
)
static

Definition at line 146 of file VirtIOPCICommon.c.

149 {
150  u32 old, gen = vdev->device->get_config_generation ?
151  vdev->device->get_config_generation(vdev) : 0;
152  size_t i;
153 
154  do {
155  old = gen;
156 
157  for (i = 0; i < count; i++) {
158  vdev->device->get_config(vdev, (unsigned)(offset + bytes * i),
159  (char *)buf + i * bytes, (unsigned)bytes);
160  }
161 
162  gen = vdev->device->get_config_generation ?
163  vdev->device->get_config_generation(vdev) : 0;
164  } while (gen != old);
165 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLintptr offset
Definition: glext.h:5920
ULONG32 u32
Definition: btrfs.h:14
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 const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
const struct virtio_device_ops * device
Definition: virtio_pci.h:251

Referenced by virtio_get_config().

◆ virtio_cwrite_many()

static void virtio_cwrite_many ( VirtIODevice vdev,
unsigned int  offset,
void buf,
size_t  count,
size_t  bytes 
)
static

Definition at line 186 of file VirtIOPCICommon.c.

189 {
190  size_t i;
191  for (i = 0; i < count; i++) {
192  vdev->device->set_config(vdev, (unsigned)(offset + bytes * i),
193  (char *)buf + i * bytes, (unsigned)bytes);
194  }
195 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLintptr offset
Definition: glext.h:5920
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 const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
const struct virtio_device_ops * device
Definition: virtio_pci.h:251

Referenced by virtio_set_config().

◆ virtio_delete_queue()

void virtio_delete_queue ( struct virtqueue vq)

Definition at line 311 of file VirtIOPCICommon.c.

312 {
313  VirtIODevice *vdev = vq->vdev;
314  unsigned i = vq->index;
315 
316  vdev->device->delete_queue(&vdev->info[i]);
317  vdev->info[i].vq = NULL;
318 }
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
unsigned int index
Definition: VirtIO.h:45
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 const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
smooth NULL
Definition: ftsmooth.c:416
VirtIODevice * vdev
Definition: VirtIO.h:44
struct virtqueue * vq
Definition: virtio_pci.h:161

◆ virtio_delete_queues()

void virtio_delete_queues ( VirtIODevice vdev)

Definition at line 320 of file VirtIOPCICommon.c.

321 {
322  struct virtqueue *vq;
323  unsigned i;
324 
325  if (vdev->info == NULL)
326  return;
327 
328  for (i = 0; i < vdev->maxQueues; i++) {
329  vq = vdev->info[i].vq;
330  if (vq != NULL) {
331  vdev->device->delete_queue(&vdev->info[i]);
332  vdev->info[i].vq = NULL;
333  }
334  }
335 }
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
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 const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
smooth NULL
Definition: ftsmooth.c:416
ULONG maxQueues
Definition: virtio_pci.h:273
VirtIODevice * vdev
Definition: VirtIO.h:44
struct virtqueue * vq
Definition: virtio_pci.h:161

Referenced by DeleteNetQueues(), and virtio_find_queues().

◆ virtio_device_initialize()

NTSTATUS virtio_device_initialize ( VirtIODevice vdev,
const VirtIOSystemOps pSystemOps,
PVOID  DeviceContext,
bool  msix_used 
)

Definition at line 44 of file VirtIOPCICommon.c.

48 {
50 
53  vdev->system = pSystemOps;
54  vdev->msix_used = msix_used;
57 
60  /* fall back to legacy virtio device */
62  }
63  if (NT_SUCCESS(status)) {
64  /* Always start by resetting the device */
66 
67  /* Acknowledge that we've seen the device. */
69 
70  /* If we are here, we must have found a driver for the device */
72  }
73 
74  return status;
75 }
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
LONG NTSTATUS
Definition: precomp.h:26
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
NTSTATUS vio_modern_initialize(VirtIODevice *vdev)
void virtio_add_status(VirtIODevice *vdev, u8 status)
VirtIOQueueInfo inline_info[MAX_QUEUES_PER_DEVICE_DEFAULT]
Definition: virtio_pci.h:278
#define VIRTIO_CONFIG_S_DRIVER
Definition: virtio_config.h:37
#define STATUS_DEVICE_NOT_CONNECTED
Definition: udferr_usr.h:160
#define VIRTIO_CONFIG_S_ACKNOWLEDGE
Definition: virtio_config.h:35
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
const struct virtio_system_ops * system
Definition: virtio_pci.h:254
_In_ PNDIS_STRING _In_opt_ NDIS_HANDLE DeviceContext
Definition: ndis.h:5245
ULONG maxQueues
Definition: virtio_pci.h:273
void virtio_device_reset(VirtIODevice *vdev)
VirtIODevice * vdev
Definition: VirtIO.h:44
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
NTSTATUS vio_legacy_initialize(VirtIODevice *vdev)
static SERVICE_STATUS status
Definition: service.c:31
void * DeviceContext
Definition: virtio_pci.h:257
Definition: ps.c:97

◆ virtio_device_ready()

void virtio_device_ready ( VirtIODevice vdev)

Definition at line 106 of file VirtIOPCICommon.c.

107 {
108  unsigned status = vdev->device->get_status(vdev);
109 
111  vdev->device->set_status(vdev, (u8)(status | VIRTIO_CONFIG_S_DRIVER_OK));
112 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
UCHAR u8
Definition: btrfs.h:12
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
VirtIODevice * vdev
Definition: VirtIO.h:44
#define VIRTIO_CONFIG_S_DRIVER_OK
Definition: virtio_config.h:39
Definition: ps.c:97

Referenced by ParaNdis_FinishInitialization(), and ParaNdis_PowerOn().

◆ virtio_device_reset()

void virtio_device_reset ( VirtIODevice vdev)

Definition at line 101 of file VirtIOPCICommon.c.

102 {
103  vdev->device->reset(vdev);
104 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by ParaNdis_ResetVirtIONetDevice(), and virtio_device_initialize().

◆ virtio_device_shutdown()

void virtio_device_shutdown ( VirtIODevice vdev)

Definition at line 77 of file VirtIOPCICommon.c.

78 {
79  if (vdev->info &&
80  vdev->info != vdev->inline_info) {
82  vdev->info = NULL;
83  }
84 }
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
VirtIOQueueInfo inline_info[MAX_QUEUES_PER_DEVICE_DEFAULT]
Definition: virtio_pci.h:278
smooth NULL
Definition: ftsmooth.c:416
#define mem_free_nonpaged_block(vdev, addr)
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by VirtIONetRelease().

◆ virtio_find_queue()

NTSTATUS virtio_find_queue ( VirtIODevice vdev,
unsigned  index,
struct virtqueue **  vq 
)

Definition at line 256 of file VirtIOPCICommon.c.

258 {
259  u16 msix_vec = vdev_get_msix_vector(vdev, index);
260  return vp_setup_vq(
261  vq,
262  vdev,
263  index,
264  msix_vec);
265 }
#define vdev_get_msix_vector(vdev, queue)
GLuint index
Definition: glext.h:6031
VirtIODevice * vdev
Definition: VirtIO.h:44
USHORT u16
Definition: btrfs.h:13
static NTSTATUS vp_setup_vq(struct virtqueue **queue, VirtIODevice *vdev, unsigned index, u16 msix_vec)

◆ virtio_find_queues()

NTSTATUS virtio_find_queues ( VirtIODevice vdev,
unsigned  nvqs,
struct virtqueue vqs[] 
)

Definition at line 267 of file VirtIOPCICommon.c.

270 {
271  unsigned i;
273  u16 msix_vec;
274 
276  if (!NT_SUCCESS(status)) {
277  return status;
278  }
279 
280  /* set up the device config interrupt */
281  msix_vec = vdev_get_msix_vector(vdev, -1);
282 
283  if (msix_vec != VIRTIO_MSI_NO_VECTOR) {
284  msix_vec = vdev->device->set_config_vector(vdev, msix_vec);
285  /* Verify we had enough resources to assign the vector */
286  if (msix_vec == VIRTIO_MSI_NO_VECTOR) {
288  goto error_find;
289  }
290  }
291 
292  /* set up queue interrupts */
293  for (i = 0; i < nvqs; i++) {
294  msix_vec = vdev_get_msix_vector(vdev, i);
296  &vqs[i],
297  vdev,
298  i,
299  msix_vec);
300  if (!NT_SUCCESS(status)) {
301  goto error_find;
302  }
303  }
304  return STATUS_SUCCESS;
305 
306 error_find:
308  return status;
309 }
#define vdev_get_msix_vector(vdev, queue)
NTSTATUS virtio_reserve_queue_memory(VirtIODevice *vdev, unsigned nvqs)
LONG NTSTATUS
Definition: precomp.h:26
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 const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
void virtio_delete_queues(VirtIODevice *vdev)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129
#define VIRTIO_MSI_NO_VECTOR
Definition: virtio_pci.h:98
VirtIODevice * vdev
Definition: VirtIO.h:44
return STATUS_SUCCESS
Definition: btrfs.c:3014
USHORT u16
Definition: btrfs.h:13
static SERVICE_STATUS status
Definition: service.c:31
static NTSTATUS vp_setup_vq(struct virtqueue **queue, VirtIODevice *vdev, unsigned index, u16 msix_vec)
Definition: ps.c:97

Referenced by FindNetQueues().

◆ virtio_get_bar_index()

int virtio_get_bar_index ( PPCI_COMMON_HEADER  pPCIHeader,
PHYSICAL_ADDRESS  BasePA 
)

Definition at line 357 of file VirtIOPCICommon.c.

358 {
359  int iBar, i;
360 
361  /* no point in supporting PCI and CardBus bridges */
362  ASSERT((pPCIHeader->HeaderType & ~PCI_MULTIFUNCTION) == PCI_DEVICE_TYPE);
363 
364  for (i = 0; i < PCI_TYPE0_ADDRESSES; i++) {
365  PHYSICAL_ADDRESS BAR;
366  BAR.LowPart = pPCIHeader->u.type0.BaseAddresses[i];
367 
368  iBar = i;
369  if (BAR.LowPart & PCI_ADDRESS_IO_SPACE) {
370  /* I/O space */
372  BAR.HighPart = 0;
373  } else if ((BAR.LowPart & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT) {
374  /* memory space 64-bit */
376  BAR.HighPart = pPCIHeader->u.type0.BaseAddresses[++i];
377  } else {
378  /* memory space 32-bit */
380  BAR.HighPart = 0;
381  }
382 
383  if (BAR.QuadPart == BasePA.QuadPart) {
384  return iBar;
385  }
386  }
387  return -1;
388 }
#define PCI_TYPE0_ADDRESSES
Definition: iotypes.h:3479
#define PCI_ADDRESS_IO_ADDRESS_MASK
Definition: iotypes.h:4212
#define PCI_MULTIFUNCTION
Definition: iotypes.h:3583
#define PCI_ADDRESS_MEMORY_TYPE_MASK
Definition: iotypes.h:4210
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 const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define PCI_ADDRESS_MEMORY_ADDRESS_MASK
Definition: iotypes.h:4213
#define PCI_DEVICE_TYPE
Definition: iotypes.h:3584
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
ULONG LowPart
Definition: typedefs.h:106
#define PCI_TYPE_64BIT
Definition: iotypes.h:4218
#define PCI_ADDRESS_IO_SPACE
Definition: iotypes.h:4209
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by GetAdapterResources().

◆ virtio_get_config()

void virtio_get_config ( VirtIODevice vdev,
unsigned  offset,
void buf,
unsigned  len 
)

Definition at line 167 of file VirtIOPCICommon.c.

169 {
170  switch (len) {
171  case 1:
172  case 2:
173  case 4:
174  vdev->device->get_config(vdev, offset, buf, len);
175  break;
176  case 8:
177  virtio_cread_many(vdev, offset, buf, 2, sizeof(u32));
178  break;
179  default:
181  break;
182  }
183 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLintptr offset
Definition: glext.h:5920
ULONG32 u32
Definition: btrfs.h:14
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
GLenum GLsizei len
Definition: glext.h:6722
static void virtio_cread_many(VirtIODevice *vdev, unsigned int offset, void *buf, size_t count, size_t bytes)
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by ParaNdis_InitializeContext(), and ParaNdis_ReportLinkStatus().

◆ virtio_get_features()

u64 virtio_get_features ( VirtIODevice vdev)

Definition at line 114 of file VirtIOPCICommon.c.

115 {
116  return vdev->device->get_features(vdev);
117 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by ParaNdis_InitializeContext(), and ParaNdis_PowerOn().

◆ virtio_get_queue_size()

u32 virtio_get_queue_size ( struct virtqueue vq)

Definition at line 337 of file VirtIOPCICommon.c.

338 {
339  return vq->vdev->info[vq->index].num;
340 }
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
unsigned int index
Definition: VirtIO.h:45
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by PrepareTransmitBuffers().

◆ virtio_get_status()

u8 virtio_get_status ( VirtIODevice vdev)

Definition at line 86 of file VirtIOPCICommon.c.

87 {
88  return vdev->device->get_status(vdev);
89 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by ParaNdis_ResetVirtIONetDevice(), and VirtIODeviceRemoveStatus().

◆ virtio_query_queue_allocation()

NTSTATUS virtio_query_queue_allocation ( VirtIODevice vdev,
unsigned  index,
unsigned short pNumEntries,
unsigned long pRingSize,
unsigned long pHeapSize 
)

Definition at line 215 of file VirtIOPCICommon.c.

220 {
221  return vdev->device->query_queue_alloc(vdev, index, pNumEntries, pRingSize, pHeapSize);
222 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
GLuint index
Definition: glext.h:6031
VirtIODevice * vdev
Definition: VirtIO.h:44

◆ virtio_read_isr_status()

u8 virtio_read_isr_status ( VirtIODevice vdev)

Definition at line 352 of file VirtIOPCICommon.c.

353 {
354  return ioread8(vdev, vdev->isr);
355 }
#define ioread8(vdev, addr)
volatile u8 * isr
Definition: virtio_pci.h:260
VirtIODevice * vdev
Definition: VirtIO.h:44

Referenced by CheckRunningDpc(), JustForCheckClearInterrupt(), and ParaNdis_OnLegacyInterrupt().

◆ virtio_reserve_queue_memory()

NTSTATUS virtio_reserve_queue_memory ( VirtIODevice vdev,
unsigned  nvqs 
)

Definition at line 224 of file VirtIOPCICommon.c.

225 {
226  if (nvqs > vdev->maxQueues) {
227  /* allocate new space for queue infos */
229  if (!new_info) {
231  }
232 
233  if (vdev->info && vdev->info != vdev->inline_info) {
235  }
236  vdev->info = new_info;
237  vdev->maxQueues = nvqs;
238  }
239  return STATUS_SUCCESS;
240 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
static ULONG FORCEINLINE virtio_get_queue_descriptor_size()
Definition: virtio_pci.h:366
#define mem_alloc_nonpaged_block(vdev, size)
VirtIOQueueInfo inline_info[MAX_QUEUES_PER_DEVICE_DEFAULT]
Definition: virtio_pci.h:278
#define mem_free_nonpaged_block(vdev, addr)
ULONG maxQueues
Definition: virtio_pci.h:273
VirtIODevice * vdev
Definition: VirtIO.h:44
return STATUS_SUCCESS
Definition: btrfs.c:3014

Referenced by virtio_find_queues().

◆ virtio_set_config()

void virtio_set_config ( VirtIODevice vdev,
unsigned  offset,
void buf,
unsigned  len 
)

Definition at line 197 of file VirtIOPCICommon.c.

199 {
200  switch (len) {
201  case 1:
202  case 2:
203  case 4:
204  vdev->device->set_config(vdev, offset, buf, len);
205  break;
206  case 8:
207  virtio_cwrite_many(vdev, offset, buf, 2, sizeof(u32));
208  break;
209  default:
211  break;
212  }
213 }
static void virtio_cwrite_many(VirtIODevice *vdev, unsigned int offset, void *buf, size_t count, size_t bytes)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLintptr offset
Definition: glext.h:5920
ULONG32 u32
Definition: btrfs.h:14
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
GLenum GLsizei len
Definition: glext.h:6722
VirtIODevice * vdev
Definition: VirtIO.h:44

◆ virtio_set_config_vector()

u16 virtio_set_config_vector ( VirtIODevice vdev,
u16  vector 
)

Definition at line 342 of file VirtIOPCICommon.c.

343 {
344  return vdev->device->set_config_vector(vdev, vector);
345 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
VirtIODevice * vdev
Definition: VirtIO.h:44

◆ virtio_set_features()

NTSTATUS virtio_set_features ( VirtIODevice vdev,
u64  features 
)

Definition at line 119 of file VirtIOPCICommon.c.

120 {
121  unsigned char dev_status;
123 
126 
127  status = vdev->device->set_features(vdev, features);
128  if (!NT_SUCCESS(status)) {
129  return status;
130  }
131 
133  return status;
134  }
135 
137  dev_status = vdev->device->get_status(vdev);
138  if (!(dev_status & VIRTIO_CONFIG_S_FEATURES_OK)) {
139  DPrintf(0, "virtio: device refuses features: %x\n", dev_status);
141  }
142  return status;
143 }
bool packed_ring
Definition: virtio_pci.h:248
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
#define VIRTIO_F_RING_PACKED
Definition: virtio_config.h:68
void virtio_add_status(VirtIODevice *vdev, u8 status)
#define VIRTIO_CONFIG_S_FEATURES_OK
Definition: virtio_config.h:41
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
#define virtio_is_feature_enabled(FeaturesList, Feature)
Definition: virtio_pci.h:311
#define DPrintf(Level, Fmt)
Definition: kdebugprint.h:61
#define VIRTIO_RING_F_EVENT_IDX
Definition: virtio_ring.h:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
bool event_suppression_enabled
Definition: virtio_pci.h:245
VirtIODevice * vdev
Definition: VirtIO.h:44
#define VIRTIO_F_VERSION_1
Definition: virtio_config.h:63
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by FinalizeFeatures().

◆ virtio_set_queue_vector()

u16 virtio_set_queue_vector ( struct virtqueue vq,
u16  vector 
)

Definition at line 347 of file VirtIOPCICommon.c.

348 {
349  return vq->vdev->device->set_queue_vector(vq, vector);
350 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
VirtIODevice * vdev
Definition: VirtIO.h:44

◆ virtio_set_status()

void virtio_set_status ( VirtIODevice vdev,
u8  status 
)

Definition at line 91 of file VirtIOPCICommon.c.

92 {
93  vdev->device->set_status(vdev, status);
94 }
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
VirtIODevice * vdev
Definition: VirtIO.h:44
Definition: ps.c:97

Referenced by VirtIODeviceRemoveStatus().

◆ virtqueue_kick()

void virtqueue_kick ( struct virtqueue vq)

Definition at line 406 of file VirtIOPCICommon.c.

407 {
408  if (virtqueue_kick_prepare(vq)) {
409  virtqueue_notify(vq);
410  }
411 }
void virtqueue_notify(struct virtqueue *vq)
static bool virtqueue_kick_prepare(struct virtqueue *vq)
Definition: VirtIO.h:75

Referenced by ParaNdis_DPCWorkBody(), ParaNdis_PowerOn(), ParaNdis_ProcessTx(), and PrepareReceiveBuffers().

◆ virtqueue_notify()

void virtqueue_notify ( struct virtqueue vq)

Definition at line 401 of file VirtIOPCICommon.c.

402 {
403  vq->notification_cb(vq);
404 }
void(* notification_cb)(struct virtqueue *vq)
Definition: VirtIO.h:46

Referenced by virtqueue_kick(), virtqueue_kick_always_packed(), and virtqueue_kick_always_split().

◆ vp_notify()

void vp_notify ( struct virtqueue vq)

Definition at line 393 of file VirtIOPCICommon.c.

394 {
395  /* we write the queue's selector into the notification register to
396  * signal the other end */
397  iowrite16(vq->vdev, (unsigned short)vq->index, vq->notification_addr);
398  DPrintf(6, "virtio: vp_notify vq->index = %x\n", vq->index);
399 }
void * notification_addr
Definition: VirtIO.h:47
unsigned int index
Definition: VirtIO.h:45
#define DPrintf(Level, Fmt)
Definition: kdebugprint.h:61
VirtIODevice * vdev
Definition: VirtIO.h:44
#define iowrite16(vdev, val, addr)

Referenced by vio_legacy_setup_vq(), and vio_modern_setup_vq().

◆ vp_setup_vq()

static NTSTATUS vp_setup_vq ( struct virtqueue **  queue,
VirtIODevice vdev,
unsigned  index,
u16  msix_vec 
)
static

Definition at line 242 of file VirtIOPCICommon.c.

245 {
247 
248  NTSTATUS status = vdev->device->setup_queue(queue, vdev, info, index, msix_vec);
249  if (NT_SUCCESS(status)) {
250  info->vq = *queue;
251  }
252 
253  return status;
254 }
VirtIOQueueInfo * info
Definition: virtio_pci.h:277
LONG NTSTATUS
Definition: precomp.h:26
const struct virtio_device_ops * device
Definition: virtio_pci.h:251
Definition: _queue.h:59
GLuint index
Definition: glext.h:6031
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define index(s, c)
Definition: various.h:29
VirtIODevice * vdev
Definition: VirtIO.h:44
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by virtio_find_queue(), and virtio_find_queues().