68 DBGC ( virtio,
"VIRTIO %s could not reset device\n", virtio->
name );
130 unsigned int count ) {
215 DBGC ( virtio,
"VIRTIO %s could not reset device\n", virtio->
name );
277 unsigned int count ) {
388 DBGC ( virtio,
"VIRTIO %s capability +%#02x too short "
389 "(%d bytes)\n", virtio->
name, pos, cap->
len );
404 DBGC2 ( virtio,
"VIRTIO %s capability type %d BAR%d+%#04x\n",
414 DBGC ( virtio,
"VIRTIO %s capability type %d BAR%d is "
424 DBGC ( virtio,
"VIRTIO %s has no usable capability type %d\n",
450 DBGC ( virtio,
"VIRTIO %s BAR%d is not usable\n",
458 io_addr = ( is_io_bar ? ( (
void * )
addr ) :
461 DBGC ( virtio,
"VIRTIO %s could not map BAR%d+%#04x\n",
466 DBGC2 ( virtio,
"VIRTIO %s mapped BAR%d+%#04x (%s %#08lx)\n",
468 ( is_io_bar ?
"IO" :
"MEM" ),
addr );
521 DBGC ( virtio,
"VIRTIO %s using modern interface (mult x%d)\n",
535 DBGC ( virtio,
"VIRTIO %s using legacy interface (MSI-X "
536 "%sabled)\n", virtio->
name, ( msix ?
"en" :
"dis" ) );
587 if ( (
rc = virtio->
op->
reset ( virtio ) ) != 0 ) {
588 DBGC ( virtio,
"VIRTIO %s could not reset: %s\n",
604 unsigned int stat ) {
610 return virtio->
op->
status ( virtio );
634 DBGC ( virtio,
"VIRTIO %s features", virtio->
name );
636 DBGC ( virtio,
"%s%08x", ( i ?
":" :
" " ),
device->word[i] );
637 DBGC ( virtio,
" /" );
639 DBGC ( virtio,
"%s%08x", ( i ?
":" :
" " ),
features->word[i] );
640 DBGC ( virtio,
"\n" );
672 DBGC ( virtio,
"VIRTIO %s did not accept features\n",
697 unsigned int count ) {
707 if ( (
queue->count == 0 ) ||
709 DBGC ( virtio,
"VIRTIO %s Q%d invalid size %d\n",
719 if ( !
queue->desc ) {
727 DBGC ( virtio,
"VIRTIO %s Q%d %dx descriptors at [%#08lx,%#08lx)\n",
729 virt_to_phys (
queue->desc ),
730 ( virt_to_phys (
queue->desc ) +
732 DBGC ( virtio,
"VIRTIO %s Q%d %dx submissions at [%#08lx,%#08lx)\n",
734 virt_to_phys (
queue->sq ),
735 ( virt_to_phys (
queue->sq ) +
737 DBGC ( virtio,
"VIRTIO %s Q%d %dx completions at [%#08lx,%#08lx)\n",
739 virt_to_phys (
queue->cq ),
740 ( virt_to_phys (
queue->cq ) +
746 DBGC ( virtio,
"VIRTIO %s Q%d doorbell at +%#04x\n",
770 DBGC ( virtio,
"VIRTIO %s Q%d freed\n",
#define NULL
NULL pointer (VOID *).
struct arbelprm_rc_send_wqe rc
unsigned long long uint64_t
#define assert(condition)
Assert a condition at run-time.
uint16_t offset
Offset to command line.
uint8_t ctrl
Ring control.
uint32_t stat
Completion status.
uint32_t addr
Buffer address.
uint32_t features
Supported features.
uint32_t type
Operating system type.
uint16_t supported
Bitmask of supported option values.
static signed char phys[4]
static unsigned int count
Number of entries.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define ENOENT
No such file or directory.
#define ETIMEDOUT
Connection timed out.
#define ENOMEM
Not enough space.
#define ENOTSUP
Operation not supported.
#define ENODEV
No such device.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
#define VIRTIO_STAT_FEATURES_OK
Guest driver has set features.
#define VIRTIO_STAT_ACKNOWLEDGE
Guest has found device.
#define VIRTIO_STAT_FAIL
Guest driver has failed.
#define VIRTIO_STAT_DRIVER
Guest driver exists.
#define VIRTIO_LEG_SEL
Legacy queue select register.
#define VIRTIO_LEG_BASE
Legacy queue base address register.
#define VIRTIO_LEG_USED
Legacy negotiated in-use features register.
#define VIRTIO_LEG_DEV_MSIX
Legacy device-specific register (if MSI-X is enabled).
#define VIRTIO_LEG_FEAT
Legacy device supported features register.
#define VIRTIO_LEG_SIZE
Legacy queue size register.
#define VIRTIO_LEG_DB
Legacy queue doorbell notification register.
#define VIRTIO_LEG_STAT
Legacy driver status register.
#define VIRTIO_LEG_DEV
Legacy device-specific registers.
#define VIRTIO_PCI_CAP_BAR
Capability BAR index.
#define VIRTIO_PCI_CAP_NOTIFY_END
Notification doorbell capability minimum length.
#define VIRTIO_PCI_CAP_TYPE_NOTIFY
Notification doorbells.
#define VIRTIO_PCI_CAP_OFFSET
Capability BAR offset.
#define VIRTIO_PCI_CAP_NOTIFY_MULT
Notification doorbell capability multiplier offset.
#define VIRTIO_PCI_CAP_TYPE_DEVICE
Device-specific registers.
#define VIRTIO_PCI_CAP_TYPE_COMMON
Common registers.
#define VIRTIO_PCI_CAP_END
Capability minimum length.
#define VIRTIO_PCI_CAP_TYPE
Capability type.
#define VIRTIO_PCI_FEAT
PCI device supported features register.
#define VIRTIO_PCI_SEL
PCI queue select register.
#define VIRTIO_PCI_STAT
PCI device status register.
#define VIRTIO_PCI_USED_SEL
PCI negotiated in-use features select register.
#define VIRTIO_PCI_FEAT_SEL
PCI device supported features select register.
#define VIRTIO_PCI_USED
PCI negotiated in-use features register.
#define VIRTIO_PCI_SIZE
PCI queue size register.
#define VIRTIO_PCI_DESC
PCI queue descriptor array base address register.
#define VIRTIO_PCI_CQ
PCI queue completion queue base address register.
#define VIRTIO_PCI_SQ
PCI queue submission queue base address register.
#define VIRTIO_PCI_ENABLE
PCI queue enable register.
struct ib_cm_common common
#define ioread16(io_addr)
#define ioread32(io_addr)
#define iowrite8(data, io_addr)
#define iowrite16(data, io_addr)
#define iowrite32(data, io_addr)
void iounmap(volatile const void *io_addr)
Unmap I/O address.
int pci_read_config_dword(struct pci_device *pci, unsigned int where, uint32_t *value)
Read 32-bit dword from PCI configuration space.
int pci_read_config_word(struct pci_device *pci, unsigned int where, uint16_t *value)
Read 16-bit word from PCI configuration space.
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.
void * memset(void *dest, int character, size_t len) __nonnull
static __always_inline void dma_set_mask_64bit(struct dma_device *dma)
Set 64-bit addressable space mask.
void dma_free(struct dma_mapping *map, void *addr, size_t len)
Unmap and free DMA-coherent buffer.
void * dma_alloc(struct dma_device *dma, struct dma_mapping *map, size_t len, size_t align)
Allocate and map DMA-coherent buffer.
physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
static unsigned int unsigned int reg
int pci_bar_is_io(struct pci_device *pci, unsigned int reg)
Get PCI BAR type.
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
#define PCI_CAP_ID_VNDR
Vendor-specific.
#define PCI_CAP_LEN
Capability length.
#define PCI_MSIX_CTRL_ENABLE
Enable MSI-X.
#define PCI_CAP_ID_MSIX
MSI-X.
#define PCI_BASE_ADDRESS(n)
PCI base address registers.
#define PCI_BASE_ADDRESS_5
char * strerror(int errno)
Retrieve string representation of error number.
struct device dev
Generic device.
struct dma_device dma
DMA device.
struct virtio_features features
Negotiated features.
const char * name
Device name.
unsigned int multiplier
Notification doorbell multiplier.
void * notify
Doorbell notification registers.
void * common
Common registers.
void * device
Device-specific registers.
struct virtio_operations * op
Device operations.
struct dma_device * dma
DMA device.
unsigned int stat
Driver status.
struct virtio_features supported
Device supported features.
uint32_t word[VIRTIO_FEATURE_WORDS]
Feature words.
Virtio device operations.
void(* negotiate)(struct virtio_device *virtio)
Set negotiated features.
void(* enable)(struct virtio_device *virtio, struct virtio_queue *queue)
Enable queue.
void(* supported)(struct virtio_device *virtio)
Get supported features.
int(* reset)(struct virtio_device *virtio)
Reset device.
unsigned int(* status)(struct virtio_device *virtio)
Report driver status.
void(* size)(struct virtio_device *virtio, struct virtio_queue *queue, unsigned int count)
Set queue size.
uint32_t offset
Offset within BAR.
uint8_t type
Capability type.
uint8_t len
Capability length.
uint8_t pos
Capability offset.
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
static unsigned int virtio_pci_status(struct virtio_device *virtio)
Report driver status.
static int virtio_legacy_reset(struct virtio_device *virtio)
Reset device.
static void virtio_legacy_supported(struct virtio_device *virtio)
Get supported features.
int virtio_init(struct virtio_device *virtio, const struct virtio_features *driver)
Initialise device.
static struct virtio_operations virtio_pci_operations
PCI ("modern") device operations.
static void virtio_legacy_negotiate(struct virtio_device *virtio)
Negotiate device features.
unsigned int virtio_status(struct virtio_device *virtio, unsigned int stat)
Report driver status.
static unsigned int virtio_legacy_status(struct virtio_device *virtio)
Report driver status.
int virtio_enable(struct virtio_device *virtio, struct virtio_queue *queue, unsigned int count)
Enable queue.
static void virtio_pci_size(struct virtio_device *virtio, struct virtio_queue *queue, unsigned int count)
Set queue size.
int virtio_reset(struct virtio_device *virtio)
Reset device.
static void virtio_negotiate(struct virtio_device *virtio, const struct virtio_features *driver)
Negotiate features.
static int virtio_pci_reset(struct virtio_device *virtio)
Reset device.
static int virtio_pci_cap(struct virtio_device *virtio, struct pci_device *pci, unsigned int type, struct virtio_pci_capability *cap)
Find PCI capability.
void virtio_free(struct virtio_device *virtio, struct virtio_queue *queue)
Free queue.
static void * virtio_pci_map_cap(struct virtio_device *virtio, struct pci_device *pci, struct virtio_pci_capability *cap)
Map PCI capability.
static struct virtio_operations virtio_legacy_operations
Original ("legacy") device operations.
static void virtio_legacy_size(struct virtio_device *virtio, struct virtio_queue *queue, unsigned int count)
Set queue size.
static void virtio_pci_enable(struct virtio_device *virtio, struct virtio_queue *queue)
Enable queue.
static void virtio_pci_supported(struct virtio_device *virtio)
Get supported features.
void virtio_unmap(struct virtio_device *virtio)
Unmap device.
static void virtio_pci_negotiate(struct virtio_device *virtio)
Negotiate device features.
static void virtio_legacy_enable(struct virtio_device *virtio, struct virtio_queue *queue)
Enable queue.
int virtio_pci_map(struct virtio_device *virtio, struct pci_device *pci)
Map PCI device.
static void virtio_pci_address(struct virtio_device *virtio, struct virtio_queue *queue, void *addr, unsigned int offset)
Program queue address.
#define VIRTIO_FEATURE_WORDS
Number of 32-bit feature words.
#define VIRTIO_FEAT1_MODERN
Virtio version 1.0 or above.
#define VIRTIO_RESET_MAX_WAIT_MS
Maximum time to wait for reset (in ms).
static size_t virtio_align(size_t size)
Calculate aligned size.
static size_t virtio_cq_size(unsigned int count)
Calculate (unaligned) completion queue size.
static size_t virtio_sq_size(unsigned int count)
Calculate (unaligned) submission queue size.
static size_t virtio_desc_size(unsigned int count)
Calculate (unaligned) descriptor array size.
#define VIRTIO_PAGE
Virtio page alignment.