diff options
Diffstat (limited to 'src/vnet/devices/virtio/virtio_pci_modern.h')
-rw-r--r-- | src/vnet/devices/virtio/virtio_pci_modern.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/vnet/devices/virtio/virtio_pci_modern.h b/src/vnet/devices/virtio/virtio_pci_modern.h new file mode 100644 index 00000000000..f6a8713984f --- /dev/null +++ b/src/vnet/devices/virtio/virtio_pci_modern.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2020 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <vnet/devices/virtio/virtio.h> +#include <vnet/devices/virtio/pci.h> + +/* common configuration */ +#define VIRTIO_FEATURE_SELECT_HI 1 +#define VIRTIO_FEATURE_SELECT_LO 0 + +#define VIRTIO_DEVICE_FEATURE_SELECT_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + device_feature_select)) +#define VIRTIO_DEVICE_FEATURE_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + device_feature)) +#define VIRTIO_DRIVER_FEATURE_SELECT_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + driver_feature_select)) +#define VIRTIO_DRIVER_FEATURE_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + driver_feature)) +#define VIRTIO_MSIX_CONFIG_VECTOR_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + msix_config)) +#define VIRTIO_NUM_QUEUES_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + num_queues)) +#define VIRTIO_DEVICE_STATUS_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + device_status)) +#define VIRTIO_CONFIG_GENERATION_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + config_generation)) +#define VIRTIO_QUEUE_SELECT_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_select)) +#define VIRTIO_QUEUE_SIZE_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_size)) +#define VIRTIO_QUEUE_MSIX_VECTOR_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_msix_vector)) +#define VIRTIO_QUEUE_ENABLE_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_enable)) +#define VIRTIO_QUEUE_NOTIFY_OFF_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_notify_off)) +#define VIRTIO_QUEUE_DESC_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_desc)) +#define VIRTIO_QUEUE_DRIVER_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_driver)) +#define VIRTIO_QUEUE_DEVICE_OFFSET(v) \ + (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \ + queue_device)) +/* device configuration */ +#define VIRTIO_MAC_OFFSET(v) \ + (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \ + mac)) +#define VIRTIO_STATUS_OFFSET(v) \ + (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \ + status)) +#define VIRTIO_MAX_VIRTQUEUE_PAIRS_OFFSET(v) \ + (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \ + max_virtqueue_pairs)) +#define VIRTIO_MTU_OFFSET(v) \ + (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \ + mtu)) +/* interrupt service routine */ +#define VIRTIO_ISR_OFFSET(v) (v->isr_offset) +/* notification */ +#define VIRTIO_NOTIFICATION_OFFSET(v) (v->notify_offset) + +#define _(t) \ +static_always_inline t \ +virtio_pci_reg_read_##t (virtio_if_t * vif, u32 offset) \ +{ \ + t val; \ + val = *(volatile t *) (vif->bar + offset); \ + return val; \ +} + +_(u64); +_(u32); +_(u16); +_(u8); + +#undef _ + +#define _(t) \ +static_always_inline void \ +virtio_pci_reg_write_##t (virtio_if_t * vif, u32 offset, t val) \ +{ \ + *(volatile t *) ((u8 *) vif->bar + offset) = val; \ +} + +_(u64); +_(u32); +_(u16); +_(u8); + +#undef _ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |