dpdk/drivers/net/octeontx_ep/otx_ep_common.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(C) 2021 Marvell.
   3 */
   4#ifndef _OTX_EP_COMMON_H_
   5#define _OTX_EP_COMMON_H_
   6
   7
   8#define OTX_EP_NW_PKT_OP               0x1220
   9#define OTX_EP_NW_CMD_OP               0x1221
  10
  11#define OTX_EP_MAX_RINGS_PER_VF        (8)
  12#define OTX_EP_CFG_IO_QUEUES        OTX_EP_MAX_RINGS_PER_VF
  13#define OTX_EP_64BYTE_INSTR         (64)
  14#define OTX_EP_MIN_IQ_DESCRIPTORS   (128)
  15#define OTX_EP_MIN_OQ_DESCRIPTORS   (128)
  16#define OTX_EP_MAX_IQ_DESCRIPTORS   (8192)
  17#define OTX_EP_MAX_OQ_DESCRIPTORS   (8192)
  18#define OTX_EP_OQ_BUF_SIZE          (2048)
  19#define OTX_EP_MIN_RX_BUF_SIZE      (64)
  20
  21#define OTX_EP_OQ_INFOPTR_MODE      (0)
  22#define OTX_EP_OQ_REFIL_THRESHOLD   (16)
  23
  24/* IQ instruction req types */
  25#define OTX_EP_REQTYPE_NONE             (0)
  26#define OTX_EP_REQTYPE_NORESP_INSTR     (1)
  27#define OTX_EP_REQTYPE_NORESP_NET_DIRECT       (2)
  28#define OTX_EP_REQTYPE_NORESP_NET       OTX_EP_REQTYPE_NORESP_NET_DIRECT
  29#define OTX_EP_REQTYPE_NORESP_GATHER    (3)
  30#define OTX_EP_NORESP_OHSM_SEND     (4)
  31#define OTX_EP_NORESP_LAST          (4)
  32#define OTX_EP_PCI_RING_ALIGN   65536
  33#define SDP_PKIND 40
  34#define SDP_OTX2_PKIND 57
  35
  36#define      ORDERED_TAG 0
  37#define      ATOMIC_TAG  1
  38#define      NULL_TAG  2
  39#define      NULL_NULL_TAG  3
  40
  41#define OTX_EP_BUSY_LOOP_COUNT      (10000)
  42#define OTX_EP_MAX_IOQS_PER_VF 8
  43#define OTX_CUST_DATA_LEN 0
  44
  45#define otx_ep_info(fmt, args...)                               \
  46        rte_log(RTE_LOG_INFO, otx_net_ep_logtype,               \
  47                "%s():%u " fmt "\n",                            \
  48                __func__, __LINE__, ##args)
  49
  50#define otx_ep_err(fmt, args...)                                \
  51        rte_log(RTE_LOG_ERR, otx_net_ep_logtype,                \
  52                "%s():%u " fmt "\n",                            \
  53                __func__, __LINE__, ##args)
  54
  55#define otx_ep_dbg(fmt, args...)                                \
  56        rte_log(RTE_LOG_DEBUG, otx_net_ep_logtype,              \
  57                "%s():%u " fmt "\n",                            \
  58                __func__, __LINE__, ##args)
  59
  60/* Input Request Header format */
  61union otx_ep_instr_irh {
  62        uint64_t u64;
  63        struct {
  64                /* Request ID  */
  65                uint64_t rid:16;
  66
  67                /* PCIe port to use for response */
  68                uint64_t pcie_port:3;
  69
  70                /* Scatter indicator  1=scatter */
  71                uint64_t scatter:1;
  72
  73                /* Size of Expected result OR no. of entries in scatter list */
  74                uint64_t rlenssz:14;
  75
  76                /* Desired destination port for result */
  77                uint64_t dport:6;
  78
  79                /* Opcode Specific parameters */
  80                uint64_t param:8;
  81
  82                /* Opcode for the return packet  */
  83                uint64_t opcode:16;
  84        } s;
  85};
  86
  87#define otx_ep_write64(value, base_addr, reg_off) \
  88        {\
  89        typeof(value) val = (value); \
  90        typeof(reg_off) off = (reg_off); \
  91        otx_ep_dbg("octeon_write_csr64: reg: 0x%08lx val: 0x%016llx\n", \
  92                   (unsigned long)off, (unsigned long long)val); \
  93        rte_write64(val, ((base_addr) + off)); \
  94        }
  95
  96/* Instruction Header - for OCTEON-TX models */
  97typedef union otx_ep_instr_ih {
  98        uint64_t u64;
  99        struct {
 100          /** Data Len */
 101                uint64_t tlen:16;
 102
 103          /** Reserved */
 104                uint64_t rsvd:20;
 105
 106          /** PKIND for OTX_EP */
 107                uint64_t pkind:6;
 108
 109          /** Front Data size */
 110                uint64_t fsz:6;
 111
 112          /** No. of entries in gather list */
 113                uint64_t gsz:14;
 114
 115          /** Gather indicator 1=gather*/
 116                uint64_t gather:1;
 117
 118          /** Reserved3 */
 119                uint64_t reserved3:1;
 120        } s;
 121} otx_ep_instr_ih_t;
 122
 123/* OTX_EP IQ request list */
 124struct otx_ep_instr_list {
 125        void *buf;
 126        uint32_t reqtype;
 127};
 128#define OTX_EP_IQREQ_LIST_SIZE  (sizeof(struct otx_ep_instr_list))
 129
 130/* Input Queue statistics. Each input queue has four stats fields. */
 131struct otx_ep_iq_stats {
 132        uint64_t instr_posted; /* Instructions posted to this queue. */
 133        uint64_t instr_processed; /* Instructions processed in this queue. */
 134        uint64_t instr_dropped; /* Instructions that could not be processed */
 135        uint64_t tx_pkts;
 136        uint64_t tx_bytes;
 137};
 138
 139/* Structure to define the configuration attributes for each Input queue. */
 140struct otx_ep_iq_config {
 141        /* Max number of IQs available */
 142        uint16_t max_iqs;
 143
 144        /* Command size - 32 or 64 bytes */
 145        uint16_t instr_type;
 146
 147        /* Pending list size, usually set to the sum of the size of all IQs */
 148        uint32_t pending_list_size;
 149};
 150
 151/** The instruction (input) queue.
 152 *  The input queue is used to post raw (instruction) mode data or packet data
 153 *  to OCTEON TX2 device from the host. Each IQ of a OTX_EP EP VF device has one
 154 *  such structure to represent it.
 155 */
 156struct otx_ep_instr_queue {
 157        struct otx_ep_device *otx_ep_dev;
 158
 159        uint32_t q_no;
 160        uint32_t pkt_in_done;
 161
 162        /* Flag for 64 byte commands. */
 163        uint32_t iqcmd_64B:1;
 164        uint32_t rsvd:17;
 165        uint32_t status:8;
 166
 167        /* Number of  descriptors in this ring. */
 168        uint32_t nb_desc;
 169
 170        /* Input ring index, where the driver should write the next packet */
 171        uint32_t host_write_index;
 172
 173        /* Input ring index, where the OCTEON TX2 should read the next packet */
 174        uint32_t otx_read_index;
 175
 176        uint32_t reset_instr_cnt;
 177
 178        /** This index aids in finding the window in the queue where OCTEON TX2
 179         *  has read the commands.
 180         */
 181        uint32_t flush_index;
 182
 183        /* This keeps track of the instructions pending in this queue. */
 184        uint64_t instr_pending;
 185
 186        /* Pointer to the Virtual Base addr of the input ring. */
 187        uint8_t *base_addr;
 188
 189        /* This IQ request list */
 190        struct otx_ep_instr_list *req_list;
 191
 192        /* OTX_EP doorbell register for the ring. */
 193        void *doorbell_reg;
 194
 195        /* OTX_EP instruction count register for this ring. */
 196        void *inst_cnt_reg;
 197
 198        /* Number of instructions pending to be posted to OCTEON TX2. */
 199        uint32_t fill_cnt;
 200
 201        /* Statistics for this input queue. */
 202        struct otx_ep_iq_stats stats;
 203
 204        /* DMA mapped base address of the input descriptor ring. */
 205        uint64_t base_addr_dma;
 206
 207        /* Memory zone */
 208        const struct rte_memzone *iq_mz;
 209};
 210
 211/** Descriptor format.
 212 *  The descriptor ring is made of descriptors which have 2 64-bit values:
 213 *  -# Physical (bus) address of the data buffer.
 214 *  -# Physical (bus) address of a otx_ep_droq_info structure.
 215 *  The device DMA's incoming packets and its information at the address
 216 *  given by these descriptor fields.
 217 */
 218struct otx_ep_droq_desc {
 219        /* The buffer pointer */
 220        uint64_t buffer_ptr;
 221
 222        /* The Info pointer */
 223        uint64_t info_ptr;
 224};
 225#define OTX_EP_DROQ_DESC_SIZE   (sizeof(struct otx_ep_droq_desc))
 226
 227/* Receive Header */
 228union otx_ep_rh {
 229        uint64_t rh64;
 230};
 231#define OTX_EP_RH_SIZE (sizeof(union otx_ep_rh))
 232
 233/** Information about packet DMA'ed by OCTEON TX2.
 234 *  The format of the information available at Info Pointer after OCTEON TX2
 235 *  has posted a packet. Not all descriptors have valid information. Only
 236 *  the Info field of the first descriptor for a packet has information
 237 *  about the packet.
 238 */
 239struct otx_ep_droq_info {
 240        /* The Length of the packet. */
 241        uint64_t length;
 242
 243        /* The Output Receive Header. */
 244        union otx_ep_rh rh;
 245};
 246#define OTX_EP_DROQ_INFO_SIZE   (sizeof(struct otx_ep_droq_info))
 247
 248/* DROQ statistics. Each output queue has four stats fields. */
 249struct otx_ep_droq_stats {
 250        /* Number of packets received in this queue. */
 251        uint64_t pkts_received;
 252
 253        /* Bytes received by this queue. */
 254        uint64_t bytes_received;
 255
 256        /* Num of failures of rte_pktmbuf_alloc() */
 257        uint64_t rx_alloc_failure;
 258
 259        /* Rx error */
 260        uint64_t rx_err;
 261
 262        /* packets with data got ready after interrupt arrived */
 263        uint64_t pkts_delayed_data;
 264
 265        /* packets dropped due to zero length */
 266        uint64_t dropped_zlp;
 267};
 268
 269/* Structure to define the configuration attributes for each Output queue. */
 270struct otx_ep_oq_config {
 271        /* Max number of OQs available */
 272        uint16_t max_oqs;
 273
 274        /* If set, the Output queue uses info-pointer mode. (Default: 1 ) */
 275        uint16_t info_ptr;
 276
 277        /** The number of buffers that were consumed during packet processing by
 278         *  the driver on this Output queue before the driver attempts to
 279         *  replenish the descriptor ring with new buffers.
 280         */
 281        uint32_t refill_threshold;
 282};
 283
 284/* The Descriptor Ring Output Queue(DROQ) structure. */
 285struct otx_ep_droq {
 286        struct otx_ep_device *otx_ep_dev;
 287        /* The 8B aligned descriptor ring starts at this address. */
 288        struct otx_ep_droq_desc *desc_ring;
 289
 290        uint32_t q_no;
 291        uint64_t last_pkt_count;
 292
 293        struct rte_mempool *mpool;
 294
 295        /* Driver should read the next packet at this index */
 296        uint32_t read_idx;
 297
 298        /* OCTEON TX2 will write the next packet at this index */
 299        uint32_t write_idx;
 300
 301        /* At this index, the driver will refill the descriptor's buffer */
 302        uint32_t refill_idx;
 303
 304        /* Packets pending to be processed */
 305        uint64_t pkts_pending;
 306
 307        /* Number of descriptors in this ring. */
 308        uint32_t nb_desc;
 309
 310        /* The number of descriptors pending to refill. */
 311        uint32_t refill_count;
 312
 313        uint32_t refill_threshold;
 314
 315        /* The 8B aligned info ptrs begin from this address. */
 316        struct otx_ep_droq_info *info_list;
 317
 318        /* receive buffer list contains mbuf ptr list */
 319        struct rte_mbuf **recv_buf_list;
 320
 321        /* The size of each buffer pointed by the buffer pointer. */
 322        uint32_t buffer_size;
 323
 324        /** Pointer to the mapped packet credit register.
 325         *  Host writes number of info/buffer ptrs available to this register
 326         */
 327        void *pkts_credit_reg;
 328
 329        /** Pointer to the mapped packet sent register. OCTEON TX2 writes the
 330         *  number of packets DMA'ed to host memory in this register.
 331         */
 332        void *pkts_sent_reg;
 333
 334        /* Statistics for this DROQ. */
 335        struct otx_ep_droq_stats stats;
 336
 337        /* DMA mapped address of the DROQ descriptor ring. */
 338        size_t desc_ring_dma;
 339
 340        /* Info_ptr list is allocated at this virtual address. */
 341        size_t info_base_addr;
 342
 343        /* DMA mapped address of the info list */
 344        size_t info_list_dma;
 345
 346        /* Allocated size of info list. */
 347        uint32_t info_alloc_size;
 348
 349        /* Memory zone **/
 350        const struct rte_memzone *desc_ring_mz;
 351
 352        const struct rte_memzone *info_mz;
 353};
 354#define OTX_EP_DROQ_SIZE                (sizeof(struct otx_ep_droq))
 355
 356/* IQ/OQ mask */
 357struct otx_ep_io_enable {
 358        uint64_t iq;
 359        uint64_t oq;
 360        uint64_t iq64B;
 361};
 362
 363/* Structure to define the configuration. */
 364struct otx_ep_config {
 365        /* Input Queue attributes. */
 366        struct otx_ep_iq_config iq;
 367
 368        /* Output Queue attributes. */
 369        struct otx_ep_oq_config oq;
 370
 371        /* Num of desc for IQ rings */
 372        uint32_t num_iqdef_descs;
 373
 374        /* Num of desc for OQ rings */
 375        uint32_t num_oqdef_descs;
 376
 377        /* OQ buffer size */
 378        uint32_t oqdef_buf_size;
 379};
 380
 381/* SRIOV information */
 382struct otx_ep_sriov_info {
 383        /* Number of rings assigned to VF */
 384        uint32_t rings_per_vf;
 385
 386        /* Number of VF devices enabled */
 387        uint32_t num_vfs;
 388};
 389
 390/* Required functions for each VF device */
 391struct otx_ep_fn_list {
 392        void (*setup_iq_regs)(struct otx_ep_device *otx_ep, uint32_t q_no);
 393
 394        void (*setup_oq_regs)(struct otx_ep_device *otx_ep, uint32_t q_no);
 395
 396        void (*setup_device_regs)(struct otx_ep_device *otx_ep);
 397
 398        int (*enable_io_queues)(struct otx_ep_device *otx_ep);
 399        void (*disable_io_queues)(struct otx_ep_device *otx_ep);
 400
 401        int (*enable_iq)(struct otx_ep_device *otx_ep, uint32_t q_no);
 402        void (*disable_iq)(struct otx_ep_device *otx_ep, uint32_t q_no);
 403
 404        int (*enable_oq)(struct otx_ep_device *otx_ep, uint32_t q_no);
 405        void (*disable_oq)(struct otx_ep_device *otx_ep, uint32_t q_no);
 406};
 407
 408/* OTX_EP EP VF device data structure */
 409struct otx_ep_device {
 410        /* PCI device pointer */
 411        struct rte_pci_device *pdev;
 412
 413        uint16_t chip_id;
 414
 415        uint32_t pkind;
 416
 417        struct rte_eth_dev *eth_dev;
 418
 419        int port_id;
 420
 421        /* Memory mapped h/w address */
 422        uint8_t *hw_addr;
 423
 424        struct otx_ep_fn_list fn_list;
 425
 426        uint32_t max_tx_queues;
 427
 428        uint32_t max_rx_queues;
 429
 430        /* Num IQs */
 431        uint32_t nb_tx_queues;
 432
 433        /* The input instruction queues */
 434        struct otx_ep_instr_queue *instr_queue[OTX_EP_MAX_IOQS_PER_VF];
 435
 436        /* Num OQs */
 437        uint32_t nb_rx_queues;
 438
 439        /* The DROQ output queues  */
 440        struct otx_ep_droq *droq[OTX_EP_MAX_IOQS_PER_VF];
 441
 442        /* IOQ mask */
 443        struct otx_ep_io_enable io_qmask;
 444
 445        /* SR-IOV info */
 446        struct otx_ep_sriov_info sriov_info;
 447
 448        /* Device configuration */
 449        const struct otx_ep_config *conf;
 450
 451        uint64_t rx_offloads;
 452
 453        uint64_t tx_offloads;
 454};
 455
 456int otx_ep_setup_iqs(struct otx_ep_device *otx_ep, uint32_t iq_no,
 457                     int num_descs, unsigned int socket_id);
 458int otx_ep_delete_iqs(struct otx_ep_device *otx_ep, uint32_t iq_no);
 459
 460int otx_ep_setup_oqs(struct otx_ep_device *otx_ep, int oq_no, int num_descs,
 461                     int desc_size, struct rte_mempool *mpool,
 462                     unsigned int socket_id);
 463int otx_ep_delete_oqs(struct otx_ep_device *otx_ep, uint32_t oq_no);
 464
 465struct otx_ep_sg_entry {
 466        /** The first 64 bit gives the size of data in each dptr. */
 467        union {
 468                uint16_t size[4];
 469                uint64_t size64;
 470        } u;
 471
 472        /** The 4 dptr pointers for this entry. */
 473        uint64_t ptr[4];
 474};
 475
 476#define OTX_EP_SG_ENTRY_SIZE    (sizeof(struct otx_ep_sg_entry))
 477
 478/** Structure of a node in list of gather components maintained by
 479 *  driver for each network device.
 480 */
 481struct otx_ep_gather {
 482        /** number of gather entries. */
 483        int num_sg;
 484
 485        /** Gather component that can accommodate max sized fragment list
 486         *  received from the IP layer.
 487         */
 488        struct otx_ep_sg_entry *sg;
 489};
 490
 491struct otx_ep_buf_free_info {
 492        struct rte_mbuf *mbuf;
 493        struct otx_ep_gather g;
 494};
 495
 496#define OTX_EP_MAX_PKT_SZ 64000U
 497#define OTX_EP_MAX_MAC_ADDRS 1
 498#define OTX_EP_SG_ALIGN 8
 499#define OTX_EP_CLEAR_ISIZE_BSIZE 0x7FFFFFULL
 500#define OTX_EP_CLEAR_OUT_INT_LVLS 0x3FFFFFFFFFFFFFULL
 501#define OTX_EP_CLEAR_IN_INT_LVLS 0xFFFFFFFF
 502#define OTX_EP_CLEAR_SDP_IN_INT_LVLS 0x3FFFFFFFFFFFFFUL
 503#define OTX_EP_DROQ_BUFSZ_MASK 0xFFFF
 504#define OTX_EP_CLEAR_SLIST_DBELL 0xFFFFFFFF
 505#define OTX_EP_CLEAR_SDP_OUT_PKT_CNT 0xFFFFFFFFF
 506
 507extern int otx_net_ep_logtype;
 508#endif  /* _OTX_EP_COMMON_H_ */
 509