127731002SXiaoyun Li /* SPDX-License-Identifier: BSD-3-Clause 227731002SXiaoyun Li * Copyright(c) 2019 Intel Corporation. 327731002SXiaoyun Li */ 427731002SXiaoyun Li 5c39d1e08SXiaoyun Li #ifndef _NTB_H_ 6c39d1e08SXiaoyun Li #define _NTB_H_ 727731002SXiaoyun Li 827731002SXiaoyun Li #include <stdbool.h> 927731002SXiaoyun Li 1027731002SXiaoyun Li extern int ntb_logtype; 11*2b843cacSDavid Marchand #define RTE_LOGTYPE_NTB ntb_logtype 1227731002SXiaoyun Li 13*2b843cacSDavid Marchand #define NTB_LOG(level, ...) \ 14*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(level, NTB, "%s(): ", __func__, __VA_ARGS__) 1527731002SXiaoyun Li 1627731002SXiaoyun Li /* Vendor ID */ 1727731002SXiaoyun Li #define NTB_INTEL_VENDOR_ID 0x8086 1827731002SXiaoyun Li 1927731002SXiaoyun Li /* Device IDs */ 2027731002SXiaoyun Li #define NTB_INTEL_DEV_ID_B2B_SKX 0x201C 21f5057be3SXiaoyun Li #define NTB_INTEL_DEV_ID_B2B_ICX 0x347E 22834d99f3SJunfeng Guo #define NTB_INTEL_DEV_ID_B2B_SPR 0x347E 2327731002SXiaoyun Li 2427731002SXiaoyun Li /* Reserved to app to use. */ 2527731002SXiaoyun Li #define NTB_SPAD_USER "spad_user_" 2627731002SXiaoyun Li #define NTB_SPAD_USER_LEN (sizeof(NTB_SPAD_USER) - 1) 27c39d1e08SXiaoyun Li #define NTB_SPAD_USER_MAX_NUM 4 2827731002SXiaoyun Li #define NTB_ATTR_NAME_LEN 30 2927731002SXiaoyun Li 30c39d1e08SXiaoyun Li #define NTB_DFLT_TX_FREE_THRESH 256 3127731002SXiaoyun Li 3286083fccSXiaoyun Li enum ntb_xstats_idx { 3386083fccSXiaoyun Li NTB_TX_PKTS_ID = 0, 3486083fccSXiaoyun Li NTB_TX_BYTES_ID, 3586083fccSXiaoyun Li NTB_TX_ERRS_ID, 3686083fccSXiaoyun Li NTB_RX_PKTS_ID, 3786083fccSXiaoyun Li NTB_RX_BYTES_ID, 3886083fccSXiaoyun Li NTB_RX_MISS_ID, 3986083fccSXiaoyun Li }; 4086083fccSXiaoyun Li 4127731002SXiaoyun Li enum ntb_topo { 4227731002SXiaoyun Li NTB_TOPO_NONE = 0, 4327731002SXiaoyun Li NTB_TOPO_B2B_USD, 4427731002SXiaoyun Li NTB_TOPO_B2B_DSD, 4527731002SXiaoyun Li }; 4627731002SXiaoyun Li 4727731002SXiaoyun Li enum ntb_link { 4827731002SXiaoyun Li NTB_LINK_DOWN = 0, 4927731002SXiaoyun Li NTB_LINK_UP, 5027731002SXiaoyun Li }; 5127731002SXiaoyun Li 5227731002SXiaoyun Li enum ntb_speed { 5327731002SXiaoyun Li NTB_SPEED_NONE = 0, 5427731002SXiaoyun Li NTB_SPEED_GEN1 = 1, 5527731002SXiaoyun Li NTB_SPEED_GEN2 = 2, 5627731002SXiaoyun Li NTB_SPEED_GEN3 = 3, 5727731002SXiaoyun Li NTB_SPEED_GEN4 = 4, 5827731002SXiaoyun Li }; 5927731002SXiaoyun Li 6027731002SXiaoyun Li enum ntb_width { 6127731002SXiaoyun Li NTB_WIDTH_NONE = 0, 6227731002SXiaoyun Li NTB_WIDTH_1 = 1, 6327731002SXiaoyun Li NTB_WIDTH_2 = 2, 6427731002SXiaoyun Li NTB_WIDTH_4 = 4, 6527731002SXiaoyun Li NTB_WIDTH_8 = 8, 6627731002SXiaoyun Li NTB_WIDTH_12 = 12, 6727731002SXiaoyun Li NTB_WIDTH_16 = 16, 6827731002SXiaoyun Li NTB_WIDTH_32 = 32, 6927731002SXiaoyun Li }; 7027731002SXiaoyun Li 7127731002SXiaoyun Li /* Define spad registers usage. 0 is reserved. */ 7227731002SXiaoyun Li enum ntb_spad_idx { 7327731002SXiaoyun Li SPAD_NUM_MWS = 1, 7427731002SXiaoyun Li SPAD_NUM_QPS, 7527731002SXiaoyun Li SPAD_Q_SZ, 76c39d1e08SXiaoyun Li SPAD_USED_MWS, 7727731002SXiaoyun Li SPAD_MW0_SZ_H, 7827731002SXiaoyun Li SPAD_MW0_SZ_L, 7927731002SXiaoyun Li SPAD_MW1_SZ_H, 8027731002SXiaoyun Li SPAD_MW1_SZ_L, 81c39d1e08SXiaoyun Li SPAD_MW0_BA_H, 82c39d1e08SXiaoyun Li SPAD_MW0_BA_L, 83c39d1e08SXiaoyun Li SPAD_MW1_BA_H, 84c39d1e08SXiaoyun Li SPAD_MW1_BA_L, 8527731002SXiaoyun Li }; 8627731002SXiaoyun Li 8727731002SXiaoyun Li /** 8827731002SXiaoyun Li * NTB device operations 8927731002SXiaoyun Li * @ntb_dev_init: Init ntb dev. 9027731002SXiaoyun Li * @get_peer_mw_addr: To get the addr of peer mw[mw_idx]. 9127731002SXiaoyun Li * @mw_set_trans: Set translation of internal memory that remote can access. 9211b5c7daSXiaoyun Li * @ioremap: Translate the remote host address to bar address. 9327731002SXiaoyun Li * @get_link_status: get link status, link speed and link width. 9427731002SXiaoyun Li * @set_link: Set local side up/down. 9527731002SXiaoyun Li * @spad_read: Read local/peer spad register val. 9627731002SXiaoyun Li * @spad_write: Write val to local/peer spad register. 9727731002SXiaoyun Li * @db_read: Read doorbells status. 9827731002SXiaoyun Li * @db_clear: Clear local doorbells. 997be78d02SJosh Soref * @db_set_mask: Set bits in db mask, preventing db interrupts generated 10027731002SXiaoyun Li * for those db bits. 10127731002SXiaoyun Li * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit. 10227731002SXiaoyun Li * @vector_bind: Bind vector source [intr] to msix vector [msix]. 10327731002SXiaoyun Li */ 10427731002SXiaoyun Li struct ntb_dev_ops { 105c39d1e08SXiaoyun Li int (*ntb_dev_init)(const struct rte_rawdev *dev); 106c39d1e08SXiaoyun Li void *(*get_peer_mw_addr)(const struct rte_rawdev *dev, int mw_idx); 107c39d1e08SXiaoyun Li int (*mw_set_trans)(const struct rte_rawdev *dev, int mw_idx, 10827731002SXiaoyun Li uint64_t addr, uint64_t size); 10911b5c7daSXiaoyun Li void *(*ioremap)(const struct rte_rawdev *dev, uint64_t addr); 110c39d1e08SXiaoyun Li int (*get_link_status)(const struct rte_rawdev *dev); 111c39d1e08SXiaoyun Li int (*set_link)(const struct rte_rawdev *dev, bool up); 112c39d1e08SXiaoyun Li uint32_t (*spad_read)(const struct rte_rawdev *dev, int spad, 113c39d1e08SXiaoyun Li bool peer); 114c39d1e08SXiaoyun Li int (*spad_write)(const struct rte_rawdev *dev, int spad, 11527731002SXiaoyun Li bool peer, uint32_t spad_v); 116c39d1e08SXiaoyun Li uint64_t (*db_read)(const struct rte_rawdev *dev); 117c39d1e08SXiaoyun Li int (*db_clear)(const struct rte_rawdev *dev, uint64_t db_bits); 118c39d1e08SXiaoyun Li int (*db_set_mask)(const struct rte_rawdev *dev, uint64_t db_mask); 119c39d1e08SXiaoyun Li int (*peer_db_set)(const struct rte_rawdev *dev, uint8_t db_bit); 120c39d1e08SXiaoyun Li int (*vector_bind)(const struct rte_rawdev *dev, uint8_t intr, 121c39d1e08SXiaoyun Li uint8_t msix); 122c39d1e08SXiaoyun Li }; 123c39d1e08SXiaoyun Li 124c39d1e08SXiaoyun Li struct ntb_desc { 125c39d1e08SXiaoyun Li uint64_t addr; /* buffer addr */ 126c39d1e08SXiaoyun Li uint16_t len; /* buffer length */ 127c39d1e08SXiaoyun Li uint16_t rsv1; 128c39d1e08SXiaoyun Li uint32_t rsv2; 129c39d1e08SXiaoyun Li }; 130c39d1e08SXiaoyun Li 131c39d1e08SXiaoyun Li #define NTB_FLAG_EOP 1 /* end of packet */ 132c39d1e08SXiaoyun Li struct ntb_used { 133c39d1e08SXiaoyun Li uint16_t len; /* buffer length */ 134c39d1e08SXiaoyun Li uint16_t flags; /* flags */ 135c39d1e08SXiaoyun Li }; 136c39d1e08SXiaoyun Li 137c39d1e08SXiaoyun Li struct ntb_rx_entry { 138c39d1e08SXiaoyun Li struct rte_mbuf *mbuf; 139c39d1e08SXiaoyun Li }; 140c39d1e08SXiaoyun Li 141c39d1e08SXiaoyun Li struct ntb_rx_queue { 142c39d1e08SXiaoyun Li struct ntb_desc *rx_desc_ring; 143c39d1e08SXiaoyun Li volatile struct ntb_used *rx_used_ring; 144c39d1e08SXiaoyun Li uint16_t *avail_cnt; 145c39d1e08SXiaoyun Li volatile uint16_t *used_cnt; 146c39d1e08SXiaoyun Li uint16_t last_avail; 147c39d1e08SXiaoyun Li uint16_t last_used; 148c39d1e08SXiaoyun Li uint16_t nb_rx_desc; 149c39d1e08SXiaoyun Li 150c39d1e08SXiaoyun Li uint16_t rx_free_thresh; 151c39d1e08SXiaoyun Li 152c39d1e08SXiaoyun Li struct rte_mempool *mpool; /* mempool for mbuf allocation */ 153c39d1e08SXiaoyun Li struct ntb_rx_entry *sw_ring; 154c39d1e08SXiaoyun Li 155c39d1e08SXiaoyun Li uint16_t queue_id; /* DPDK queue index. */ 156c39d1e08SXiaoyun Li uint16_t port_id; /* Device port identifier. */ 157c39d1e08SXiaoyun Li 158c39d1e08SXiaoyun Li struct ntb_hw *hw; 159c39d1e08SXiaoyun Li }; 160c39d1e08SXiaoyun Li 161c39d1e08SXiaoyun Li struct ntb_tx_entry { 162c39d1e08SXiaoyun Li struct rte_mbuf *mbuf; 163c39d1e08SXiaoyun Li uint16_t next_id; 164c39d1e08SXiaoyun Li uint16_t last_id; 165c39d1e08SXiaoyun Li }; 166c39d1e08SXiaoyun Li 167c39d1e08SXiaoyun Li struct ntb_tx_queue { 168c39d1e08SXiaoyun Li volatile struct ntb_desc *tx_desc_ring; 169c39d1e08SXiaoyun Li struct ntb_used *tx_used_ring; 170c39d1e08SXiaoyun Li volatile uint16_t *avail_cnt; 171c39d1e08SXiaoyun Li uint16_t *used_cnt; 172c39d1e08SXiaoyun Li uint16_t last_avail; /* Next need to be free. */ 173c39d1e08SXiaoyun Li uint16_t last_used; /* Next need to be sent. */ 174c39d1e08SXiaoyun Li uint16_t nb_tx_desc; 175c39d1e08SXiaoyun Li 176c39d1e08SXiaoyun Li /* Total number of TX descriptors ready to be allocated. */ 177c39d1e08SXiaoyun Li uint16_t nb_tx_free; 178c39d1e08SXiaoyun Li uint16_t tx_free_thresh; 179c39d1e08SXiaoyun Li 180c39d1e08SXiaoyun Li struct ntb_tx_entry *sw_ring; 181c39d1e08SXiaoyun Li 182c39d1e08SXiaoyun Li uint16_t queue_id; /* DPDK queue index. */ 183c39d1e08SXiaoyun Li uint16_t port_id; /* Device port identifier. */ 184c39d1e08SXiaoyun Li 185c39d1e08SXiaoyun Li struct ntb_hw *hw; 186c39d1e08SXiaoyun Li }; 187c39d1e08SXiaoyun Li 188c39d1e08SXiaoyun Li struct ntb_header { 18927595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint16_t avail_cnt; 19027595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint16_t used_cnt; 19127595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) struct ntb_desc desc_ring[]; 19227731002SXiaoyun Li }; 19327731002SXiaoyun Li 19427731002SXiaoyun Li /* ntb private data. */ 19527731002SXiaoyun Li struct ntb_hw { 19627731002SXiaoyun Li uint8_t mw_cnt; 19727731002SXiaoyun Li uint8_t db_cnt; 19827731002SXiaoyun Li uint8_t spad_cnt; 19927731002SXiaoyun Li 20027731002SXiaoyun Li uint64_t db_valid_mask; 20127731002SXiaoyun Li uint64_t db_mask; 20227731002SXiaoyun Li 20327731002SXiaoyun Li enum ntb_topo topo; 20427731002SXiaoyun Li 20527731002SXiaoyun Li enum ntb_link link_status; 20627731002SXiaoyun Li enum ntb_speed link_speed; 20727731002SXiaoyun Li enum ntb_width link_width; 20827731002SXiaoyun Li 20927731002SXiaoyun Li const struct ntb_dev_ops *ntb_ops; 21027731002SXiaoyun Li 21127731002SXiaoyun Li struct rte_pci_device *pci_dev; 21227731002SXiaoyun Li char *hw_addr; 21327731002SXiaoyun Li 21427731002SXiaoyun Li uint8_t peer_dev_up; 215c39d1e08SXiaoyun Li uint64_t *mw_size; 216c39d1e08SXiaoyun Li /* remote mem base addr */ 217c39d1e08SXiaoyun Li uint64_t *peer_mw_base; 21827731002SXiaoyun Li 21927731002SXiaoyun Li uint16_t queue_pairs; 22027731002SXiaoyun Li uint16_t queue_size; 221c39d1e08SXiaoyun Li uint32_t hdr_size_per_queue; 22227731002SXiaoyun Li 223c39d1e08SXiaoyun Li struct ntb_rx_queue **rx_queues; 224c39d1e08SXiaoyun Li struct ntb_tx_queue **tx_queues; 225c39d1e08SXiaoyun Li 226c39d1e08SXiaoyun Li /* memzone to populate RX ring. */ 22727731002SXiaoyun Li const struct rte_memzone **mz; 228c39d1e08SXiaoyun Li uint8_t used_mw_num; 229c39d1e08SXiaoyun Li 230c39d1e08SXiaoyun Li uint8_t peer_used_mws; 23127731002SXiaoyun Li 23286083fccSXiaoyun Li uint64_t *ntb_xstats; 23386083fccSXiaoyun Li uint64_t *ntb_xstats_off; 23486083fccSXiaoyun Li 23527731002SXiaoyun Li /* Reserve several spad for app to use. */ 23627731002SXiaoyun Li int spad_user_list[NTB_SPAD_USER_MAX_NUM]; 23727731002SXiaoyun Li }; 23827731002SXiaoyun Li 239c39d1e08SXiaoyun Li #endif /* _NTB_H_ */ 240