1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
8 #include <linux/virtio_blk.h>
9 #include "ifcvf_osdep.h"
14 #define IFCVF_VENDOR_ID 0x1AF4
15 #define IFCVF_NET_DEVICE_ID 0x1041
16 #define IFCVF_BLK_MODERN_DEVICE_ID 0x1042
17 #define IFCVF_BLK_TRANSITIONAL_DEVICE_ID 0x1001
18 #define IFCVF_SUBSYS_VENDOR_ID 0x8086
19 #define IFCVF_SUBSYS_DEVICE_ID 0x001A
20 #define IFCVF_BLK_DEVICE_ID 0x0002
22 #define IFCVF_MAX_QUEUES 1
24 #ifndef VIRTIO_F_IOMMU_PLATFORM
25 #define VIRTIO_F_IOMMU_PLATFORM 33
28 /* Common configuration */
29 #define IFCVF_PCI_CAP_COMMON_CFG 1
31 #define IFCVF_PCI_CAP_NOTIFY_CFG 2
33 #define IFCVF_PCI_CAP_ISR_CFG 3
34 /* Device specific configuration */
35 #define IFCVF_PCI_CAP_DEVICE_CFG 4
36 /* PCI configuration access */
37 #define IFCVF_PCI_CAP_PCI_CFG 5
39 #define IFCVF_CONFIG_STATUS_RESET 0x00
40 #define IFCVF_CONFIG_STATUS_ACK 0x01
41 #define IFCVF_CONFIG_STATUS_DRIVER 0x02
42 #define IFCVF_CONFIG_STATUS_DRIVER_OK 0x04
43 #define IFCVF_CONFIG_STATUS_FEATURES_OK 0x08
44 #define IFCVF_CONFIG_STATUS_FAILED 0x80
46 #define IFCVF_MSI_NO_VECTOR 0xffff
47 #define IFCVF_PCI_MAX_RESOURCE 6
49 #define IFCVF_LM_CFG_SIZE 0x40
50 #define IFCVF_LM_RING_STATE_OFFSET 0x20
52 #define IFCVF_LM_LOGGING_CTRL 0x0
54 #define IFCVF_LM_BASE_ADDR_LOW 0x10
55 #define IFCVF_LM_BASE_ADDR_HIGH 0x14
56 #define IFCVF_LM_END_ADDR_LOW 0x18
57 #define IFCVF_LM_END_ADDR_HIGH 0x1c
59 #define IFCVF_LM_DISABLE 0x0
60 #define IFCVF_LM_ENABLE_VF 0x1
61 #define IFCVF_LM_ENABLE_PF 0x3
62 #define IFCVF_LOG_BASE 0x100000000000
63 #define IFCVF_MEDIATED_VRING 0x200000000000
65 #define IFCVF_32_BIT_MASK 0xffffffff
66 #define IFCVF_16_BIT_MASK 0xffff
69 #ifndef VHOST_USER_PROTOCOL_F_CONFIG
70 #define VHOST_USER_PROTOCOL_F_CONFIG 9
73 struct ifcvf_pci_cap {
74 u8 cap_vndr; /* Generic PCI field: PCI_CAP_ID_VNDR */
75 u8 cap_next; /* Generic PCI field: next ptr. */
76 u8 cap_len; /* Generic PCI field: capability length */
77 u8 cfg_type; /* Identifies the structure. */
78 u8 bar; /* Where to find it. */
79 u8 padding[3]; /* Pad to full dword. */
80 u32 offset; /* Offset within bar. */
81 u32 length; /* Length of the structure, in bytes. */
84 struct ifcvf_pci_notify_cap {
85 struct ifcvf_pci_cap cap;
86 u32 notify_off_multiplier; /* Multiplier for queue_notify_off. */
89 struct ifcvf_pci_common_cfg {
90 /* About the whole device. */
91 u32 device_feature_select;
93 u32 guest_feature_select;
100 /* About a specific virtqueue. */
103 u16 queue_msix_vector;
105 u16 queue_notify_off;
114 struct ifcvf_net_config {
117 u16 max_virtqueue_pairs;
120 struct ifcvf_pci_mem_resource {
121 u64 phys_addr; /**< Physical address, 0 if not resource. */
122 u64 len; /**< Length of the resource. */
123 u8 *addr; /**< Virtual address, NULL when not mapped. */
139 u32 notify_off_multiplier;
140 struct ifcvf_pci_common_cfg *common_cfg;
142 struct ifcvf_net_config *net_cfg;
143 struct virtio_blk_config *blk_cfg;
148 u16 *notify_addr[IFCVF_MAX_QUEUES * 2];
150 struct vring_info vring[IFCVF_MAX_QUEUES * 2];
153 struct ifcvf_pci_mem_resource mem_resource[IFCVF_PCI_MAX_RESOURCE];
157 ifcvf_init_hw(struct ifcvf_hw *hw, PCI_DEV *dev);
160 ifcvf_get_features(struct ifcvf_hw *hw);
163 ifcvf_start_hw(struct ifcvf_hw *hw);
166 ifcvf_stop_hw(struct ifcvf_hw *hw);
169 ifcvf_enable_logging(struct ifcvf_hw *hw, u64 log_base, u64 log_size);
172 ifcvf_disable_logging(struct ifcvf_hw *hw);
175 ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid);
178 ifcvf_get_notify_region(struct ifcvf_hw *hw);
181 ifcvf_get_queue_notify_off(struct ifcvf_hw *hw, int qid);
183 #endif /* _IFCVF_H_ */