dpdk/drivers/net/bnxt/bnxt_ring.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2014-2021 Broadcom
   3 * All rights reserved.
   4 */
   5
   6#ifndef _BNXT_RING_H_
   7#define _BNXT_RING_H_
   8
   9#include <inttypes.h>
  10
  11#include <rte_memory.h>
  12
  13#define RING_ADV(idx, n)                ((idx) + (n))
  14#define RING_NEXT(idx)                  RING_ADV(idx, 1)
  15#define RING_IDX(ring, idx)             ((idx) & (ring)->ring_mask)
  16
  17#define DB_IDX_MASK                                             0xffffff
  18#define DB_IDX_VALID                                            (0x1 << 26)
  19#define DB_IRQ_DIS                                              (0x1 << 27)
  20#define DB_KEY_TX                                               (0x0 << 28)
  21#define DB_KEY_RX                                               (0x1 << 28)
  22#define DB_KEY_CP                                               (0x2 << 28)
  23#define DB_KEY_ST                                               (0x3 << 28)
  24#define DB_KEY_TX_PUSH                                          (0x4 << 28)
  25#define DB_LONG_TX_PUSH                                         (0x2 << 24)
  26
  27#define DEFAULT_CP_RING_SIZE    256
  28#define DEFAULT_RX_RING_SIZE    256
  29#define DEFAULT_TX_RING_SIZE    256
  30
  31#define AGG_RING_SIZE_FACTOR    4
  32#define AGG_RING_MULTIPLIER     2
  33
  34/* These assume 4k pages */
  35#define MAX_RX_DESC_CNT (8 * 1024)
  36#define MAX_TX_DESC_CNT (4 * 1024)
  37#define MAX_CP_DESC_CNT (16 * 1024)
  38
  39#define INVALID_HW_RING_ID      ((uint16_t)-1)
  40#define INVALID_STATS_CTX_ID            ((uint16_t)-1)
  41
  42struct bnxt_ring {
  43        void                    *bd;
  44        rte_iova_t              bd_dma;
  45        uint32_t                ring_size;
  46        uint32_t                ring_mask;
  47
  48        int                     vmem_size;
  49        void                    **vmem;
  50
  51        uint16_t                fw_ring_id; /* Ring id filled by Chimp FW */
  52        uint16_t                fw_rx_ring_id;
  53        const void              *mem_zone;
  54};
  55
  56struct bnxt_ring_grp_info {
  57        uint16_t        fw_stats_ctx;
  58        uint16_t        fw_grp_id;
  59        uint16_t        rx_fw_ring_id;
  60        uint16_t        cp_fw_ring_id;
  61        uint16_t        ag_fw_ring_id;
  62};
  63
  64struct bnxt;
  65struct bnxt_tx_ring_info;
  66struct bnxt_rx_ring_info;
  67struct bnxt_cp_ring_info;
  68void bnxt_free_ring(struct bnxt_ring *ring);
  69int bnxt_alloc_ring_grps(struct bnxt *bp);
  70int bnxt_alloc_rings(struct bnxt *bp, uint16_t qidx,
  71                            struct bnxt_tx_queue *txq,
  72                            struct bnxt_rx_queue *rxq,
  73                            struct bnxt_cp_ring_info *cp_ring_info,
  74                            struct bnxt_cp_ring_info *nq_ring_info,
  75                            const char *suffix);
  76int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index);
  77int bnxt_alloc_hwrm_rings(struct bnxt *bp);
  78int bnxt_alloc_async_cp_ring(struct bnxt *bp);
  79void bnxt_free_async_cp_ring(struct bnxt *bp);
  80int bnxt_alloc_async_ring_struct(struct bnxt *bp);
  81int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp);
  82void bnxt_free_rxtx_nq_ring(struct bnxt *bp);
  83
  84static inline void bnxt_db_write(struct bnxt_db_info *db, uint32_t idx)
  85{
  86        uint32_t db_idx = DB_RING_IDX(db, idx);
  87        void *doorbell = db->doorbell;
  88
  89        if (db->db_64) {
  90                uint64_t key_idx = db->db_key64 | db_idx;
  91
  92                rte_write64(key_idx, doorbell);
  93        } else {
  94                uint32_t key_idx = db->db_key32 | db_idx;
  95
  96                rte_write32(key_idx, doorbell);
  97        }
  98}
  99
 100/* Ring an NQ doorbell and disable interrupts for the ring. */
 101static inline void bnxt_db_nq(struct bnxt_cp_ring_info *cpr)
 102{
 103        uint32_t db_idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
 104        uint64_t key_idx = cpr->cp_db.db_key64 | DBR_TYPE_NQ | db_idx;
 105        void *doorbell = cpr->cp_db.doorbell;
 106
 107
 108        if (unlikely(!cpr->cp_db.db_64))
 109                return;
 110
 111        rte_write64(key_idx, doorbell);
 112}
 113
 114/* Ring an NQ doorbell and enable interrupts for the ring. */
 115static inline void bnxt_db_nq_arm(struct bnxt_cp_ring_info *cpr)
 116{
 117        uint32_t db_idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
 118        uint64_t key_idx = cpr->cp_db.db_key64 | DBR_TYPE_NQ_ARM | db_idx;
 119        void *doorbell = cpr->cp_db.doorbell;
 120
 121        if (unlikely(!cpr->cp_db.db_64))
 122                return;
 123
 124        rte_write64(key_idx, doorbell);
 125}
 126
 127static inline void bnxt_db_cq(struct bnxt_cp_ring_info *cpr)
 128{
 129        struct bnxt_db_info *db = &cpr->cp_db;
 130        uint32_t idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
 131
 132        if (db->db_64) {
 133                uint64_t key_idx = db->db_key64 | idx;
 134                void *doorbell = db->doorbell;
 135
 136                rte_compiler_barrier();
 137                rte_write64_relaxed(key_idx, doorbell);
 138        } else {
 139                uint32_t cp_raw_cons = cpr->cp_raw_cons;
 140
 141                rte_compiler_barrier();
 142                B_CP_DIS_DB(cpr, cp_raw_cons);
 143        }
 144}
 145
 146#endif
 147