1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019 Intel Corporation. 3 */ 4 5 #ifndef _NTB_RAWDEV_H_ 6 #define _NTB_RAWDEV_H_ 7 8 #include <stdbool.h> 9 10 extern int ntb_logtype; 11 12 #define NTB_LOG(level, fmt, args...) \ 13 rte_log(RTE_LOG_ ## level, ntb_logtype, "%s(): " fmt "\n", \ 14 __func__, ##args) 15 16 /* Vendor ID */ 17 #define NTB_INTEL_VENDOR_ID 0x8086 18 19 /* Device IDs */ 20 #define NTB_INTEL_DEV_ID_B2B_SKX 0x201C 21 22 #define NTB_TOPO_NAME "topo" 23 #define NTB_LINK_STATUS_NAME "link_status" 24 #define NTB_SPEED_NAME "speed" 25 #define NTB_WIDTH_NAME "width" 26 #define NTB_MW_CNT_NAME "mw_count" 27 #define NTB_DB_CNT_NAME "db_count" 28 #define NTB_SPAD_CNT_NAME "spad_count" 29 /* Reserved to app to use. */ 30 #define NTB_SPAD_USER "spad_user_" 31 #define NTB_SPAD_USER_LEN (sizeof(NTB_SPAD_USER) - 1) 32 #define NTB_SPAD_USER_MAX_NUM 10 33 #define NTB_ATTR_NAME_LEN 30 34 #define NTB_ATTR_VAL_LEN 30 35 #define NTB_ATTR_MAX 20 36 37 /* NTB Attributes */ 38 struct ntb_attr { 39 /**< Name of the attribute */ 40 char name[NTB_ATTR_NAME_LEN]; 41 /**< Value or reference of value of attribute */ 42 char value[NTB_ATTR_NAME_LEN]; 43 }; 44 45 enum ntb_attr_idx { 46 NTB_TOPO_ID = 0, 47 NTB_LINK_STATUS_ID, 48 NTB_SPEED_ID, 49 NTB_WIDTH_ID, 50 NTB_MW_CNT_ID, 51 NTB_DB_CNT_ID, 52 NTB_SPAD_CNT_ID, 53 }; 54 55 enum ntb_topo { 56 NTB_TOPO_NONE = 0, 57 NTB_TOPO_B2B_USD, 58 NTB_TOPO_B2B_DSD, 59 }; 60 61 enum ntb_link { 62 NTB_LINK_DOWN = 0, 63 NTB_LINK_UP, 64 }; 65 66 enum ntb_speed { 67 NTB_SPEED_NONE = 0, 68 NTB_SPEED_GEN1 = 1, 69 NTB_SPEED_GEN2 = 2, 70 NTB_SPEED_GEN3 = 3, 71 NTB_SPEED_GEN4 = 4, 72 }; 73 74 enum ntb_width { 75 NTB_WIDTH_NONE = 0, 76 NTB_WIDTH_1 = 1, 77 NTB_WIDTH_2 = 2, 78 NTB_WIDTH_4 = 4, 79 NTB_WIDTH_8 = 8, 80 NTB_WIDTH_12 = 12, 81 NTB_WIDTH_16 = 16, 82 NTB_WIDTH_32 = 32, 83 }; 84 85 /* Define spad registers usage. 0 is reserved. */ 86 enum ntb_spad_idx { 87 SPAD_NUM_MWS = 1, 88 SPAD_NUM_QPS, 89 SPAD_Q_SZ, 90 SPAD_MW0_SZ_H, 91 SPAD_MW0_SZ_L, 92 SPAD_MW1_SZ_H, 93 SPAD_MW1_SZ_L, 94 }; 95 96 /** 97 * NTB device operations 98 * @ntb_dev_init: Init ntb dev. 99 * @get_peer_mw_addr: To get the addr of peer mw[mw_idx]. 100 * @mw_set_trans: Set translation of internal memory that remote can access. 101 * @get_link_status: get link status, link speed and link width. 102 * @set_link: Set local side up/down. 103 * @spad_read: Read local/peer spad register val. 104 * @spad_write: Write val to local/peer spad register. 105 * @db_read: Read doorbells status. 106 * @db_clear: Clear local doorbells. 107 * @db_set_mask: Set bits in db mask, preventing db interrpts generated 108 * for those db bits. 109 * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit. 110 * @vector_bind: Bind vector source [intr] to msix vector [msix]. 111 */ 112 struct ntb_dev_ops { 113 int (*ntb_dev_init)(struct rte_rawdev *dev); 114 void *(*get_peer_mw_addr)(struct rte_rawdev *dev, int mw_idx); 115 int (*mw_set_trans)(struct rte_rawdev *dev, int mw_idx, 116 uint64_t addr, uint64_t size); 117 int (*get_link_status)(struct rte_rawdev *dev); 118 int (*set_link)(struct rte_rawdev *dev, bool up); 119 uint32_t (*spad_read)(struct rte_rawdev *dev, int spad, bool peer); 120 int (*spad_write)(struct rte_rawdev *dev, int spad, 121 bool peer, uint32_t spad_v); 122 uint64_t (*db_read)(struct rte_rawdev *dev); 123 int (*db_clear)(struct rte_rawdev *dev, uint64_t db_bits); 124 int (*db_set_mask)(struct rte_rawdev *dev, uint64_t db_mask); 125 int (*peer_db_set)(struct rte_rawdev *dev, uint8_t db_bit); 126 int (*vector_bind)(struct rte_rawdev *dev, uint8_t intr, uint8_t msix); 127 }; 128 129 /* ntb private data. */ 130 struct ntb_hw { 131 uint8_t mw_cnt; 132 uint8_t peer_mw_cnt; 133 uint8_t db_cnt; 134 uint8_t spad_cnt; 135 136 uint64_t db_valid_mask; 137 uint64_t db_mask; 138 139 enum ntb_topo topo; 140 141 enum ntb_link link_status; 142 enum ntb_speed link_speed; 143 enum ntb_width link_width; 144 145 const struct ntb_dev_ops *ntb_ops; 146 147 struct rte_pci_device *pci_dev; 148 char *hw_addr; 149 150 uint64_t *mw_size; 151 uint64_t *peer_mw_size; 152 uint8_t peer_dev_up; 153 154 uint16_t queue_pairs; 155 uint16_t queue_size; 156 157 /**< mem zone to populate RX ring. */ 158 const struct rte_memzone **mz; 159 160 /* Reserve several spad for app to use. */ 161 int spad_user_list[NTB_SPAD_USER_MAX_NUM]; 162 }; 163 164 #endif /* _NTB_RAWDEV_H_ */ 165