blob: d8c137d1c5b46219f3035f4a8bb5ff8fba4d736a [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <stdint.h>
#include <zircon/compiler.h>
#define VIRTIO_STATUS_ACKNOWLEDGE (1u << 0)
#define VIRTIO_STATUS_DRIVER (1u << 1)
#define VIRTIO_STATUS_DRIVER_OK (1u << 2)
#define VIRTIO_STATUS_FEATURES_OK (1u << 3)
#define VIRTIO_STATUS_DEVICE_NEEDS_RESET (1u << 6)
#define VIRTIO_STATUS_FAILED (1u << 7)
// PCI config space for non-transitional devices.
#define VIRTIO_PCI_COMMON_CFG_DEVICE_FEATURES_SEL 0x0
#define VIRTIO_PCI_COMMON_CFG_DEVICE_FEATURES 0x4
#define VIRTIO_PCI_COMMON_CFG_DRIVER_FEATURES_SEL 0x8
#define VIRTIO_PCI_COMMON_CFG_DRIVER_FEATURES 0xc
#define VIRTIO_PCI_COMMON_CFG_MSIX_CONFIG 0x10
#define VIRTIO_PCI_COMMON_CFG_NUM_QUEUES 0x12
#define VIRTIO_PCI_COMMON_CFG_DEVICE_STATUS 0x14
#define VIRTIO_PCI_COMMON_CFG_CONFIG_GEN 0x15
#define VIRTIO_PCI_COMMON_CFG_QUEUE_SEL 0x16
#define VIRTIO_PCI_COMMON_CFG_QUEUE_SIZE 0x18
#define VIRTIO_PCI_COMMON_CFG_QUEUE_MSIX_VECTOR 0x1a
#define VIRTIO_PCI_COMMON_CFG_QUEUE_ENABLE 0x1c
#define VIRTIO_PCI_COMMON_CFG_QUEUE_NOTIFY_OFF 0x1e
#define VIRTIO_PCI_COMMON_CFG_QUEUE_DESC_LOW 0x20
#define VIRTIO_PCI_COMMON_CFG_QUEUE_DESC_HIGH 0x24
#define VIRTIO_PCI_COMMON_CFG_QUEUE_AVAIL_LOW 0x28
#define VIRTIO_PCI_COMMON_CFG_QUEUE_AVAIL_HIGH 0x2c
#define VIRTIO_PCI_COMMON_CFG_QUEUE_USED_LOW 0x30
#define VIRTIO_PCI_COMMON_CFG_QUEUE_USED_HIGH 0x34
// PCI IO space for transitional virtio devices
#define VIRTIO_PCI_DEVICE_FEATURES 0x0 // uint32_t
#define VIRTIO_PCI_DRIVER_FEATURES 0x4 // uint32_t
#define VIRTIO_PCI_QUEUE_PFN 0x8 // uint32_t
#define VIRTIO_PCI_QUEUE_SIZE 0xc // uint16_t
#define VIRTIO_PCI_QUEUE_SELECT 0xe // uint16_t
#define VIRTIO_PCI_QUEUE_NOTIFY 0x10 // uint16_t
#define VIRTIO_PCI_DEVICE_STATUS 0x12 // uint8_t
#define VIRTIO_PCI_ISR_STATUS 0x13 // uint8_t
#define VIRTIO_PCI_MSI_CONFIG_VECTOR 0x14 // uint16_t
#define VIRTIO_PCI_MSI_QUEUE_VECTOR 0x16 // uint16_t
#define VIRTIO_PCI_CONFIG_OFFSET_NOMSIX 0x14 // uint16_t
#define VIRTIO_PCI_CONFIG_OFFSET_MSIX 0x18 // uint16_t
#define VIRTIO_PCI_CAP_COMMON_CFG 1
#define VIRTIO_PCI_CAP_NOTIFY_CFG 2
#define VIRTIO_PCI_CAP_ISR_CFG 3
#define VIRTIO_PCI_CAP_DEVICE_CFG 4
#define VIRTIO_PCI_CAP_PCI_CFG 5
#define VIRTIO_ISR_QUEUE_INT 0x1
#define VIRTIO_ISR_DEV_CFG_INT 0x2
#define VIRTIO_F_RING_INDIRECT_DESC 28
#define VIRTIO_F_RING_EVENT_IDX 29
#define VIRTIO_F_VERSION_1 32
__BEGIN_CDECLS
typedef struct virtio_pci_cap {
uint8_t cap_vndr;
uint8_t cap_next;
uint8_t cap_len;
uint8_t cfg_type;
uint8_t bar;
uint8_t padding[3];
uint32_t offset;
uint32_t length;
} __PACKED virtio_pci_cap_t;
typedef struct virtio_pci_notify_cap {
virtio_pci_cap_t cap;
uint32_t notify_off_multiplier;
} __PACKED virtio_pci_notify_cap_t;
typedef struct virtio_pci_common_cfg {
uint32_t device_feature_select;
uint32_t device_feature;
uint32_t driver_feature_select;
uint32_t driver_feature;
uint16_t msix_config;
uint16_t num_queues;
uint8_t device_status;
uint8_t config_generation;
uint16_t queue_select;
uint16_t queue_size;
uint16_t queue_msix_vector;
uint16_t queue_enable;
uint16_t queue_notify_off;
uint64_t queue_desc;
uint64_t queue_avail;
uint64_t queue_used;
} __PACKED virtio_pci_common_cfg_t;
#define VIRTIO_PCI_VENDOR_ID 0x1af4
// Device ids
#define VIRTIO_DEV_ID_RESERVED 0
#define VIRTIO_DEV_ID_NETWORK 1
#define VIRTIO_DEV_ID_BLOCK 2
#define VIRTIO_DEV_ID_CONSOLE 3
#define VIRTIO_DEV_ID_ENTROPY 4
#define VIRTIO_DEV_ID_BALLOON_T 5
#define VIRTIO_DEV_ID_IOMEMORY 6
#define VIRTIO_DEV_ID_RPMSG 7
#define VIRTIO_DEV_ID_SCSI_HOST 8
#define VIRTIO_DEV_ID_9P_TRANS 9
#define VIRTIO_DEV_ID_MAC80211 10
#define VIRTIO_DEV_ID_RPROC 11
#define VIRTIO_DEV_ID_CAIF 12
#define VIRTIO_DEV_ID_BALLOON 13
// Intentional gap of 14-15
#define VIRTIO_DEV_ID_GPU 16
#define VIRTIO_DEV_ID_TIMER 17
#define VIRTIO_DEV_ID_INPUT 18
#define VIRTIO_DEV_ID_SOCKET 19
// Device Types (transitional)
#define VIRTIO_DEV_TYPE_T_NETWORK 0x1000
#define VIRTIO_DEV_TYPE_T_BLOCK 0x1001
#define VIRTIO_DEV_TYPE_T_BALLOON 0x1002
#define VIRTIO_DEV_TYPE_T_CONSOLE 0x1003
#define VIRTIO_DEV_TYPE_T_SCSI_HOST 0x1004
#define VIRTIO_DEV_TYPE_T_ENTROPY 0x1005
#define VIRTIO_DEV_TYPE_T_9P 0x1009
// Legacy Device Types
#define VIRTIO_LEGACY_DEV_TYPE(dev_id) (0x1040 + dev_id)
#define VIRTIO_DEV_TYPE_NETWORK VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_NETWORK)
#define VIRTIO_DEV_TYPE_BLOCK VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_BLOCK)
#define VIRTIO_DEV_TYPE_BALLOON VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_BALLOON)
#define VIRTIO_DEV_TYPE_CONSOLE VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_CONSOLE)
#define VIRTIO_DEV_TYPE_SCSI VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_SCSI_HOST)
#define VIRTIO_DEV_TYPE_ENTROPY VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_ENTROPY)
#define VIRTIO_DEV_TYPE_9P VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_9P)
#define VIRTIO_DEV_TYPE_GPU VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_GPU)
#define VIRTIO_DEV_TYPE_INPUT VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_INPUT)
#define VIRTIO_DEV_TYPE_SOCKET VIRTIO_LEGACY_DEV_TYPE(VIRTIO_DEV_ID_SOCKET)
__END_CDECLS