| /* |
| * 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: |
| */ |