1423c8a29SSathesh Edara /* SPDX-License-Identifier: BSD-3-Clause 2423c8a29SSathesh Edara * Copyright(C) 2021 Marvell. 3423c8a29SSathesh Edara */ 4423c8a29SSathesh Edara #ifndef _OTX_EP_COMMON_H_ 5423c8a29SSathesh Edara #define _OTX_EP_COMMON_H_ 6423c8a29SSathesh Edara 735dee56cSVamsi Attunuru #include <rte_bitops.h> 8c836a7baSSathesh Edara #include <rte_spinlock.h> 935dee56cSVamsi Attunuru #include <unistd.h> 1035dee56cSVamsi Attunuru #include <assert.h> 1135dee56cSVamsi Attunuru #include <rte_eal.h> 12831cf744SVamsi Attunuru #include <rte_kvargs.h> 1335dee56cSVamsi Attunuru #include <rte_mempool.h> 1435dee56cSVamsi Attunuru #include <rte_mbuf.h> 1535dee56cSVamsi Attunuru #include <rte_io.h> 1635dee56cSVamsi Attunuru #include <rte_net.h> 1735dee56cSVamsi Attunuru #include <ethdev_pci.h> 1835dee56cSVamsi Attunuru 1935dee56cSVamsi Attunuru #define OTX_EP_CN8XX RTE_BIT32(0) 2035dee56cSVamsi Attunuru #define OTX_EP_CN9XX RTE_BIT32(1) 2135dee56cSVamsi Attunuru #define OTX_EP_CN10XX RTE_BIT32(2) 22423c8a29SSathesh Edara 23423c8a29SSathesh Edara #define OTX_EP_NW_PKT_OP 0x1220 24423c8a29SSathesh Edara #define OTX_EP_NW_CMD_OP 0x1221 25423c8a29SSathesh Edara 26423c8a29SSathesh Edara #define OTX_EP_MAX_RINGS_PER_VF (8) 27423c8a29SSathesh Edara #define OTX_EP_CFG_IO_QUEUES OTX_EP_MAX_RINGS_PER_VF 28e9405625SShijith Thotton #define OTX_EP_32BYTE_INSTR (32) 29423c8a29SSathesh Edara #define OTX_EP_64BYTE_INSTR (64) 3063bc642eSSathesh Edara /* 3163bc642eSSathesh Edara * Backpressure for SDP is configured on Octeon, and the minimum queue sizes 3263bc642eSSathesh Edara * must be much larger than the backpressure watermark configured in the Octeon 3363bc642eSSathesh Edara * SDP driver. IQ and OQ backpressure configurations are separate. 3463bc642eSSathesh Edara */ 3563bc642eSSathesh Edara #define OTX_EP_MIN_IQ_DESCRIPTORS (2048) 3663bc642eSSathesh Edara #define OTX_EP_MIN_OQ_DESCRIPTORS (2048) 37423c8a29SSathesh Edara #define OTX_EP_MAX_IQ_DESCRIPTORS (8192) 38423c8a29SSathesh Edara #define OTX_EP_MAX_OQ_DESCRIPTORS (8192) 39423c8a29SSathesh Edara #define OTX_EP_OQ_BUF_SIZE (2048) 40423c8a29SSathesh Edara #define OTX_EP_MIN_RX_BUF_SIZE (64) 414a3a2a1dSSathesh Edara #define OTX_EP_OQ_WMARK_MIN (256) 42423c8a29SSathesh Edara 43423c8a29SSathesh Edara #define OTX_EP_OQ_INFOPTR_MODE (0) 44423c8a29SSathesh Edara #define OTX_EP_OQ_REFIL_THRESHOLD (16) 45423c8a29SSathesh Edara 46423c8a29SSathesh Edara /* IQ instruction req types */ 47423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NONE (0) 48423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_INSTR (1) 49423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_NET_DIRECT (2) 50423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_NET OTX_EP_REQTYPE_NORESP_NET_DIRECT 51423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_GATHER (3) 52423c8a29SSathesh Edara #define OTX_EP_NORESP_OHSM_SEND (4) 53423c8a29SSathesh Edara #define OTX_EP_NORESP_LAST (4) 54423c8a29SSathesh Edara #define OTX_EP_PCI_RING_ALIGN 65536 5535dee56cSVamsi Attunuru #define OTX_EP_MAX_SG_LISTS 6 563db81df3SVamsi Attunuru #define OTX_EP_NUM_SG_PTRS 4 57423c8a29SSathesh Edara #define SDP_PKIND 40 58423c8a29SSathesh Edara #define SDP_OTX2_PKIND 57 594e356755SSathesh Edara #define SDP_OTX2_PKIND_FS0 0 60423c8a29SSathesh Edara 61423c8a29SSathesh Edara #define ORDERED_TAG 0 62423c8a29SSathesh Edara #define ATOMIC_TAG 1 63423c8a29SSathesh Edara #define NULL_TAG 2 64423c8a29SSathesh Edara #define NULL_NULL_TAG 3 65423c8a29SSathesh Edara 66423c8a29SSathesh Edara #define OTX_EP_BUSY_LOOP_COUNT (10000) 67423c8a29SSathesh Edara #define OTX_EP_MAX_IOQS_PER_VF 8 68423c8a29SSathesh Edara #define OTX_CUST_DATA_LEN 0 69423c8a29SSathesh Edara 70*2b843cacSDavid Marchand #define otx_ep_info(...) \ 71*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(INFO, OTX_NET_EP, "%s():%u ", \ 72*2b843cacSDavid Marchand __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__) 73423c8a29SSathesh Edara 74*2b843cacSDavid Marchand #define otx_ep_err(...) \ 75*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(ERR, OTX_NET_EP, "%s():%u ", \ 76*2b843cacSDavid Marchand __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__) 77423c8a29SSathesh Edara 78*2b843cacSDavid Marchand #define otx_ep_dbg(...) \ 79*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(DEBUG, OTX_NET_EP, "%s():%u ", \ 80*2b843cacSDavid Marchand __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__) 81423c8a29SSathesh Edara 82d826133aSSathesh Edara /* IO Access */ 83d826133aSSathesh Edara #define oct_ep_read64(addr) rte_read64_relaxed((void *)(addr)) 84d826133aSSathesh Edara #define oct_ep_write64(val, addr) rte_write64_relaxed((val), (void *)(addr)) 85d826133aSSathesh Edara 86c836a7baSSathesh Edara /* Mailbox maximum data size */ 87c836a7baSSathesh Edara #define MBOX_MAX_DATA_BUF_SIZE 320 88c836a7baSSathesh Edara 89423c8a29SSathesh Edara /* Input Request Header format */ 90423c8a29SSathesh Edara union otx_ep_instr_irh { 91423c8a29SSathesh Edara uint64_t u64; 92423c8a29SSathesh Edara struct { 93423c8a29SSathesh Edara /* Request ID */ 94423c8a29SSathesh Edara uint64_t rid:16; 95423c8a29SSathesh Edara 96423c8a29SSathesh Edara /* PCIe port to use for response */ 97423c8a29SSathesh Edara uint64_t pcie_port:3; 98423c8a29SSathesh Edara 99423c8a29SSathesh Edara /* Scatter indicator 1=scatter */ 100423c8a29SSathesh Edara uint64_t scatter:1; 101423c8a29SSathesh Edara 102423c8a29SSathesh Edara /* Size of Expected result OR no. of entries in scatter list */ 103423c8a29SSathesh Edara uint64_t rlenssz:14; 104423c8a29SSathesh Edara 105423c8a29SSathesh Edara /* Desired destination port for result */ 106423c8a29SSathesh Edara uint64_t dport:6; 107423c8a29SSathesh Edara 108423c8a29SSathesh Edara /* Opcode Specific parameters */ 109423c8a29SSathesh Edara uint64_t param:8; 110423c8a29SSathesh Edara 111423c8a29SSathesh Edara /* Opcode for the return packet */ 112423c8a29SSathesh Edara uint64_t opcode:16; 113423c8a29SSathesh Edara } s; 114423c8a29SSathesh Edara }; 115423c8a29SSathesh Edara 116423c8a29SSathesh Edara #define otx_ep_write64(value, base_addr, reg_off) \ 117423c8a29SSathesh Edara {\ 118423c8a29SSathesh Edara typeof(value) val = (value); \ 119423c8a29SSathesh Edara typeof(reg_off) off = (reg_off); \ 120f665790aSDavid Marchand otx_ep_dbg("octeon_write_csr64: reg: 0x%08lx val: 0x%016llx", \ 121423c8a29SSathesh Edara (unsigned long)off, (unsigned long long)val); \ 122423c8a29SSathesh Edara rte_write64(val, ((base_addr) + off)); \ 123423c8a29SSathesh Edara } 124423c8a29SSathesh Edara 125423c8a29SSathesh Edara /* Instruction Header - for OCTEON-TX models */ 126423c8a29SSathesh Edara typedef union otx_ep_instr_ih { 127423c8a29SSathesh Edara uint64_t u64; 128423c8a29SSathesh Edara struct { 129423c8a29SSathesh Edara /** Data Len */ 130423c8a29SSathesh Edara uint64_t tlen:16; 131423c8a29SSathesh Edara 132423c8a29SSathesh Edara /** Reserved */ 133423c8a29SSathesh Edara uint64_t rsvd:20; 134423c8a29SSathesh Edara 135423c8a29SSathesh Edara /** PKIND for OTX_EP */ 136423c8a29SSathesh Edara uint64_t pkind:6; 137423c8a29SSathesh Edara 138423c8a29SSathesh Edara /** Front Data size */ 139423c8a29SSathesh Edara uint64_t fsz:6; 140423c8a29SSathesh Edara 141423c8a29SSathesh Edara /** No. of entries in gather list */ 142423c8a29SSathesh Edara uint64_t gsz:14; 143423c8a29SSathesh Edara 144423c8a29SSathesh Edara /** Gather indicator 1=gather*/ 145423c8a29SSathesh Edara uint64_t gather:1; 146423c8a29SSathesh Edara 147423c8a29SSathesh Edara /** Reserved3 */ 148423c8a29SSathesh Edara uint64_t reserved3:1; 149423c8a29SSathesh Edara } s; 150423c8a29SSathesh Edara } otx_ep_instr_ih_t; 151423c8a29SSathesh Edara 1523db81df3SVamsi Attunuru struct otx_ep_sg_entry { 1533db81df3SVamsi Attunuru /** The first 64 bit gives the size of data in each dptr. */ 1543db81df3SVamsi Attunuru union { 1553db81df3SVamsi Attunuru uint16_t size[OTX_EP_NUM_SG_PTRS]; 1563db81df3SVamsi Attunuru uint64_t size64; 1573db81df3SVamsi Attunuru } u; 1583db81df3SVamsi Attunuru 1593db81df3SVamsi Attunuru /** The 4 dptr pointers for this entry. */ 1603db81df3SVamsi Attunuru uint64_t ptr[OTX_EP_NUM_SG_PTRS]; 1613db81df3SVamsi Attunuru }; 1623db81df3SVamsi Attunuru 1633db81df3SVamsi Attunuru #define OTX_EP_SG_ENTRY_SIZE (sizeof(struct otx_ep_sg_entry)) 1643db81df3SVamsi Attunuru 1653db81df3SVamsi Attunuru /** Structure of a node in list of gather components maintained by 1663db81df3SVamsi Attunuru * driver for each network device. 1673db81df3SVamsi Attunuru */ 1683db81df3SVamsi Attunuru struct otx_ep_gather { 1693db81df3SVamsi Attunuru /** number of gather entries. */ 1703db81df3SVamsi Attunuru int num_sg; 1713db81df3SVamsi Attunuru 1723db81df3SVamsi Attunuru /** Gather component that can accommodate max sized fragment list 1733db81df3SVamsi Attunuru * received from the IP layer. 1743db81df3SVamsi Attunuru */ 1753db81df3SVamsi Attunuru struct otx_ep_sg_entry *sg; 1763db81df3SVamsi Attunuru }; 1773db81df3SVamsi Attunuru 1783db81df3SVamsi Attunuru struct otx_ep_buf_free_info { 1793db81df3SVamsi Attunuru struct rte_mbuf *mbuf; 1803db81df3SVamsi Attunuru struct otx_ep_gather g; 1813db81df3SVamsi Attunuru }; 1823db81df3SVamsi Attunuru 183423c8a29SSathesh Edara /* OTX_EP IQ request list */ 184423c8a29SSathesh Edara struct otx_ep_instr_list { 1853db81df3SVamsi Attunuru struct otx_ep_buf_free_info finfo; 186423c8a29SSathesh Edara uint32_t reqtype; 187423c8a29SSathesh Edara }; 188423c8a29SSathesh Edara #define OTX_EP_IQREQ_LIST_SIZE (sizeof(struct otx_ep_instr_list)) 189423c8a29SSathesh Edara 190423c8a29SSathesh Edara /* Input Queue statistics. Each input queue has four stats fields. */ 191423c8a29SSathesh Edara struct otx_ep_iq_stats { 192423c8a29SSathesh Edara uint64_t instr_posted; /* Instructions posted to this queue. */ 193423c8a29SSathesh Edara uint64_t instr_processed; /* Instructions processed in this queue. */ 194423c8a29SSathesh Edara uint64_t instr_dropped; /* Instructions that could not be processed */ 195423c8a29SSathesh Edara uint64_t tx_pkts; 196423c8a29SSathesh Edara uint64_t tx_bytes; 197423c8a29SSathesh Edara }; 198423c8a29SSathesh Edara 199423c8a29SSathesh Edara /* Structure to define the configuration attributes for each Input queue. */ 200423c8a29SSathesh Edara struct otx_ep_iq_config { 201423c8a29SSathesh Edara /* Max number of IQs available */ 202423c8a29SSathesh Edara uint16_t max_iqs; 203423c8a29SSathesh Edara 204423c8a29SSathesh Edara /* Command size - 32 or 64 bytes */ 205423c8a29SSathesh Edara uint16_t instr_type; 206423c8a29SSathesh Edara 207423c8a29SSathesh Edara /* Pending list size, usually set to the sum of the size of all IQs */ 208423c8a29SSathesh Edara uint32_t pending_list_size; 209423c8a29SSathesh Edara }; 210423c8a29SSathesh Edara 211423c8a29SSathesh Edara /** The instruction (input) queue. 212423c8a29SSathesh Edara * The input queue is used to post raw (instruction) mode data or packet data 213423c8a29SSathesh Edara * to OCTEON 9 device from the host. Each IQ of a OTX_EP EP VF device has one 214423c8a29SSathesh Edara * such structure to represent it. 215423c8a29SSathesh Edara */ 216423c8a29SSathesh Edara struct otx_ep_instr_queue { 21735dee56cSVamsi Attunuru /* Location in memory updated by SDP ISM */ 218e12a0166STyler Retzlaff RTE_ATOMIC(uint32_t) *inst_cnt_ism; 21935dee56cSVamsi Attunuru struct rte_mbuf **mbuf_list; 22035dee56cSVamsi Attunuru /* Pointer to the Virtual Base addr of the input ring. */ 22135dee56cSVamsi Attunuru uint8_t *base_addr; 22235dee56cSVamsi Attunuru 22335dee56cSVamsi Attunuru /* track inst count locally to consolidate HW counter updates */ 224831cf744SVamsi Attunuru uint32_t inst_cnt_prev; 22535dee56cSVamsi Attunuru 22635dee56cSVamsi Attunuru /* Input ring index, where the driver should write the next packet */ 22735dee56cSVamsi Attunuru uint32_t host_write_index; 22835dee56cSVamsi Attunuru 22935dee56cSVamsi Attunuru /* Input ring index, where the OCTEON 9 should read the next packet */ 23035dee56cSVamsi Attunuru uint32_t otx_read_index; 23135dee56cSVamsi Attunuru /** This index aids in finding the window in the queue where OCTEON 9 23235dee56cSVamsi Attunuru * has read the commands. 23335dee56cSVamsi Attunuru */ 23435dee56cSVamsi Attunuru uint32_t flush_index; 23535dee56cSVamsi Attunuru /* This keeps track of the instructions pending in this queue. */ 23635dee56cSVamsi Attunuru uint64_t instr_pending; 23735dee56cSVamsi Attunuru 23835dee56cSVamsi Attunuru /* Memory zone */ 23935dee56cSVamsi Attunuru const struct rte_memzone *iq_mz; 24035dee56cSVamsi Attunuru /* OTX_EP doorbell register for the ring. */ 24135dee56cSVamsi Attunuru void *doorbell_reg; 24235dee56cSVamsi Attunuru 24335dee56cSVamsi Attunuru /* OTX_EP instruction count register for this ring. */ 24435dee56cSVamsi Attunuru void *inst_cnt_reg; 24535dee56cSVamsi Attunuru 24635dee56cSVamsi Attunuru /* Number of instructions pending to be posted to OCTEON 9. */ 24735dee56cSVamsi Attunuru uint32_t fill_cnt; 24835dee56cSVamsi Attunuru 249423c8a29SSathesh Edara struct otx_ep_device *otx_ep_dev; 250423c8a29SSathesh Edara 251423c8a29SSathesh Edara uint32_t q_no; 252423c8a29SSathesh Edara uint32_t pkt_in_done; 253423c8a29SSathesh Edara 254423c8a29SSathesh Edara /* Flag for 64 byte commands. */ 255423c8a29SSathesh Edara uint32_t iqcmd_64B:1; 256423c8a29SSathesh Edara uint32_t rsvd:17; 257423c8a29SSathesh Edara uint32_t status:8; 258423c8a29SSathesh Edara 259423c8a29SSathesh Edara /* Number of descriptors in this ring. */ 260423c8a29SSathesh Edara uint32_t nb_desc; 261423c8a29SSathesh Edara 262831cf744SVamsi Attunuru /* Use ISM memory */ 263831cf744SVamsi Attunuru uint8_t ism_ena; 264831cf744SVamsi Attunuru 265e9405625SShijith Thotton /* Size of the descriptor. */ 266e9405625SShijith Thotton uint8_t desc_size; 267e9405625SShijith Thotton 268423c8a29SSathesh Edara uint32_t reset_instr_cnt; 269423c8a29SSathesh Edara 270d360d7bfSSathesh Edara /* Free-running/wrapping instruction counter for IQ. */ 271d360d7bfSSathesh Edara uint32_t inst_cnt; 272d360d7bfSSathesh Edara 27335dee56cSVamsi Attunuru uint64_t partial_ih; 274423c8a29SSathesh Edara 275423c8a29SSathesh Edara /* This IQ request list */ 276423c8a29SSathesh Edara struct otx_ep_instr_list *req_list; 277423c8a29SSathesh Edara 278423c8a29SSathesh Edara /* Statistics for this input queue. */ 279423c8a29SSathesh Edara struct otx_ep_iq_stats stats; 280423c8a29SSathesh Edara 281423c8a29SSathesh Edara /* DMA mapped base address of the input descriptor ring. */ 282423c8a29SSathesh Edara uint64_t base_addr_dma; 283423c8a29SSathesh Edara }; 284423c8a29SSathesh Edara 285423c8a29SSathesh Edara /** Descriptor format. 286423c8a29SSathesh Edara * The descriptor ring is made of descriptors which have 2 64-bit values: 287423c8a29SSathesh Edara * -# Physical (bus) address of the data buffer. 288423c8a29SSathesh Edara * -# Physical (bus) address of a otx_ep_droq_info structure. 289423c8a29SSathesh Edara * The device DMA's incoming packets and its information at the address 290423c8a29SSathesh Edara * given by these descriptor fields. 291423c8a29SSathesh Edara */ 292423c8a29SSathesh Edara struct otx_ep_droq_desc { 293423c8a29SSathesh Edara /* The buffer pointer */ 294423c8a29SSathesh Edara uint64_t buffer_ptr; 295423c8a29SSathesh Edara 296423c8a29SSathesh Edara /* The Info pointer */ 297423c8a29SSathesh Edara uint64_t info_ptr; 298423c8a29SSathesh Edara }; 299423c8a29SSathesh Edara #define OTX_EP_DROQ_DESC_SIZE (sizeof(struct otx_ep_droq_desc)) 300423c8a29SSathesh Edara 301423c8a29SSathesh Edara /* Receive Header */ 302423c8a29SSathesh Edara union otx_ep_rh { 303423c8a29SSathesh Edara uint64_t rh64; 304423c8a29SSathesh Edara }; 305423c8a29SSathesh Edara #define OTX_EP_RH_SIZE (sizeof(union otx_ep_rh)) 306423c8a29SSathesh Edara 307423c8a29SSathesh Edara /** Information about packet DMA'ed by OCTEON 9. 308423c8a29SSathesh Edara * The format of the information available at Info Pointer after OCTEON 9 309423c8a29SSathesh Edara * has posted a packet. Not all descriptors have valid information. Only 310423c8a29SSathesh Edara * the Info field of the first descriptor for a packet has information 311423c8a29SSathesh Edara * about the packet. 312423c8a29SSathesh Edara */ 313423c8a29SSathesh Edara struct otx_ep_droq_info { 314423c8a29SSathesh Edara /* The Length of the packet. */ 315423c8a29SSathesh Edara uint64_t length; 316423c8a29SSathesh Edara 317423c8a29SSathesh Edara /* The Output Receive Header. */ 318423c8a29SSathesh Edara union otx_ep_rh rh; 319423c8a29SSathesh Edara }; 320423c8a29SSathesh Edara #define OTX_EP_DROQ_INFO_SIZE (sizeof(struct otx_ep_droq_info)) 321423c8a29SSathesh Edara 322423c8a29SSathesh Edara /* DROQ statistics. Each output queue has four stats fields. */ 323423c8a29SSathesh Edara struct otx_ep_droq_stats { 324423c8a29SSathesh Edara /* Number of packets received in this queue. */ 325423c8a29SSathesh Edara uint64_t pkts_received; 326423c8a29SSathesh Edara 327423c8a29SSathesh Edara /* Bytes received by this queue. */ 328423c8a29SSathesh Edara uint64_t bytes_received; 329423c8a29SSathesh Edara 330423c8a29SSathesh Edara /* Num of failures of rte_pktmbuf_alloc() */ 331423c8a29SSathesh Edara uint64_t rx_alloc_failure; 332423c8a29SSathesh Edara 333423c8a29SSathesh Edara /* Rx error */ 334423c8a29SSathesh Edara uint64_t rx_err; 335423c8a29SSathesh Edara 336423c8a29SSathesh Edara /* packets with data got ready after interrupt arrived */ 337423c8a29SSathesh Edara uint64_t pkts_delayed_data; 338423c8a29SSathesh Edara 339423c8a29SSathesh Edara /* packets dropped due to zero length */ 340423c8a29SSathesh Edara uint64_t dropped_zlp; 341423c8a29SSathesh Edara }; 342423c8a29SSathesh Edara 343423c8a29SSathesh Edara /* Structure to define the configuration attributes for each Output queue. */ 344423c8a29SSathesh Edara struct otx_ep_oq_config { 345423c8a29SSathesh Edara /* Max number of OQs available */ 346423c8a29SSathesh Edara uint16_t max_oqs; 347423c8a29SSathesh Edara 348423c8a29SSathesh Edara /* If set, the Output queue uses info-pointer mode. (Default: 1 ) */ 349423c8a29SSathesh Edara uint16_t info_ptr; 350423c8a29SSathesh Edara 351423c8a29SSathesh Edara /** The number of buffers that were consumed during packet processing by 352423c8a29SSathesh Edara * the driver on this Output queue before the driver attempts to 353423c8a29SSathesh Edara * replenish the descriptor ring with new buffers. 354423c8a29SSathesh Edara */ 355423c8a29SSathesh Edara uint32_t refill_threshold; 356423c8a29SSathesh Edara }; 357423c8a29SSathesh Edara 358423c8a29SSathesh Edara /* The Descriptor Ring Output Queue(DROQ) structure. */ 359423c8a29SSathesh Edara struct otx_ep_droq { 360423c8a29SSathesh Edara /* The 8B aligned descriptor ring starts at this address. */ 361423c8a29SSathesh Edara struct otx_ep_droq_desc *desc_ring; 362423c8a29SSathesh Edara 36335dee56cSVamsi Attunuru /* The 8B aligned info ptrs begin from this address. */ 36435dee56cSVamsi Attunuru struct otx_ep_droq_info *info_list; 365423c8a29SSathesh Edara 36635dee56cSVamsi Attunuru /* receive buffer list contains mbuf ptr list */ 36735dee56cSVamsi Attunuru struct rte_mbuf **recv_buf_list; 36835dee56cSVamsi Attunuru 369c30d99d2SPavan Nikhilesh /* Packet re-arm data. */ 370c30d99d2SPavan Nikhilesh uint64_t rearm_data; 371c30d99d2SPavan Nikhilesh 37235dee56cSVamsi Attunuru /* Packets pending to be processed */ 37335dee56cSVamsi Attunuru uint64_t pkts_pending; 374423c8a29SSathesh Edara 375423c8a29SSathesh Edara /* Driver should read the next packet at this index */ 376423c8a29SSathesh Edara uint32_t read_idx; 377423c8a29SSathesh Edara 378423c8a29SSathesh Edara /* OCTEON 9 will write the next packet at this index */ 379423c8a29SSathesh Edara uint32_t write_idx; 380423c8a29SSathesh Edara 381423c8a29SSathesh Edara /* At this index, the driver will refill the descriptor's buffer */ 382423c8a29SSathesh Edara uint32_t refill_idx; 383423c8a29SSathesh Edara 38435dee56cSVamsi Attunuru /* The number of descriptors pending to refill. */ 38535dee56cSVamsi Attunuru uint32_t refill_count; 386423c8a29SSathesh Edara 387423c8a29SSathesh Edara /* Number of descriptors in this ring. */ 388423c8a29SSathesh Edara uint32_t nb_desc; 389423c8a29SSathesh Edara 390423c8a29SSathesh Edara uint32_t refill_threshold; 391423c8a29SSathesh Edara 39235dee56cSVamsi Attunuru uint64_t last_pkt_count; 393423c8a29SSathesh Edara 39435dee56cSVamsi Attunuru struct rte_mempool *mpool; 395423c8a29SSathesh Edara 396423c8a29SSathesh Edara /* The size of each buffer pointed by the buffer pointer. */ 397423c8a29SSathesh Edara uint32_t buffer_size; 398423c8a29SSathesh Edara 399423c8a29SSathesh Edara /** Pointer to the mapped packet credit register. 400423c8a29SSathesh Edara * Host writes number of info/buffer ptrs available to this register 401423c8a29SSathesh Edara */ 402423c8a29SSathesh Edara void *pkts_credit_reg; 403423c8a29SSathesh Edara 404423c8a29SSathesh Edara /** Pointer to the mapped packet sent register. OCTEON 9 writes the 405423c8a29SSathesh Edara * number of packets DMA'ed to host memory in this register. 406423c8a29SSathesh Edara */ 407423c8a29SSathesh Edara void *pkts_sent_reg; 408423c8a29SSathesh Edara 409831cf744SVamsi Attunuru /* Use ISM memory */ 410831cf744SVamsi Attunuru uint8_t ism_ena; 411831cf744SVamsi Attunuru 41235dee56cSVamsi Attunuru /* Pointer to host memory copy of output packet count, set by ISM */ 413e12a0166STyler Retzlaff RTE_ATOMIC(uint32_t) *pkts_sent_ism; 414831cf744SVamsi Attunuru uint32_t pkts_sent_prev; 41535dee56cSVamsi Attunuru 41635dee56cSVamsi Attunuru /* Statistics for this DROQ. */ 41735dee56cSVamsi Attunuru struct otx_ep_droq_stats stats; 41835dee56cSVamsi Attunuru 419742a8c3cSSathesh Edara /** Handle DMA incompletion during pkt reads. 420742a8c3cSSathesh Edara * This variable is used to initiate a sent_reg_read 421742a8c3cSSathesh Edara * that completes pending dma 422742a8c3cSSathesh Edara * this variable is used as lvalue so compiler cannot optimize 423742a8c3cSSathesh Edara * the reads. 424742a8c3cSSathesh Edara */ 425742a8c3cSSathesh Edara uint32_t sent_reg_val; 426742a8c3cSSathesh Edara 42735dee56cSVamsi Attunuru uint32_t q_no; 42835dee56cSVamsi Attunuru 42935dee56cSVamsi Attunuru struct otx_ep_device *otx_ep_dev; 430423c8a29SSathesh Edara 431423c8a29SSathesh Edara /* DMA mapped address of the DROQ descriptor ring. */ 432423c8a29SSathesh Edara size_t desc_ring_dma; 433423c8a29SSathesh Edara 434423c8a29SSathesh Edara /* Info_ptr list is allocated at this virtual address. */ 435423c8a29SSathesh Edara size_t info_base_addr; 436423c8a29SSathesh Edara 437423c8a29SSathesh Edara /* DMA mapped address of the info list */ 438423c8a29SSathesh Edara size_t info_list_dma; 439423c8a29SSathesh Edara 440423c8a29SSathesh Edara /* Allocated size of info list. */ 441423c8a29SSathesh Edara uint32_t info_alloc_size; 442423c8a29SSathesh Edara 443423c8a29SSathesh Edara /* Memory zone **/ 444423c8a29SSathesh Edara const struct rte_memzone *desc_ring_mz; 445423c8a29SSathesh Edara 446423c8a29SSathesh Edara const struct rte_memzone *info_mz; 447423c8a29SSathesh Edara }; 448423c8a29SSathesh Edara #define OTX_EP_DROQ_SIZE (sizeof(struct otx_ep_droq)) 449423c8a29SSathesh Edara 450423c8a29SSathesh Edara /* IQ/OQ mask */ 451423c8a29SSathesh Edara struct otx_ep_io_enable { 452423c8a29SSathesh Edara uint64_t iq; 453423c8a29SSathesh Edara uint64_t oq; 454423c8a29SSathesh Edara uint64_t iq64B; 455423c8a29SSathesh Edara }; 456423c8a29SSathesh Edara 457423c8a29SSathesh Edara /* Structure to define the configuration. */ 458423c8a29SSathesh Edara struct otx_ep_config { 459423c8a29SSathesh Edara /* Input Queue attributes. */ 460423c8a29SSathesh Edara struct otx_ep_iq_config iq; 461423c8a29SSathesh Edara 462423c8a29SSathesh Edara /* Output Queue attributes. */ 463423c8a29SSathesh Edara struct otx_ep_oq_config oq; 464423c8a29SSathesh Edara 465423c8a29SSathesh Edara /* Num of desc for IQ rings */ 466423c8a29SSathesh Edara uint32_t num_iqdef_descs; 467423c8a29SSathesh Edara 468423c8a29SSathesh Edara /* Num of desc for OQ rings */ 469423c8a29SSathesh Edara uint32_t num_oqdef_descs; 470423c8a29SSathesh Edara 471423c8a29SSathesh Edara /* OQ buffer size */ 472423c8a29SSathesh Edara uint32_t oqdef_buf_size; 473423c8a29SSathesh Edara }; 474423c8a29SSathesh Edara 475423c8a29SSathesh Edara /* SRIOV information */ 476423c8a29SSathesh Edara struct otx_ep_sriov_info { 477423c8a29SSathesh Edara /* Number of rings assigned to VF */ 478423c8a29SSathesh Edara uint32_t rings_per_vf; 479423c8a29SSathesh Edara 480423c8a29SSathesh Edara /* Number of VF devices enabled */ 481423c8a29SSathesh Edara uint32_t num_vfs; 482423c8a29SSathesh Edara }; 483423c8a29SSathesh Edara 484423c8a29SSathesh Edara /* Required functions for each VF device */ 485423c8a29SSathesh Edara struct otx_ep_fn_list { 486dfa2f825SSathesh Edara int (*setup_iq_regs)(struct otx_ep_device *otx_ep, uint32_t q_no); 487423c8a29SSathesh Edara 488dfa2f825SSathesh Edara int (*setup_oq_regs)(struct otx_ep_device *otx_ep, uint32_t q_no); 489423c8a29SSathesh Edara 490dfa2f825SSathesh Edara int (*setup_device_regs)(struct otx_ep_device *otx_ep); 491423c8a29SSathesh Edara 492423c8a29SSathesh Edara int (*enable_io_queues)(struct otx_ep_device *otx_ep); 493423c8a29SSathesh Edara void (*disable_io_queues)(struct otx_ep_device *otx_ep); 494423c8a29SSathesh Edara 495423c8a29SSathesh Edara int (*enable_iq)(struct otx_ep_device *otx_ep, uint32_t q_no); 496423c8a29SSathesh Edara void (*disable_iq)(struct otx_ep_device *otx_ep, uint32_t q_no); 497423c8a29SSathesh Edara 498423c8a29SSathesh Edara int (*enable_oq)(struct otx_ep_device *otx_ep, uint32_t q_no); 499423c8a29SSathesh Edara void (*disable_oq)(struct otx_ep_device *otx_ep, uint32_t q_no); 5005efa816eSSathesh Edara 5015efa816eSSathesh Edara int (*enable_rxq_intr)(struct otx_ep_device *otx_epvf, uint16_t q_no); 5025efa816eSSathesh Edara int (*disable_rxq_intr)(struct otx_ep_device *otx_epvf, uint16_t q_no); 503423c8a29SSathesh Edara }; 504423c8a29SSathesh Edara 505423c8a29SSathesh Edara /* OTX_EP EP VF device data structure */ 506423c8a29SSathesh Edara struct otx_ep_device { 507423c8a29SSathesh Edara /* PCI device pointer */ 508423c8a29SSathesh Edara struct rte_pci_device *pdev; 509423c8a29SSathesh Edara 510423c8a29SSathesh Edara uint16_t chip_id; 511423c8a29SSathesh Edara 512423c8a29SSathesh Edara uint32_t pkind; 513423c8a29SSathesh Edara 514423c8a29SSathesh Edara struct rte_eth_dev *eth_dev; 515423c8a29SSathesh Edara 516423c8a29SSathesh Edara int port_id; 517423c8a29SSathesh Edara 518423c8a29SSathesh Edara /* Memory mapped h/w address */ 519423c8a29SSathesh Edara uint8_t *hw_addr; 520423c8a29SSathesh Edara 521423c8a29SSathesh Edara struct otx_ep_fn_list fn_list; 522423c8a29SSathesh Edara 523423c8a29SSathesh Edara uint32_t max_tx_queues; 524423c8a29SSathesh Edara 525423c8a29SSathesh Edara uint32_t max_rx_queues; 526423c8a29SSathesh Edara 527423c8a29SSathesh Edara /* Num IQs */ 528423c8a29SSathesh Edara uint32_t nb_tx_queues; 529423c8a29SSathesh Edara 530423c8a29SSathesh Edara /* The input instruction queues */ 531423c8a29SSathesh Edara struct otx_ep_instr_queue *instr_queue[OTX_EP_MAX_IOQS_PER_VF]; 532423c8a29SSathesh Edara 533423c8a29SSathesh Edara /* Num OQs */ 534423c8a29SSathesh Edara uint32_t nb_rx_queues; 535423c8a29SSathesh Edara 536423c8a29SSathesh Edara /* The DROQ output queues */ 537423c8a29SSathesh Edara struct otx_ep_droq *droq[OTX_EP_MAX_IOQS_PER_VF]; 538423c8a29SSathesh Edara 539423c8a29SSathesh Edara /* IOQ mask */ 540423c8a29SSathesh Edara struct otx_ep_io_enable io_qmask; 541423c8a29SSathesh Edara 542423c8a29SSathesh Edara /* SR-IOV info */ 543423c8a29SSathesh Edara struct otx_ep_sriov_info sriov_info; 544423c8a29SSathesh Edara 545423c8a29SSathesh Edara /* Device configuration */ 546423c8a29SSathesh Edara const struct otx_ep_config *conf; 547423c8a29SSathesh Edara 548423c8a29SSathesh Edara uint64_t rx_offloads; 549423c8a29SSathesh Edara 550423c8a29SSathesh Edara uint64_t tx_offloads; 551d360d7bfSSathesh Edara 552d360d7bfSSathesh Edara /* DMA buffer for SDP ISM messages */ 553d360d7bfSSathesh Edara const struct rte_memzone *ism_buffer_mz; 554c836a7baSSathesh Edara 555c836a7baSSathesh Edara /* Mailbox lock */ 556c836a7baSSathesh Edara rte_spinlock_t mbox_lock; 557c836a7baSSathesh Edara 558c836a7baSSathesh Edara /* Mailbox data */ 559c836a7baSSathesh Edara uint8_t mbox_data_buf[MBOX_MAX_DATA_BUF_SIZE]; 560c836a7baSSathesh Edara 561c836a7baSSathesh Edara /* Mailbox data index */ 562c836a7baSSathesh Edara int32_t mbox_data_index; 563c836a7baSSathesh Edara 564c836a7baSSathesh Edara /* Mailbox receive message length */ 565c836a7baSSathesh Edara int32_t mbox_rcv_message_len; 566cab13b70SSathesh Edara 567cab13b70SSathesh Edara /* Negotiated Mbox version */ 568cab13b70SSathesh Edara uint32_t mbox_neg_ver; 56935dee56cSVamsi Attunuru 57035dee56cSVamsi Attunuru /* Generation */ 57135dee56cSVamsi Attunuru uint32_t chip_gen; 572831cf744SVamsi Attunuru 573831cf744SVamsi Attunuru /* Use ISM memory */ 574831cf744SVamsi Attunuru uint8_t ism_ena; 575423c8a29SSathesh Edara }; 576423c8a29SSathesh Edara 577423c8a29SSathesh Edara int otx_ep_setup_iqs(struct otx_ep_device *otx_ep, uint32_t iq_no, 578423c8a29SSathesh Edara int num_descs, unsigned int socket_id); 579423c8a29SSathesh Edara int otx_ep_delete_iqs(struct otx_ep_device *otx_ep, uint32_t iq_no); 580423c8a29SSathesh Edara 581423c8a29SSathesh Edara int otx_ep_setup_oqs(struct otx_ep_device *otx_ep, int oq_no, int num_descs, 582423c8a29SSathesh Edara int desc_size, struct rte_mempool *mpool, 583423c8a29SSathesh Edara unsigned int socket_id); 584423c8a29SSathesh Edara int otx_ep_delete_oqs(struct otx_ep_device *otx_ep, uint32_t oq_no); 585423c8a29SSathesh Edara 5865efa816eSSathesh Edara #define OTX_EP_MAX_PKT_SZ 65498U 587423c8a29SSathesh Edara #define OTX_EP_MAX_MAC_ADDRS 1 588423c8a29SSathesh Edara #define OTX_EP_SG_ALIGN 8 589423c8a29SSathesh Edara #define OTX_EP_CLEAR_ISIZE_BSIZE 0x7FFFFFULL 590423c8a29SSathesh Edara #define OTX_EP_CLEAR_OUT_INT_LVLS 0x3FFFFFFFFFFFFFULL 591423c8a29SSathesh Edara #define OTX_EP_CLEAR_IN_INT_LVLS 0xFFFFFFFF 592423c8a29SSathesh Edara #define OTX_EP_CLEAR_SDP_IN_INT_LVLS 0x3FFFFFFFFFFFFFUL 593423c8a29SSathesh Edara #define OTX_EP_DROQ_BUFSZ_MASK 0xFFFF 594423c8a29SSathesh Edara #define OTX_EP_CLEAR_SLIST_DBELL 0xFFFFFFFF 595423c8a29SSathesh Edara #define OTX_EP_CLEAR_SDP_OUT_PKT_CNT 0xFFFFFFFFF 596423c8a29SSathesh Edara 597c836a7baSSathesh Edara /* Max overhead includes 598c836a7baSSathesh Edara * - Ethernet hdr 599c836a7baSSathesh Edara * - CRC 600c836a7baSSathesh Edara * - nested VLANs 601c836a7baSSathesh Edara * - octeon rx info 602c836a7baSSathesh Edara */ 603c836a7baSSathesh Edara #define OTX_EP_ETH_OVERHEAD \ 604c836a7baSSathesh Edara (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + \ 605c836a7baSSathesh Edara (2 * RTE_VLAN_HLEN) + OTX_EP_DROQ_INFO_SIZE) 606c836a7baSSathesh Edara 607423c8a29SSathesh Edara /* PCI IDs */ 608423c8a29SSathesh Edara #define PCI_VENDOR_ID_CAVIUM 0x177D 609423c8a29SSathesh Edara 610423c8a29SSathesh Edara extern int otx_net_ep_logtype; 6113178e37cSDavid Marchand #define RTE_LOGTYPE_OTX_NET_EP otx_net_ep_logtype 6123178e37cSDavid Marchand 613423c8a29SSathesh Edara #endif /* _OTX_EP_COMMON_H_ */ 614