Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2022 Marvell. 3 : : */ 4 : : #ifndef __CNXK_ETHDEV_DP_H__ 5 : : #define __CNXK_ETHDEV_DP_H__ 6 : : 7 : : #include <rte_security_driver.h> 8 : : #include <rte_mbuf.h> 9 : : 10 : : /* If PTP is enabled additional SEND MEM DESC is required which 11 : : * takes 2 words, hence max 7 iova address are possible 12 : : */ 13 : : #if defined(RTE_LIBRTE_IEEE1588) 14 : : #define CNXK_NIX_TX_NB_SEG_MAX 7 15 : : #else 16 : : #define CNXK_NIX_TX_NB_SEG_MAX 9 17 : : #endif 18 : : 19 : : #define CNXK_NIX_TX_MSEG_SG_DWORDS \ 20 : : ((RTE_ALIGN_MUL_CEIL(CNXK_NIX_TX_NB_SEG_MAX, 3) / 3) + \ 21 : : CNXK_NIX_TX_NB_SEG_MAX) 22 : : 23 : : /* Default mark value used when none is provided. */ 24 : : #define CNXK_FLOW_ACTION_FLAG_DEFAULT 0xffff 25 : : #define CNXK_NIX_TIMESYNC_RX_OFFSET 8 26 : : 27 : : #define PTYPE_NON_TUNNEL_WIDTH 16 28 : : #define PTYPE_TUNNEL_WIDTH 12 29 : : #define PTYPE_NON_TUNNEL_ARRAY_SZ BIT(PTYPE_NON_TUNNEL_WIDTH) 30 : : #define PTYPE_TUNNEL_ARRAY_SZ BIT(PTYPE_TUNNEL_WIDTH) 31 : : #define PTYPE_ARRAY_SZ \ 32 : : ((PTYPE_NON_TUNNEL_ARRAY_SZ + PTYPE_TUNNEL_ARRAY_SZ) * sizeof(uint16_t)) 33 : : 34 : : /* NIX_RX_PARSE_S's ERRCODE + ERRLEV (12 bits) */ 35 : : #define ERRCODE_ERRLEN_WIDTH 12 36 : : #define ERR_ARRAY_SZ ((BIT(ERRCODE_ERRLEN_WIDTH)) * sizeof(uint32_t)) 37 : : 38 : : #define SA_BASE_OFFSET 8 /* offset in bytes */ 39 : : #define MEMPOOL_OFFSET 8 /* offset in bytes */ 40 : : #define BUFLEN_OFFSET 8 /* offset in bytes */ 41 : : #define LOOKUP_MEM_PORTDATA_SZ (SA_BASE_OFFSET + MEMPOOL_OFFSET + BUFLEN_OFFSET) 42 : : #define LOOKUP_MEM_PORTDATA_TOTAL_SZ (RTE_MAX_ETHPORTS * LOOKUP_MEM_PORTDATA_SZ) 43 : : 44 : : #define CNXK_NIX_UDP_TUN_BITMASK \ 45 : : ((1ull << (RTE_MBUF_F_TX_TUNNEL_VXLAN >> 45)) | \ 46 : : (1ull << (RTE_MBUF_F_TX_TUNNEL_GENEVE >> 45))) 47 : : 48 : : /* Subtype from inline outbound error event */ 49 : : #define CNXK_ETHDEV_SEC_OUTB_EV_SUB 0xFFUL 50 : : 51 : : /* SPI will be in 20 bits of tag */ 52 : : #define CNXK_ETHDEV_SPI_TAG_MASK 0xFFFFFUL 53 : : 54 : : #define CNXK_NIX_PFC_CHAN_COUNT 16 55 : : 56 : : #define CNXK_TM_MARK_VLAN_DEI BIT_ULL(0) 57 : : #define CNXK_TM_MARK_IP_DSCP BIT_ULL(1) 58 : : #define CNXK_TM_MARK_IP_ECN BIT_ULL(2) 59 : : 60 : : #define CNXK_TM_MARK_MASK \ 61 : : (CNXK_TM_MARK_VLAN_DEI | CNXK_TM_MARK_IP_DSCP | CNXK_TM_MARK_IP_ECN) 62 : : 63 : : #define CNXK_TX_MARK_FMT_MASK (0xFFFFFFFFFFFFull) 64 : : 65 : : #define CNXK_NIX_CQ_ENTRY_SZ 128 66 : : #define CQE_SZ(x) ((x) * CNXK_NIX_CQ_ENTRY_SZ) 67 : : 68 : : struct cnxk_eth_txq_comp { 69 : : uintptr_t desc_base; 70 : : uintptr_t cq_door; 71 : : int64_t *cq_status; 72 : : uint64_t wdata; 73 : : uint32_t head; 74 : : uint32_t qmask; 75 : : uint32_t nb_desc_mask; 76 : : uint32_t available; 77 : : uint32_t sqe_id; 78 : : bool ena; 79 : : struct rte_mbuf **ptr; 80 : : rte_spinlock_t ext_buf_lock; 81 : : }; 82 : : 83 : : struct cnxk_timesync_info { 84 : : uint8_t rx_ready; 85 : : uint64_t rx_tstamp; 86 : : uint64_t rx_tstamp_dynflag; 87 : : int tstamp_dynfield_offset; 88 : : rte_iova_t tx_tstamp_iova; 89 : : uint64_t *tx_tstamp; 90 : : } __plt_cache_aligned; 91 : : 92 : : struct cnxk_ethdev_inj_cfg { 93 : : uintptr_t lmt_base; 94 : : uint64_t io_addr; 95 : : uint64_t sa_base; 96 : : uint64_t cmd_w0; 97 : : } __plt_cache_aligned; 98 : : 99 : : /* Inlines */ 100 : : static __rte_always_inline uint64_t 101 : : cnxk_pktmbuf_detach(struct rte_mbuf *m, uint64_t *aura) 102 : : { 103 : : struct rte_mempool *mp = m->pool; 104 : : uint32_t mbuf_size, buf_len; 105 : : struct rte_mbuf *md; 106 : : uint16_t priv_size; 107 : : uint16_t refcount; 108 : : 109 : : /* Update refcount of direct mbuf */ 110 : : md = rte_mbuf_from_indirect(m); 111 : : if (aura) 112 : : *aura = roc_npa_aura_handle_to_aura(md->pool->pool_id); 113 : : refcount = rte_mbuf_refcnt_update(md, -1); 114 : : 115 : : priv_size = rte_pktmbuf_priv_size(mp); 116 : : mbuf_size = (uint32_t)(sizeof(struct rte_mbuf) + priv_size); 117 : : buf_len = rte_pktmbuf_data_room_size(mp); 118 : : 119 : : m->priv_size = priv_size; 120 : : m->buf_addr = (char *)m + mbuf_size; 121 : : rte_mbuf_iova_set(m, rte_mempool_virt2iova(m) + mbuf_size); 122 : : m->buf_len = (uint16_t)buf_len; 123 : : rte_pktmbuf_reset_headroom(m); 124 : : m->data_len = 0; 125 : : m->ol_flags = 0; 126 : : m->next = NULL; 127 : : m->nb_segs = 1; 128 : : 129 : : /* Now indirect mbuf is safe to free */ 130 : : rte_pktmbuf_free(m); 131 : : 132 : : if (refcount == 0) { 133 : : rte_mbuf_refcnt_set(md, 1); 134 : : md->data_len = 0; 135 : : md->ol_flags = 0; 136 : : md->next = NULL; 137 : : md->nb_segs = 1; 138 : : return 0; 139 : : } else { 140 : : return 1; 141 : : } 142 : : } 143 : : 144 : : static __rte_always_inline uint64_t 145 : : cnxk_nix_prefree_seg(struct rte_mbuf *m, uint64_t *aura) 146 : : { 147 : : if (likely(rte_mbuf_refcnt_read(m) == 1)) { 148 : : if (!RTE_MBUF_DIRECT(m)) 149 : : return cnxk_pktmbuf_detach(m, aura); 150 : : 151 : : m->next = NULL; 152 : : m->nb_segs = 1; 153 : : return 0; 154 : : } else if (rte_mbuf_refcnt_update(m, -1) == 0) { 155 : : if (!RTE_MBUF_DIRECT(m)) 156 : : return cnxk_pktmbuf_detach(m, aura); 157 : : 158 : : rte_mbuf_refcnt_set(m, 1); 159 : : m->next = NULL; 160 : : m->nb_segs = 1; 161 : : return 0; 162 : : } 163 : : 164 : : /* Mbuf is having refcount more than 1 so need not to be freed */ 165 : : return 1; 166 : : } 167 : : 168 : : static inline rte_mbuf_timestamp_t * 169 : : cnxk_nix_timestamp_dynfield(struct rte_mbuf *mbuf, 170 : : struct cnxk_timesync_info *info) 171 : : { 172 [ # # ]: 0 : return RTE_MBUF_DYNFIELD(mbuf, info->tstamp_dynfield_offset, 173 : : rte_mbuf_timestamp_t *); 174 : : } 175 : : 176 : : static __rte_always_inline uintptr_t 177 : : cnxk_nix_sa_base_get(uint16_t port, const void *lookup_mem) 178 : : { 179 : : uintptr_t sa_base_tbl; 180 : : uint32_t offset; 181 : : 182 : 0 : sa_base_tbl = (uintptr_t)lookup_mem; 183 : 0 : sa_base_tbl += PTYPE_ARRAY_SZ + ERR_ARRAY_SZ; 184 : 0 : offset = port * LOOKUP_MEM_PORTDATA_SZ; 185 [ # # # # : 0 : return *((const uintptr_t *)sa_base_tbl + offset / 8); # # ] 186 : : } 187 : : 188 : : static __rte_always_inline uintptr_t 189 : : cnxk_nix_inl_metapool_get(uint16_t port, const void *lookup_mem) 190 : : { 191 : : uintptr_t metapool_tbl; 192 : : uint32_t offset; 193 : : 194 : 0 : metapool_tbl = (uintptr_t)lookup_mem; 195 : 0 : metapool_tbl += PTYPE_ARRAY_SZ + ERR_ARRAY_SZ; 196 : 0 : offset = (port * LOOKUP_MEM_PORTDATA_SZ) + SA_BASE_OFFSET; 197 [ # # # # : 0 : return *((const uintptr_t *)metapool_tbl + offset / 8); # # # # # # # # ] 198 : : } 199 : : 200 : : static __rte_always_inline uintptr_t 201 : : cnxk_nix_inl_bufsize_get(uint16_t port, const void *lookup_mem) 202 : : { 203 : : uintptr_t bufsz_tbl; 204 : : uint32_t offset; 205 : : 206 : : bufsz_tbl = (uintptr_t)lookup_mem; 207 : : bufsz_tbl += PTYPE_ARRAY_SZ + ERR_ARRAY_SZ; 208 : 0 : offset = (port * LOOKUP_MEM_PORTDATA_SZ) + SA_BASE_OFFSET + MEMPOOL_OFFSET; 209 [ # # # # ]: 0 : return *((const uintptr_t *)bufsz_tbl + offset / 8); 210 : : } 211 : : 212 : : #endif /* __CNXK_ETHDEV_DP_H__ */