1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2018 Intel Corporation 3 */ 4 5 #ifndef _IFCVF_H_ 6 #define _IFCVF_H_ 7 8 #include "ifcvf_osdep.h" 9 10 #define IFCVF_VENDOR_ID 0x1AF4 11 #define IFCVF_DEVICE_ID 0x1041 12 #define IFCVF_SUBSYS_VENDOR_ID 0x8086 13 #define IFCVF_SUBSYS_DEVICE_ID 0x001A 14 15 #define IFCVF_MAX_QUEUES 1 16 17 #ifndef VIRTIO_F_IOMMU_PLATFORM 18 #define VIRTIO_F_IOMMU_PLATFORM 33 19 #endif 20 21 /* Common configuration */ 22 #define IFCVF_PCI_CAP_COMMON_CFG 1 23 /* Notifications */ 24 #define IFCVF_PCI_CAP_NOTIFY_CFG 2 25 /* ISR Status */ 26 #define IFCVF_PCI_CAP_ISR_CFG 3 27 /* Device specific configuration */ 28 #define IFCVF_PCI_CAP_DEVICE_CFG 4 29 /* PCI configuration access */ 30 #define IFCVF_PCI_CAP_PCI_CFG 5 31 32 #define IFCVF_CONFIG_STATUS_RESET 0x00 33 #define IFCVF_CONFIG_STATUS_ACK 0x01 34 #define IFCVF_CONFIG_STATUS_DRIVER 0x02 35 #define IFCVF_CONFIG_STATUS_DRIVER_OK 0x04 36 #define IFCVF_CONFIG_STATUS_FEATURES_OK 0x08 37 #define IFCVF_CONFIG_STATUS_FAILED 0x80 38 39 #define IFCVF_MSI_NO_VECTOR 0xffff 40 #define IFCVF_PCI_MAX_RESOURCE 6 41 42 #define IFCVF_LM_CFG_SIZE 0x40 43 #define IFCVF_LM_RING_STATE_OFFSET 0x20 44 45 #define IFCVF_LM_LOGGING_CTRL 0x0 46 47 #define IFCVF_LM_BASE_ADDR_LOW 0x10 48 #define IFCVF_LM_BASE_ADDR_HIGH 0x14 49 #define IFCVF_LM_END_ADDR_LOW 0x18 50 #define IFCVF_LM_END_ADDR_HIGH 0x1c 51 52 #define IFCVF_LM_DISABLE 0x0 53 #define IFCVF_LM_ENABLE_VF 0x1 54 #define IFCVF_LM_ENABLE_PF 0x3 55 #define IFCVF_LOG_BASE 0x100000000000 56 #define IFCVF_MEDIATED_VRING 0x200000000000 57 58 #define IFCVF_32_BIT_MASK 0xffffffff 59 60 61 struct ifcvf_pci_cap { 62 u8 cap_vndr; /* Generic PCI field: PCI_CAP_ID_VNDR */ 63 u8 cap_next; /* Generic PCI field: next ptr. */ 64 u8 cap_len; /* Generic PCI field: capability length */ 65 u8 cfg_type; /* Identifies the structure. */ 66 u8 bar; /* Where to find it. */ 67 u8 padding[3]; /* Pad to full dword. */ 68 u32 offset; /* Offset within bar. */ 69 u32 length; /* Length of the structure, in bytes. */ 70 }; 71 72 struct ifcvf_pci_notify_cap { 73 struct ifcvf_pci_cap cap; 74 u32 notify_off_multiplier; /* Multiplier for queue_notify_off. */ 75 }; 76 77 struct ifcvf_pci_common_cfg { 78 /* About the whole device. */ 79 u32 device_feature_select; 80 u32 device_feature; 81 u32 guest_feature_select; 82 u32 guest_feature; 83 u16 msix_config; 84 u16 num_queues; 85 u8 device_status; 86 u8 config_generation; 87 88 /* About a specific virtqueue. */ 89 u16 queue_select; 90 u16 queue_size; 91 u16 queue_msix_vector; 92 u16 queue_enable; 93 u16 queue_notify_off; 94 u32 queue_desc_lo; 95 u32 queue_desc_hi; 96 u32 queue_avail_lo; 97 u32 queue_avail_hi; 98 u32 queue_used_lo; 99 u32 queue_used_hi; 100 }; 101 102 struct ifcvf_net_config { 103 u8 mac[6]; 104 u16 status; 105 u16 max_virtqueue_pairs; 106 } __rte_packed; 107 108 struct ifcvf_pci_mem_resource { 109 u64 phys_addr; /**< Physical address, 0 if not resource. */ 110 u64 len; /**< Length of the resource. */ 111 u8 *addr; /**< Virtual address, NULL when not mapped. */ 112 }; 113 114 struct vring_info { 115 u64 desc; 116 u64 avail; 117 u64 used; 118 u16 size; 119 u16 last_avail_idx; 120 u16 last_used_idx; 121 bool enable; 122 }; 123 124 struct ifcvf_hw { 125 u64 req_features; 126 u8 notify_region; 127 u32 notify_off_multiplier; 128 struct ifcvf_pci_common_cfg *common_cfg; 129 struct ifcvf_net_config *dev_cfg; 130 u8 *isr; 131 u16 *notify_base; 132 u16 *notify_addr[IFCVF_MAX_QUEUES * 2]; 133 u8 *lm_cfg; 134 struct vring_info vring[IFCVF_MAX_QUEUES * 2]; 135 u8 nr_vring; 136 struct ifcvf_pci_mem_resource mem_resource[IFCVF_PCI_MAX_RESOURCE]; 137 }; 138 139 int 140 ifcvf_init_hw(struct ifcvf_hw *hw, PCI_DEV *dev); 141 142 u64 143 ifcvf_get_features(struct ifcvf_hw *hw); 144 145 int 146 ifcvf_start_hw(struct ifcvf_hw *hw); 147 148 void 149 ifcvf_stop_hw(struct ifcvf_hw *hw); 150 151 void 152 ifcvf_enable_logging(struct ifcvf_hw *hw, u64 log_base, u64 log_size); 153 154 void 155 ifcvf_disable_logging(struct ifcvf_hw *hw); 156 157 void 158 ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid); 159 160 u8 161 ifcvf_get_notify_region(struct ifcvf_hw *hw); 162 163 u64 164 ifcvf_get_queue_notify_off(struct ifcvf_hw *hw, int qid); 165 166 #endif /* _IFCVF_H_ */ 167