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 42 struct 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 56 struct 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 64 struct bnxt; 65 struct bnxt_tx_ring_info; 66 struct bnxt_rx_ring_info; 67 struct bnxt_cp_ring_info; 68 void bnxt_free_ring(struct bnxt_ring *ring); 69 int bnxt_alloc_ring_grps(struct bnxt *bp); 70 int 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); 76 int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index); 77 int bnxt_alloc_hwrm_rings(struct bnxt *bp); 78 int bnxt_alloc_async_cp_ring(struct bnxt *bp); 79 void bnxt_free_async_cp_ring(struct bnxt *bp); 80 int bnxt_alloc_async_ring_struct(struct bnxt *bp); 81 int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp); 82 void bnxt_free_rxtx_nq_ring(struct bnxt *bp); 83 84 static 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. */ 101 static 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. */ 115 static 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 127 static 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