2 * Copyright (c) 2020 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #include <vnet/devices/virtio/virtio.h>
17 #include <vnet/devices/virtio/pci.h>
19 /* common configuration */
20 #define VIRTIO_FEATURE_SELECT_HI 1
21 #define VIRTIO_FEATURE_SELECT_LO 0
23 #define VIRTIO_DEVICE_FEATURE_SELECT_OFFSET(v) \
24 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
25 device_feature_select))
26 #define VIRTIO_DEVICE_FEATURE_OFFSET(v) \
27 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
29 #define VIRTIO_DRIVER_FEATURE_SELECT_OFFSET(v) \
30 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
31 driver_feature_select))
32 #define VIRTIO_DRIVER_FEATURE_OFFSET(v) \
33 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
35 #define VIRTIO_MSIX_CONFIG_VECTOR_OFFSET(v) \
36 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
38 #define VIRTIO_NUM_QUEUES_OFFSET(v) \
39 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
41 #define VIRTIO_DEVICE_STATUS_OFFSET(v) \
42 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
44 #define VIRTIO_CONFIG_GENERATION_OFFSET(v) \
45 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
47 #define VIRTIO_QUEUE_SELECT_OFFSET(v) \
48 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
50 #define VIRTIO_QUEUE_SIZE_OFFSET(v) \
51 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
53 #define VIRTIO_QUEUE_MSIX_VECTOR_OFFSET(v) \
54 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
56 #define VIRTIO_QUEUE_ENABLE_OFFSET(v) \
57 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
59 #define VIRTIO_QUEUE_NOTIFY_OFF_OFFSET(v) \
60 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
62 #define VIRTIO_QUEUE_DESC_OFFSET(v) \
63 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
65 #define VIRTIO_QUEUE_DRIVER_OFFSET(v) \
66 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
68 #define VIRTIO_QUEUE_DEVICE_OFFSET(v) \
69 (v->common_offset + STRUCT_OFFSET_OF (virtio_pci_common_cfg_t, \
71 /* device configuration */
72 #define VIRTIO_MAC_OFFSET(v) \
73 (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \
75 #define VIRTIO_STATUS_OFFSET(v) \
76 (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \
78 #define VIRTIO_MAX_VIRTQUEUE_PAIRS_OFFSET(v) \
79 (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \
81 #define VIRTIO_MTU_OFFSET(v) \
82 (v->device_offset + STRUCT_OFFSET_OF (virtio_net_config_t, \
84 /* interrupt service routine */
85 #define VIRTIO_ISR_OFFSET(v) (v->isr_offset)
87 #define VIRTIO_NOTIFICATION_OFFSET(v) (v->notify_offset)
90 static_always_inline t \
91 virtio_pci_reg_read_##t (virtio_if_t * vif, u32 offset) \
94 val = *(volatile t *) (vif->bar + offset); \
106 static_always_inline void \
107 virtio_pci_reg_write_##t (virtio_if_t * vif, u32 offset, t val) \
109 *(volatile t *) ((u8 *) vif->bar + offset) = val; \
120 * fd.io coding-style-patch-verification: ON
123 * eval: (c-set-style "gnu")