1517ed6e2SLong Li /* SPDX-License-Identifier: BSD-3-Clause 2517ed6e2SLong Li * Copyright 2022 Microsoft Corporation 3517ed6e2SLong Li */ 4517ed6e2SLong Li 5517ed6e2SLong Li #ifndef __MANA_H__ 6517ed6e2SLong Li #define __MANA_H__ 7517ed6e2SLong Li 8517ed6e2SLong Li #define PCI_VENDOR_ID_MICROSOFT 0x1414 9517ed6e2SLong Li #define PCI_DEVICE_ID_MICROSOFT_MANA 0x00ba 10517ed6e2SLong Li 11517ed6e2SLong Li /* Shared data between primary/secondary processes */ 12517ed6e2SLong Li struct mana_shared_data { 13517ed6e2SLong Li rte_spinlock_t lock; 14517ed6e2SLong Li int init_done; 15517ed6e2SLong Li unsigned int primary_cnt; 16517ed6e2SLong Li unsigned int secondary_cnt; 17517ed6e2SLong Li }; 18517ed6e2SLong Li 1984497839SLong Li #define MANA_MAX_MTU 9000 20d878cb09SLong Li #define MIN_RX_BUF_SIZE 1024 21d878cb09SLong Li #define MANA_MAX_MAC_ADDR 1 22d878cb09SLong Li 23d878cb09SLong Li #define MANA_DEV_RX_OFFLOAD_SUPPORT ( \ 24f8a4217dSWei Hu RTE_ETH_RX_OFFLOAD_VLAN_STRIP | \ 25d878cb09SLong Li RTE_ETH_RX_OFFLOAD_CHECKSUM | \ 26d878cb09SLong Li RTE_ETH_RX_OFFLOAD_RSS_HASH) 27d878cb09SLong Li 28d878cb09SLong Li #define MANA_DEV_TX_OFFLOAD_SUPPORT ( \ 29f8a4217dSWei Hu RTE_ETH_TX_OFFLOAD_VLAN_INSERT | \ 30d878cb09SLong Li RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \ 31d878cb09SLong Li RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \ 32d878cb09SLong Li RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \ 33d878cb09SLong Li RTE_ETH_TX_OFFLOAD_UDP_CKSUM) 34d878cb09SLong Li 35d878cb09SLong Li #define INDIRECTION_TABLE_NUM_ELEMENTS 64 36d878cb09SLong Li #define TOEPLITZ_HASH_KEY_SIZE_IN_BYTES 40 37d878cb09SLong Li #define MANA_ETH_RSS_SUPPORT ( \ 38d878cb09SLong Li RTE_ETH_RSS_IPV4 | \ 39d878cb09SLong Li RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ 40d878cb09SLong Li RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ 41d878cb09SLong Li RTE_ETH_RSS_IPV6 | \ 42d878cb09SLong Li RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ 43d878cb09SLong Li RTE_ETH_RSS_NONFRAG_IPV6_UDP) 44d878cb09SLong Li 45d878cb09SLong Li #define MIN_BUFFERS_PER_QUEUE 64 46d878cb09SLong Li #define MAX_RECEIVE_BUFFERS_PER_QUEUE 256 47d878cb09SLong Li #define MAX_SEND_BUFFERS_PER_QUEUE 256 48d878cb09SLong Li 4956dd45c0SLong Li #define GDMA_WQE_ALIGNMENT_UNIT_SIZE 32 5056dd45c0SLong Li 5156dd45c0SLong Li #define COMP_ENTRY_SIZE 64 5256dd45c0SLong Li #define MAX_TX_WQE_SIZE 512 5356dd45c0SLong Li #define MAX_RX_WQE_SIZE 256 5456dd45c0SLong Li 5526c6bdf3SWei Hu /* For 32 bit only */ 5626c6bdf3SWei Hu #ifdef RTE_ARCH_32 5726c6bdf3SWei Hu #define GDMA_SHORT_DB_INC_MASK 0xffff 5826c6bdf3SWei Hu #define GDMA_SHORT_DB_QID_MASK 0xfff 5926c6bdf3SWei Hu 6026c6bdf3SWei Hu #define GDMA_SHORT_DB_MAX_WQE (0x10000 / GDMA_WQE_ALIGNMENT_UNIT_SIZE) 6126c6bdf3SWei Hu 6226c6bdf3SWei Hu #define TX_WQE_SHORT_DB_THRESHOLD \ 6326c6bdf3SWei Hu (GDMA_SHORT_DB_MAX_WQE - \ 6426c6bdf3SWei Hu (MAX_TX_WQE_SIZE / GDMA_WQE_ALIGNMENT_UNIT_SIZE)) 6526c6bdf3SWei Hu #define RX_WQE_SHORT_DB_THRESHOLD \ 6626c6bdf3SWei Hu (GDMA_SHORT_DB_MAX_WQE - \ 6726c6bdf3SWei Hu (MAX_RX_WQE_SIZE / GDMA_WQE_ALIGNMENT_UNIT_SIZE)) 6826c6bdf3SWei Hu #endif 6926c6bdf3SWei Hu 7056dd45c0SLong Li /* Values from the GDMA specification document, WQE format description */ 7156dd45c0SLong Li #define INLINE_OOB_SMALL_SIZE_IN_BYTES 8 7256dd45c0SLong Li #define INLINE_OOB_LARGE_SIZE_IN_BYTES 24 7356dd45c0SLong Li 7456dd45c0SLong Li #define NOT_USING_CLIENT_DATA_UNIT 0 7556dd45c0SLong Li 767f322844SLong Li enum tx_packet_format_v2 { 777f322844SLong Li SHORT_PACKET_FORMAT = 0, 787f322844SLong Li LONG_PACKET_FORMAT = 1 797f322844SLong Li }; 807f322844SLong Li 817f322844SLong Li struct transmit_short_oob_v2 { 827f322844SLong Li enum tx_packet_format_v2 packet_format : 2; 837f322844SLong Li uint32_t tx_is_outer_ipv4 : 1; 847f322844SLong Li uint32_t tx_is_outer_ipv6 : 1; 857f322844SLong Li uint32_t tx_compute_IP_header_checksum : 1; 867f322844SLong Li uint32_t tx_compute_TCP_checksum : 1; 877f322844SLong Li uint32_t tx_compute_UDP_checksum : 1; 887f322844SLong Li uint32_t suppress_tx_CQE_generation : 1; 897f322844SLong Li uint32_t VCQ_number : 24; 907f322844SLong Li uint32_t tx_transport_header_offset : 10; 917f322844SLong Li uint32_t VSQ_frame_num : 14; 927f322844SLong Li uint32_t short_vport_offset : 8; 937f322844SLong Li }; 947f322844SLong Li 957f322844SLong Li struct transmit_long_oob_v2 { 967f322844SLong Li uint32_t tx_is_encapsulated_packet : 1; 977f322844SLong Li uint32_t tx_inner_is_ipv6 : 1; 987f322844SLong Li uint32_t tx_inner_TCP_options_present : 1; 997f322844SLong Li uint32_t inject_vlan_prior_tag : 1; 1007f322844SLong Li uint32_t reserved1 : 12; 1017f322844SLong Li uint32_t priority_code_point : 3; 1027f322844SLong Li uint32_t drop_eligible_indicator : 1; 1037f322844SLong Li uint32_t vlan_identifier : 12; 1047f322844SLong Li uint32_t tx_inner_frame_offset : 10; 1057f322844SLong Li uint32_t tx_inner_IP_header_relative_offset : 6; 1067f322844SLong Li uint32_t long_vport_offset : 12; 1077f322844SLong Li uint32_t reserved3 : 4; 1087f322844SLong Li uint32_t reserved4 : 32; 1097f322844SLong Li uint32_t reserved5 : 32; 1107f322844SLong Li }; 1117f322844SLong Li 1127f322844SLong Li struct transmit_oob_v2 { 1137f322844SLong Li struct transmit_short_oob_v2 short_oob; 1147f322844SLong Li struct transmit_long_oob_v2 long_oob; 1157f322844SLong Li }; 1167f322844SLong Li 11756dd45c0SLong Li enum gdma_queue_types { 11856dd45c0SLong Li GDMA_QUEUE_TYPE_INVALID = 0, 11956dd45c0SLong Li GDMA_QUEUE_SEND, 12056dd45c0SLong Li GDMA_QUEUE_RECEIVE, 12156dd45c0SLong Li GDMA_QUEUE_COMPLETION, 12256dd45c0SLong Li GDMA_QUEUE_EVENT, 12356dd45c0SLong Li GDMA_QUEUE_TYPE_MAX = 16, 12456dd45c0SLong Li /*Room for expansion */ 12556dd45c0SLong Li 12656dd45c0SLong Li /* This enum can be expanded to add more queue types but 12756dd45c0SLong Li * it's expected to be done in a contiguous manner. 12856dd45c0SLong Li * Failing that will result in unexpected behavior. 12956dd45c0SLong Li */ 13056dd45c0SLong Li }; 13156dd45c0SLong Li 13256dd45c0SLong Li #define WORK_QUEUE_NUMBER_BASE_BITS 10 13356dd45c0SLong Li 13456dd45c0SLong Li struct gdma_header { 13556dd45c0SLong Li /* size of the entire gdma structure, including the entire length of 13656dd45c0SLong Li * the struct that is formed by extending other gdma struct. i.e. 13756dd45c0SLong Li * GDMA_BASE_SPEC extends gdma_header, GDMA_EVENT_QUEUE_SPEC extends 13856dd45c0SLong Li * GDMA_BASE_SPEC, StructSize for GDMA_EVENT_QUEUE_SPEC will be size of 13956dd45c0SLong Li * GDMA_EVENT_QUEUE_SPEC which includes size of GDMA_BASE_SPEC and size 14056dd45c0SLong Li * of gdma_header. 14156dd45c0SLong Li * Above example is for illustration purpose and is not in code 14256dd45c0SLong Li */ 14356dd45c0SLong Li size_t struct_size; 14456dd45c0SLong Li }; 14556dd45c0SLong Li 14656dd45c0SLong Li /* The following macros are from GDMA SPEC 3.6, "Table 2: CQE data structure" 14756dd45c0SLong Li * and "Table 4: Event Queue Entry (EQE) data format" 14856dd45c0SLong Li */ 14956dd45c0SLong Li #define GDMA_COMP_DATA_SIZE 0x3C /* Must be a multiple of 4 */ 15056dd45c0SLong Li #define GDMA_COMP_DATA_SIZE_IN_UINT32 (GDMA_COMP_DATA_SIZE / 4) 15156dd45c0SLong Li 15256dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_WORK_QUEUE_INDEX 0 15356dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_WORK_QUEUE_SIZE 24 15456dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_SEND_WORK_QUEUE_INDEX 24 15556dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_SEND_WORK_QUEUE_SIZE 1 15656dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_OWNER_BITS_INDEX 29 15756dd45c0SLong Li #define COMPLETION_QUEUE_ENTRY_OWNER_BITS_SIZE 3 15856dd45c0SLong Li 15956dd45c0SLong Li #define COMPLETION_QUEUE_OWNER_MASK \ 16056dd45c0SLong Li ((1 << (COMPLETION_QUEUE_ENTRY_OWNER_BITS_SIZE)) - 1) 16156dd45c0SLong Li 16256dd45c0SLong Li struct gdma_hardware_completion_entry { 16356dd45c0SLong Li char dma_client_data[GDMA_COMP_DATA_SIZE]; 16456dd45c0SLong Li union { 16556dd45c0SLong Li uint32_t work_queue_owner_bits; 16656dd45c0SLong Li struct { 16756dd45c0SLong Li uint32_t wq_num : 24; 16856dd45c0SLong Li uint32_t is_sq : 1; 16956dd45c0SLong Li uint32_t reserved : 4; 17056dd45c0SLong Li uint32_t owner_bits : 3; 17156dd45c0SLong Li }; 17256dd45c0SLong Li }; 17356dd45c0SLong Li }; /* HW DATA */ 17456dd45c0SLong Li 17556dd45c0SLong Li struct gdma_posted_wqe_info { 17656dd45c0SLong Li struct gdma_header gdma_header; 17756dd45c0SLong Li 17856dd45c0SLong Li /* size of the written wqe in basic units (32B), filled by GDMA core. 17956dd45c0SLong Li * Use this value to progress the work queue after the wqe is processed 18056dd45c0SLong Li * by hardware. 18156dd45c0SLong Li */ 18256dd45c0SLong Li uint32_t wqe_size_in_bu; 18356dd45c0SLong Li 18456dd45c0SLong Li /* At the time of writing the wqe to the work queue, the offset in the 18556dd45c0SLong Li * work queue buffer where by the wqe will be written. Each unit 18656dd45c0SLong Li * represents 32B of buffer space. 18756dd45c0SLong Li */ 18856dd45c0SLong Li uint32_t wqe_index; 18956dd45c0SLong Li 19056dd45c0SLong Li /* Unmasked offset in the queue to which the WQE was written. 19156dd45c0SLong Li * In 32 byte units. 19256dd45c0SLong Li */ 19356dd45c0SLong Li uint32_t unmasked_queue_offset; 19456dd45c0SLong Li }; 19556dd45c0SLong Li 19656dd45c0SLong Li struct gdma_sgl_element { 19756dd45c0SLong Li uint64_t address; 19856dd45c0SLong Li uint32_t memory_key; 19956dd45c0SLong Li uint32_t size; 20056dd45c0SLong Li }; 20156dd45c0SLong Li 20256dd45c0SLong Li #define MAX_SGL_ENTRIES_FOR_TRANSMIT 30 20356dd45c0SLong Li 20456dd45c0SLong Li struct one_sgl { 20556dd45c0SLong Li struct gdma_sgl_element gdma_sgl[MAX_SGL_ENTRIES_FOR_TRANSMIT]; 20656dd45c0SLong Li }; 20756dd45c0SLong Li 20856dd45c0SLong Li struct gdma_work_request { 20956dd45c0SLong Li struct gdma_header gdma_header; 21056dd45c0SLong Li struct gdma_sgl_element *sgl; 21156dd45c0SLong Li uint32_t num_sgl_elements; 21256dd45c0SLong Li uint32_t inline_oob_size_in_bytes; 21356dd45c0SLong Li void *inline_oob_data; 21456dd45c0SLong Li uint32_t flags; /* From _gdma_work_request_FLAGS */ 21556dd45c0SLong Li uint32_t client_data_unit; /* For LSO, this is the MTU of the data */ 21656dd45c0SLong Li }; 21756dd45c0SLong Li 21856dd45c0SLong Li enum mana_cqe_type { 21956dd45c0SLong Li CQE_INVALID = 0, 220eb9994ddSLong Li 221eb9994ddSLong Li CQE_RX_OKAY = 1, 222eb9994ddSLong Li CQE_RX_COALESCED_4 = 2, 223eb9994ddSLong Li CQE_RX_OBJECT_FENCE = 3, 224eb9994ddSLong Li CQE_RX_TRUNCATED = 4, 2257f322844SLong Li 2267f322844SLong Li CQE_TX_OKAY = 32, 2277f322844SLong Li CQE_TX_SA_DROP = 33, 2287f322844SLong Li CQE_TX_MTU_DROP = 34, 2297f322844SLong Li CQE_TX_INVALID_OOB = 35, 2307f322844SLong Li CQE_TX_INVALID_ETH_TYPE = 36, 2317f322844SLong Li CQE_TX_HDR_PROCESSING_ERROR = 37, 2327f322844SLong Li CQE_TX_VF_DISABLED = 38, 2337f322844SLong Li CQE_TX_VPORT_IDX_OUT_OF_RANGE = 39, 2347f322844SLong Li CQE_TX_VPORT_DISABLED = 40, 2357f322844SLong Li CQE_TX_VLAN_TAGGING_VIOLATION = 41, 23656dd45c0SLong Li }; 23756dd45c0SLong Li 23856dd45c0SLong Li struct mana_cqe_header { 23956dd45c0SLong Li uint32_t cqe_type : 6; 24056dd45c0SLong Li uint32_t client_type : 2; 24156dd45c0SLong Li uint32_t vendor_err : 24; 24256dd45c0SLong Li }; /* HW DATA */ 24356dd45c0SLong Li 2447f322844SLong Li struct mana_tx_comp_oob { 2457f322844SLong Li struct mana_cqe_header cqe_hdr; 2467f322844SLong Li 2477f322844SLong Li uint32_t tx_data_offset; 2487f322844SLong Li 2497f322844SLong Li uint32_t tx_sgl_offset : 5; 2507f322844SLong Li uint32_t tx_wqe_offset : 27; 2517f322844SLong Li 2527f322844SLong Li uint32_t reserved[12]; 2537f322844SLong Li }; /* HW DATA */ 2547f322844SLong Li 25556dd45c0SLong Li /* NDIS HASH Types */ 25656dd45c0SLong Li #define NDIS_HASH_IPV4 RTE_BIT32(0) 25756dd45c0SLong Li #define NDIS_HASH_TCP_IPV4 RTE_BIT32(1) 25856dd45c0SLong Li #define NDIS_HASH_UDP_IPV4 RTE_BIT32(2) 25956dd45c0SLong Li #define NDIS_HASH_IPV6 RTE_BIT32(3) 26056dd45c0SLong Li #define NDIS_HASH_TCP_IPV6 RTE_BIT32(4) 26156dd45c0SLong Li #define NDIS_HASH_UDP_IPV6 RTE_BIT32(5) 26256dd45c0SLong Li #define NDIS_HASH_IPV6_EX RTE_BIT32(6) 26356dd45c0SLong Li #define NDIS_HASH_TCP_IPV6_EX RTE_BIT32(7) 26456dd45c0SLong Li #define NDIS_HASH_UDP_IPV6_EX RTE_BIT32(8) 26556dd45c0SLong Li 26656dd45c0SLong Li #define MANA_HASH_L3 (NDIS_HASH_IPV4 | NDIS_HASH_IPV6 | NDIS_HASH_IPV6_EX) 26756dd45c0SLong Li #define MANA_HASH_L4 \ 26856dd45c0SLong Li (NDIS_HASH_TCP_IPV4 | NDIS_HASH_UDP_IPV4 | NDIS_HASH_TCP_IPV6 | \ 26956dd45c0SLong Li NDIS_HASH_UDP_IPV6 | NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_UDP_IPV6_EX) 27056dd45c0SLong Li 271eb9994ddSLong Li struct mana_rx_comp_per_packet_info { 272eb9994ddSLong Li uint32_t packet_length : 16; 273eb9994ddSLong Li uint32_t reserved0 : 16; 274eb9994ddSLong Li uint32_t reserved1; 275eb9994ddSLong Li uint32_t packet_hash; 276eb9994ddSLong Li }; /* HW DATA */ 277eb9994ddSLong Li #define RX_COM_OOB_NUM_PACKETINFO_SEGMENTS 4 278eb9994ddSLong Li 279eb9994ddSLong Li struct mana_rx_comp_oob { 280eb9994ddSLong Li struct mana_cqe_header cqe_hdr; 281eb9994ddSLong Li 282eb9994ddSLong Li uint32_t rx_vlan_id : 12; 283eb9994ddSLong Li uint32_t rx_vlan_tag_present : 1; 284eb9994ddSLong Li uint32_t rx_outer_ip_header_checksum_succeeded : 1; 285eb9994ddSLong Li uint32_t rx_outer_ip_header_checksum_failed : 1; 286eb9994ddSLong Li uint32_t reserved : 1; 287eb9994ddSLong Li uint32_t rx_hash_type : 9; 288eb9994ddSLong Li uint32_t rx_ip_header_checksum_succeeded : 1; 289eb9994ddSLong Li uint32_t rx_ip_header_checksum_failed : 1; 290eb9994ddSLong Li uint32_t rx_tcp_checksum_succeeded : 1; 291eb9994ddSLong Li uint32_t rx_tcp_checksum_failed : 1; 292eb9994ddSLong Li uint32_t rx_udp_checksum_succeeded : 1; 293eb9994ddSLong Li uint32_t rx_udp_checksum_failed : 1; 294eb9994ddSLong Li uint32_t reserved1 : 1; 295eb9994ddSLong Li struct mana_rx_comp_per_packet_info 296eb9994ddSLong Li packet_info[RX_COM_OOB_NUM_PACKETINFO_SEGMENTS]; 297eb9994ddSLong Li uint32_t received_wqe_offset; 298eb9994ddSLong Li }; /* HW DATA */ 299eb9994ddSLong Li 30056dd45c0SLong Li struct gdma_wqe_dma_oob { 30156dd45c0SLong Li uint32_t reserved:24; 30256dd45c0SLong Li uint32_t last_v_bytes:8; 30356dd45c0SLong Li union { 30456dd45c0SLong Li uint32_t flags; 30556dd45c0SLong Li struct { 30656dd45c0SLong Li uint32_t num_sgl_entries:8; 30756dd45c0SLong Li uint32_t inline_client_oob_size_in_dwords:3; 30856dd45c0SLong Li uint32_t client_oob_in_sgl:1; 30956dd45c0SLong Li uint32_t consume_credit:1; 31056dd45c0SLong Li uint32_t fence:1; 31156dd45c0SLong Li uint32_t reserved1:2; 31256dd45c0SLong Li uint32_t client_data_unit:14; 31356dd45c0SLong Li uint32_t check_sn:1; 31456dd45c0SLong Li uint32_t sgl_direct:1; 31556dd45c0SLong Li }; 31656dd45c0SLong Li }; 31756dd45c0SLong Li }; 31856dd45c0SLong Li 3190f5db3c6SLong Li struct mana_mr_cache { 3200f5db3c6SLong Li uint32_t lkey; 3210f5db3c6SLong Li uintptr_t addr; 3220f5db3c6SLong Li size_t len; 3230f5db3c6SLong Li void *verb_obj; 3240f5db3c6SLong Li }; 3250f5db3c6SLong Li 3260f5db3c6SLong Li #define MANA_MR_BTREE_CACHE_N 512 3270f5db3c6SLong Li struct mana_mr_btree { 3280f5db3c6SLong Li uint16_t len; /* Used entries */ 3290f5db3c6SLong Li uint16_t size; /* Total entries */ 3300f5db3c6SLong Li int overflow; 3310f5db3c6SLong Li int socket; 3320f5db3c6SLong Li struct mana_mr_cache *table; 3330f5db3c6SLong Li }; 3340f5db3c6SLong Li 335517ed6e2SLong Li struct mana_process_priv { 336517ed6e2SLong Li void *db_page; 337517ed6e2SLong Li }; 338517ed6e2SLong Li 339517ed6e2SLong Li struct mana_priv { 340517ed6e2SLong Li struct rte_eth_dev_data *dev_data; 341517ed6e2SLong Li struct mana_process_priv *process_priv; 3420dbfecfeSLong Li int num_queues; 343517ed6e2SLong Li 344517ed6e2SLong Li /* DPDK port */ 345517ed6e2SLong Li uint16_t port_id; 346517ed6e2SLong Li 347517ed6e2SLong Li /* IB device port */ 348517ed6e2SLong Li uint8_t dev_port; 349517ed6e2SLong Li 350f8a4217dSWei Hu uint8_t vlan_strip; 351f8a4217dSWei Hu 352517ed6e2SLong Li struct ibv_context *ib_ctx; 353517ed6e2SLong Li struct ibv_pd *ib_pd; 354517ed6e2SLong Li struct ibv_pd *ib_parent_pd; 3555f705ac2SLong Li struct ibv_rwq_ind_table *ind_table; 3565f705ac2SLong Li struct ibv_qp *rwq_qp; 357517ed6e2SLong Li void *db_page; 358a382177cSLong Li struct rte_eth_rss_conf rss_conf; 359bd15f237SLong Li struct rte_intr_handle *intr_handle; 360517ed6e2SLong Li int max_rx_queues; 361517ed6e2SLong Li int max_tx_queues; 362517ed6e2SLong Li int max_rx_desc; 363517ed6e2SLong Li int max_tx_desc; 364517ed6e2SLong Li int max_send_sge; 365517ed6e2SLong Li int max_recv_sge; 366517ed6e2SLong Li int max_mr; 367517ed6e2SLong Li uint64_t max_mr_size; 3680f5db3c6SLong Li struct mana_mr_btree mr_btree; 3690f5db3c6SLong Li rte_spinlock_t mr_btree_lock; 370517ed6e2SLong Li }; 371517ed6e2SLong Li 372f7dc479aSLong Li struct mana_txq_desc { 373f7dc479aSLong Li struct rte_mbuf *pkt; 374f7dc479aSLong Li uint32_t wqe_size_in_bu; 375cce2c9dfSLong Li bool suppress_tx_cqe; 376f7dc479aSLong Li }; 377f7dc479aSLong Li 3780c63c005SLong Li struct mana_rxq_desc { 3790c63c005SLong Li struct rte_mbuf *pkt; 3800c63c005SLong Li uint32_t wqe_size_in_bu; 3810c63c005SLong Li }; 3820c63c005SLong Li 3835f705ac2SLong Li struct mana_stats { 3845f705ac2SLong Li uint64_t packets; 3855f705ac2SLong Li uint64_t bytes; 3865f705ac2SLong Li uint64_t errors; 3875f705ac2SLong Li uint64_t nombuf; 3885f705ac2SLong Li }; 3895f705ac2SLong Li 39056dd45c0SLong Li struct mana_gdma_queue { 39156dd45c0SLong Li void *buffer; 39256dd45c0SLong Li uint32_t count; /* in entries */ 39356dd45c0SLong Li uint32_t size; /* in bytes */ 39456dd45c0SLong Li uint32_t id; 39556dd45c0SLong Li uint32_t head; 39656dd45c0SLong Li uint32_t tail; 39756dd45c0SLong Li }; 39856dd45c0SLong Li 3990f5db3c6SLong Li #define MANA_MR_BTREE_PER_QUEUE_N 64 4000f5db3c6SLong Li 40131124619SLong Li struct gdma_comp { 40231124619SLong Li /* Filled by GDMA core */ 40331124619SLong Li char *cqe_data; 40431124619SLong Li }; 40531124619SLong Li 406f7dc479aSLong Li struct mana_txq { 407f7dc479aSLong Li struct mana_priv *priv; 408f7dc479aSLong Li uint32_t num_desc; 409410333daSLong Li struct ibv_cq *cq; 410410333daSLong Li struct ibv_qp *qp; 411410333daSLong Li 412410333daSLong Li struct mana_gdma_queue gdma_sq; 413410333daSLong Li struct mana_gdma_queue gdma_cq; 41431124619SLong Li struct gdma_comp *gdma_comp_buf; 415410333daSLong Li 416410333daSLong Li uint32_t tx_vp_offset; 417f7dc479aSLong Li 418f7dc479aSLong Li /* For storing pending requests */ 419f7dc479aSLong Li struct mana_txq_desc *desc_ring; 420f7dc479aSLong Li 421f7dc479aSLong Li /* desc_ring_head is where we put pending requests to ring, 422f7dc479aSLong Li * completion pull off desc_ring_tail 423f7dc479aSLong Li */ 424cce2c9dfSLong Li uint32_t desc_ring_head, desc_ring_tail, desc_ring_len; 425f7dc479aSLong Li 4260f5db3c6SLong Li struct mana_mr_btree mr_btree; 4277f322844SLong Li struct mana_stats stats; 428f7dc479aSLong Li unsigned int socket; 429f7dc479aSLong Li }; 430f7dc479aSLong Li 4310c63c005SLong Li struct mana_rxq { 4320c63c005SLong Li struct mana_priv *priv; 4330c63c005SLong Li uint32_t num_desc; 4340c63c005SLong Li struct rte_mempool *mp; 4355f705ac2SLong Li struct ibv_cq *cq; 436afd5d170SLong Li struct ibv_comp_channel *channel; 4375f705ac2SLong Li struct ibv_wq *wq; 4380c63c005SLong Li 4390c63c005SLong Li /* For storing pending requests */ 4400c63c005SLong Li struct mana_rxq_desc *desc_ring; 4410c63c005SLong Li 4420c63c005SLong Li /* desc_ring_head is where we put pending requests to ring, 4430c63c005SLong Li * completion pull off desc_ring_tail 4440c63c005SLong Li */ 4450c63c005SLong Li uint32_t desc_ring_head, desc_ring_tail; 4460c63c005SLong Li 44726c6bdf3SWei Hu #ifdef RTE_ARCH_32 44826c6bdf3SWei Hu /* For storing wqe increment count btw each short doorbell ring */ 44926c6bdf3SWei Hu uint32_t wqe_cnt_to_short_db; 45026c6bdf3SWei Hu #endif 45126c6bdf3SWei Hu 4525f705ac2SLong Li struct mana_gdma_queue gdma_rq; 4535f705ac2SLong Li struct mana_gdma_queue gdma_cq; 45431124619SLong Li struct gdma_comp *gdma_comp_buf; 4555f705ac2SLong Li 4563409e0f1SLong Li uint32_t comp_buf_len; 4573409e0f1SLong Li uint32_t comp_buf_idx; 4583409e0f1SLong Li uint32_t backlog_idx; 4593409e0f1SLong Li 4605f705ac2SLong Li struct mana_stats stats; 4610f5db3c6SLong Li struct mana_mr_btree mr_btree; 4620f5db3c6SLong Li 4630c63c005SLong Li unsigned int socket; 4640c63c005SLong Li }; 4650c63c005SLong Li 466517ed6e2SLong Li extern int mana_logtype_driver; 4673178e37cSDavid Marchand #define RTE_LOGTYPE_MANA_DRIVER mana_logtype_driver 468517ed6e2SLong Li extern int mana_logtype_init; 469*2b843cacSDavid Marchand #define RTE_LOGTYPE_MANA_INIT mana_logtype_init 470517ed6e2SLong Li 471*2b843cacSDavid Marchand #define DRV_LOG(level, ...) \ 472*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(level, MANA_DRIVER, "%s(): ", __func__, __VA_ARGS__) 473517ed6e2SLong Li 474*2b843cacSDavid Marchand #define DP_LOG(level, ...) \ 475*2b843cacSDavid Marchand RTE_LOG_DP_LINE(level, MANA_DRIVER, __VA_ARGS__) 476e2d3a3c0SLong Li 477*2b843cacSDavid Marchand #define PMD_INIT_LOG(level, ...) \ 478*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(level, MANA_INIT, "%s(): ", __func__, __VA_ARGS__) 479517ed6e2SLong Li 480517ed6e2SLong Li #define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>") 481517ed6e2SLong Li 48226c6bdf3SWei Hu #ifdef RTE_ARCH_32 48326c6bdf3SWei Hu int mana_ring_short_doorbell(void *db_page, enum gdma_queue_types queue_type, 48426c6bdf3SWei Hu uint32_t queue_id, uint32_t tail_incr, 48526c6bdf3SWei Hu uint8_t arm); 48626c6bdf3SWei Hu #else 48756dd45c0SLong Li int mana_ring_doorbell(void *db_page, enum gdma_queue_types queue_type, 488afd5d170SLong Li uint32_t queue_id, uint32_t tail, uint8_t arm); 48926c6bdf3SWei Hu #endif 490304ad326SLong Li int mana_rq_ring_doorbell(struct mana_rxq *rxq); 49156dd45c0SLong Li 49256dd45c0SLong Li int gdma_post_work_request(struct mana_gdma_queue *queue, 49356dd45c0SLong Li struct gdma_work_request *work_req, 494b5dfcaecSLong Li uint32_t *wqe_size_in_bu); 49556dd45c0SLong Li uint8_t *gdma_get_wqe_pointer(struct mana_gdma_queue *queue); 49656dd45c0SLong Li 497eb9994ddSLong Li uint16_t mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **rx_pkts, 498eb9994ddSLong Li uint16_t pkts_n); 4997f322844SLong Li uint16_t mana_tx_burst(void *dpdk_txq, struct rte_mbuf **tx_pkts, 5007f322844SLong Li uint16_t pkts_n); 501eb9994ddSLong Li 502517ed6e2SLong Li uint16_t mana_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts, 503517ed6e2SLong Li uint16_t pkts_n); 504517ed6e2SLong Li 505517ed6e2SLong Li uint16_t mana_tx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts, 506517ed6e2SLong Li uint16_t pkts_n); 507517ed6e2SLong Li 50831124619SLong Li uint32_t gdma_poll_completion_queue(struct mana_gdma_queue *cq, 50931124619SLong Li struct gdma_comp *gdma_comp, 51031124619SLong Li uint32_t max_comp); 51156dd45c0SLong Li 5125f705ac2SLong Li int mana_start_rx_queues(struct rte_eth_dev *dev); 513410333daSLong Li int mana_start_tx_queues(struct rte_eth_dev *dev); 514410333daSLong Li 5155f705ac2SLong Li int mana_stop_rx_queues(struct rte_eth_dev *dev); 516410333daSLong Li int mana_stop_tx_queues(struct rte_eth_dev *dev); 517410333daSLong Li 5187d79530eSLong Li struct mana_mr_cache *mana_alloc_pmd_mr(struct mana_mr_btree *local_tree, 5190f5db3c6SLong Li struct mana_priv *priv, 5200f5db3c6SLong Li struct rte_mbuf *mbuf); 5210f5db3c6SLong Li int mana_new_pmd_mr(struct mana_mr_btree *local_tree, struct mana_priv *priv, 5220f5db3c6SLong Li struct rte_mempool *pool); 5230f5db3c6SLong Li void mana_remove_all_mr(struct mana_priv *priv); 5240f5db3c6SLong Li void mana_del_pmd_mr(struct mana_mr_cache *mr); 5250f5db3c6SLong Li 5260f5db3c6SLong Li void mana_mempool_chunk_cb(struct rte_mempool *mp, void *opaque, 5270f5db3c6SLong Li struct rte_mempool_memhdr *memhdr, unsigned int idx); 5280f5db3c6SLong Li 5290c7bc26bSLong Li int mana_mr_btree_lookup(struct mana_mr_btree *bt, uint16_t *idx, 5300c7bc26bSLong Li uintptr_t addr, size_t len, 5310c7bc26bSLong Li struct mana_mr_cache **cache); 5320f5db3c6SLong Li int mana_mr_btree_insert(struct mana_mr_btree *bt, struct mana_mr_cache *entry); 5330f5db3c6SLong Li int mana_mr_btree_init(struct mana_mr_btree *bt, int n, int socket); 5340f5db3c6SLong Li void mana_mr_btree_free(struct mana_mr_btree *bt); 5350f5db3c6SLong Li 536517ed6e2SLong Li /** Request timeout for IPC. */ 537517ed6e2SLong Li #define MANA_MP_REQ_TIMEOUT_SEC 5 538517ed6e2SLong Li 539517ed6e2SLong Li /* Request types for IPC. */ 540517ed6e2SLong Li enum mana_mp_req_type { 541517ed6e2SLong Li MANA_MP_REQ_VERBS_CMD_FD = 1, 542517ed6e2SLong Li MANA_MP_REQ_CREATE_MR, 543517ed6e2SLong Li MANA_MP_REQ_START_RXTX, 544517ed6e2SLong Li MANA_MP_REQ_STOP_RXTX, 545517ed6e2SLong Li }; 546517ed6e2SLong Li 547517ed6e2SLong Li /* Pameters for IPC. */ 548517ed6e2SLong Li struct mana_mp_param { 549517ed6e2SLong Li enum mana_mp_req_type type; 550517ed6e2SLong Li int port_id; 551517ed6e2SLong Li int result; 552517ed6e2SLong Li 553517ed6e2SLong Li /* MANA_MP_REQ_CREATE_MR */ 554517ed6e2SLong Li uintptr_t addr; 555517ed6e2SLong Li uint32_t len; 556517ed6e2SLong Li }; 557517ed6e2SLong Li 558517ed6e2SLong Li #define MANA_MP_NAME "net_mana_mp" 559517ed6e2SLong Li int mana_mp_init_primary(void); 560517ed6e2SLong Li int mana_mp_init_secondary(void); 561517ed6e2SLong Li void mana_mp_uninit_primary(void); 562517ed6e2SLong Li void mana_mp_uninit_secondary(void); 563517ed6e2SLong Li int mana_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev); 5640f5db3c6SLong Li int mana_mp_req_mr_create(struct mana_priv *priv, uintptr_t addr, uint32_t len); 565517ed6e2SLong Li 566517ed6e2SLong Li void mana_mp_req_on_rxtx(struct rte_eth_dev *dev, enum mana_mp_req_type type); 567517ed6e2SLong Li 5680dbfecfeSLong Li void *mana_alloc_verbs_buf(size_t size, void *data); 5690dbfecfeSLong Li void mana_free_verbs_buf(void *ptr, void *data __rte_unused); 5700dbfecfeSLong Li 571afd5d170SLong Li int mana_rx_intr_enable(struct rte_eth_dev *dev, uint16_t rx_queue_id); 572afd5d170SLong Li int mana_rx_intr_disable(struct rte_eth_dev *dev, uint16_t rx_queue_id); 573afd5d170SLong Li int mana_fd_set_non_blocking(int fd); 574afd5d170SLong Li 575517ed6e2SLong Li #endif 576