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_CPR_H_ 7 : : #define _BNXT_CPR_H_ 8 : : #include <stdbool.h> 9 : : 10 : : #include <rte_io.h> 11 : : #include <rte_version.h> 12 : : #include "hsi_struct_def_dpdk.h" 13 : : 14 : : struct bnxt_db_info; 15 : : 16 : : #define CMP_TYPE(cmp) \ 17 : : (((struct cmpl_base *)cmp)->type & CMPL_BASE_TYPE_MASK) 18 : : 19 : : #define CMPL_VALID(cmp, v) \ 20 : : (!!(rte_le_to_cpu_32(((struct cmpl_base *)(cmp))->info3_v) & \ 21 : : CMPL_BASE_V) == !(v)) 22 : : 23 : : /* Get completion length from completion type, in 16-byte units. */ 24 : : #define CMP_LEN(cmp_type) (((cmp_type) & 1) + 1) 25 : : 26 : : 27 : : #define ADV_RAW_CMP(idx, n) ((idx) + (n)) 28 : : #define NEXT_RAW_CMP(idx) ADV_RAW_CMP(idx, 1) 29 : : #define RING_CMP(ring, idx) ((idx) & (ring)->ring_mask) 30 : : #define RING_CMPL(ring_mask, idx) ((idx) & (ring_mask)) 31 : : #define NEXT_CMP(idx) RING_CMP(ADV_RAW_CMP(idx, 1)) 32 : : 33 : : #define DB_CP_REARM_FLAGS (DB_KEY_CP | DB_IDX_VALID) 34 : : #define DB_CP_FLAGS (DB_KEY_CP | DB_IDX_VALID | DB_IRQ_DIS) 35 : : 36 : : #define NEXT_CMPL(cpr, idx, v, inc) do { \ 37 : : (idx) += (inc); \ 38 : : if (unlikely((idx) >= (cpr)->cp_ring_struct->ring_size)) { \ 39 : : (v) = !(v); \ 40 : : (idx) = 0; \ 41 : : } \ 42 : : } while (0) 43 : : 44 : : #define B_CP_DB_REARM(cpr, raw_cons) \ 45 : : rte_write32((DB_CP_REARM_FLAGS | \ 46 : : DB_RING_IDX(&((cpr)->cp_db), raw_cons)), \ 47 : : ((cpr)->cp_db.doorbell)) 48 : : 49 : : #define B_CP_DB_ARM(cpr) rte_write32((DB_KEY_CP), \ 50 : : ((cpr)->cp_db.doorbell)) 51 : : 52 : : #define B_CP_DB_DISARM(cpr) (*(uint32_t *)((cpr)->cp_db.doorbell) = \ 53 : : DB_KEY_CP | DB_IRQ_DIS) 54 : : 55 : : #define B_CP_DIS_DB(cpr, raw_cons) \ 56 : : rte_write32_relaxed((DB_CP_FLAGS | \ 57 : : DB_RING_IDX(&((cpr)->cp_db), raw_cons)), \ 58 : : ((cpr)->cp_db.doorbell)) 59 : : 60 : : struct bnxt_db_info { 61 : : void *doorbell; 62 : : union { 63 : : uint64_t db_key64; 64 : : uint32_t db_key32; 65 : : }; 66 : : bool db_64; 67 : : uint32_t db_ring_mask; 68 : : uint32_t db_epoch_mask; 69 : : }; 70 : : 71 : : #define DB_EPOCH(db, idx) (!!((idx) & (db)->db_epoch_mask) << \ 72 : : DBR_EPOCH_SFT) 73 : : #define DB_RING_IDX(db, idx) (((idx) & (db)->db_ring_mask) | \ 74 : : DB_EPOCH(db, idx)) 75 : : 76 : : struct bnxt_ring; 77 : : struct bnxt_cp_ring_info { 78 : : uint32_t cp_raw_cons; 79 : : 80 : : struct cmpl_base *cp_desc_ring; 81 : : struct bnxt_db_info cp_db; 82 : : rte_iova_t cp_desc_mapping; 83 : : 84 : : char *hw_stats; 85 : : uint16_t hw_ring_stats_size; 86 : : rte_iova_t hw_stats_map; 87 : : uint32_t hw_stats_ctx_id; 88 : : 89 : : struct bnxt_ring *cp_ring_struct; 90 : : bool valid; 91 : : uint32_t epoch; 92 : : }; 93 : : 94 : : #define RX_CMP_L2_ERRORS \ 95 : : (RX_PKT_CMPL_ERRORS_BUFFER_ERROR_MASK | RX_PKT_CMPL_ERRORS_CRC_ERROR) 96 : : 97 : : struct bnxt; 98 : : void bnxt_handle_async_event(struct bnxt *bp, struct cmpl_base *cmp); 99 : : void bnxt_handle_fwd_req(struct bnxt *bp, struct cmpl_base *cmp); 100 : : int bnxt_event_hwrm_resp_handler(struct bnxt *bp, struct cmpl_base *cmp); 101 : : void bnxt_dev_reset_and_resume(void *arg); 102 : : void bnxt_wait_for_device_shutdown(struct bnxt *bp); 103 : : 104 : : #define EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL \ 105 : : HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL 106 : : #define EVENT_DATA1_REASON_CODE_MASK \ 107 : : HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK 108 : : 109 : : #define EVENT_DATA1_FLAGS_MASK \ 110 : : HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASK 111 : : 112 : : #define EVENT_DATA1_FLAGS_MASTER_FUNC \ 113 : : HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC 114 : : 115 : : #define EVENT_DATA1_FLAGS_RECOVERY_ENABLED \ 116 : : HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_RECOVERY_ENABLED 117 : : 118 : : bool bnxt_is_recovery_enabled(struct bnxt *bp); 119 : : bool bnxt_is_primary_func(struct bnxt *bp); 120 : : 121 : : void bnxt_stop_rxtx(struct rte_eth_dev *eth_dev); 122 : : #if (RTE_VERSION_NUM(21, 8, 0, 0) < RTE_VERSION) 123 : : void bnxt_start_rxtx(struct rte_eth_dev *eth_dev); 124 : : #endif 125 : : 126 : : /** 127 : : * Check validity of a completion ring entry. If the entry is valid, include a 128 : : * C11 __ATOMIC_ACQUIRE fence to ensure that subsequent loads of fields in the 129 : : * completion are not hoisted by the compiler or by the CPU to come before the 130 : : * loading of the "valid" field. 131 : : * 132 : : * Note: the caller must not access any fields in the specified completion 133 : : * entry prior to calling this function. 134 : : * 135 : : * @param cmpl 136 : : * Pointer to an entry in the completion ring. 137 : : * @param raw_cons 138 : : * Raw consumer index of entry in completion ring. 139 : : * @param ring_size 140 : : * Size of completion ring. 141 : : */ 142 : : static __rte_always_inline bool 143 : : bnxt_cpr_cmp_valid(const void *cmpl, uint32_t raw_cons, uint32_t ring_size) 144 : : { 145 : : const struct cmpl_base *c = (const struct cmpl_base *)cmpl; 146 : : bool expected, valid; 147 : : 148 : 0 : expected = !(raw_cons & ring_size); 149 : 0 : valid = !!(rte_le_to_cpu_32(c->info3_v) & CMPL_BASE_V); 150 [ # # # # : 0 : if (valid == expected) { # # # # ] 151 : : rte_atomic_thread_fence(rte_memory_order_acquire); 152 : 0 : return true; 153 : : } 154 : : return false; 155 : : } 156 : : #endif