Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2014-2023 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 4096 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, unsigned int socket_id, 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 [ # # # # : 0 : uint32_t db_idx = DB_RING_IDX(db, idx); # # # # # # # # # # ] 87 : 0 : void *doorbell = db->doorbell; 88 : : 89 [ # # # # : 0 : if (db->db_64) { # # # # # # # # # # ] 90 : 0 : uint64_t key_idx = db->db_key64 | db_idx; 91 : : 92 : : rte_write64(key_idx, doorbell); 93 : : } else { 94 : 0 : 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 [ # # ]: 0 : uint32_t db_idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons); 104 : 0 : uint64_t key_idx = cpr->cp_db.db_key64 | DBR_TYPE_NQ | db_idx; 105 : 0 : void *doorbell = cpr->cp_db.doorbell; 106 : : 107 : : 108 [ # # # # ]: 0 : 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 [ # # # # ]: 0 : uint32_t db_idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons); 118 : 0 : uint64_t key_idx = cpr->cp_db.db_key64 | DBR_TYPE_NQ_ARM | db_idx; 119 : 0 : void *doorbell = cpr->cp_db.doorbell; 120 : : 121 [ # # # # ]: 0 : if (unlikely(!cpr->cp_db.db_64)) 122 : : return; 123 : : 124 : : rte_write64(key_idx, doorbell); 125 : : } 126 : : 127 : 0 : static inline void bnxt_db_cq(struct bnxt_cp_ring_info *cpr) 128 : : { 129 : : struct bnxt_db_info *db = &cpr->cp_db; 130 [ # # ]: 0 : uint32_t idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons); 131 : : 132 [ # # ]: 0 : if (db->db_64) { 133 : 0 : uint64_t key_idx = db->db_key64 | idx; 134 : 0 : void *doorbell = db->doorbell; 135 : : 136 : 0 : rte_compiler_barrier(); 137 : : rte_write64_relaxed(key_idx, doorbell); 138 : : } else { 139 : : uint32_t cp_raw_cons = cpr->cp_raw_cons; 140 : : 141 : 0 : rte_compiler_barrier(); 142 [ # # ]: 0 : B_CP_DIS_DB(cpr, cp_raw_cons); 143 : : } 144 : 0 : } 145 : : #endif