1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _DP_LI_RX_H_ 21 #define _DP_LI_RX_H_ 22 23 #include <dp_types.h> 24 #include <dp_rx.h> 25 #include "dp_li.h" 26 27 uint32_t dp_rx_process_li(struct dp_intr *int_ctx, 28 hal_ring_handle_t hal_ring_hdl, uint8_t reo_ring_num, 29 uint32_t quota); 30 31 /** 32 * dp_rx_desc_pool_init_li() - Initialize Rx Descriptor pool(s) 33 * @soc: Handle to DP Soc structure 34 * @rx_desc_pool: Rx descriptor pool handler 35 * @pool_id: Rx descriptor pool ID 36 * 37 * Return: None 38 */ 39 QDF_STATUS dp_rx_desc_pool_init_li(struct dp_soc *soc, 40 struct rx_desc_pool *rx_desc_pool, 41 uint32_t pool_id); 42 43 /** 44 * dp_rx_desc_pool_deinit_li() - De-initialize Rx Descriptor pool(s) 45 * @soc: Handle to DP Soc structure 46 * @rx_desc_pool: Rx descriptor pool handler 47 * @pool_id: Rx descriptor pool ID 48 * 49 * Return: None 50 */ 51 void dp_rx_desc_pool_deinit_li(struct dp_soc *soc, 52 struct rx_desc_pool *rx_desc_pool, 53 uint32_t pool_id); 54 55 /** 56 * dp_wbm_get_rx_desc_from_hal_desc_li() - Get corresponding Rx Desc 57 * address from WBM ring Desc 58 * @soc: Handle to DP Soc structure 59 * @ring_desc: ring descriptor structure pointer 60 * @r_rx_desc: pointer to a pointer of Rx Desc 61 * 62 * Return: QDF_STATUS_SUCCESS - succeeded, others - failed 63 */ 64 QDF_STATUS dp_wbm_get_rx_desc_from_hal_desc_li( 65 struct dp_soc *soc, 66 void *ring_desc, 67 struct dp_rx_desc **r_rx_desc); 68 69 /** 70 * dp_rx_desc_cookie_2_va_li() - Convert RX Desc cookie ID to VA 71 * @soc:Handle to DP Soc structure 72 * @cookie: cookie used to lookup virtual address 73 * 74 * Return: Rx descriptor virtual address 75 */ 76 static inline 77 struct dp_rx_desc *dp_rx_desc_cookie_2_va_li(struct dp_soc *soc, 78 uint32_t cookie) 79 { 80 return dp_rx_cookie_2_va_rxdma_buf(soc, cookie); 81 } 82 83 #define DP_PEER_METADATA_VDEV_ID_MASK 0x003f0000 84 #define DP_PEER_METADATA_VDEV_ID_SHIFT 16 85 #define DP_PEER_METADATA_OFFLOAD_MASK 0x01000000 86 #define DP_PEER_METADATA_OFFLOAD_SHIFT 24 87 88 #define DP_PEER_METADATA_VDEV_ID_GET_LI(_peer_metadata) \ 89 (((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \ 90 >> DP_PEER_METADATA_VDEV_ID_SHIFT) 91 92 #define DP_PEER_METADATA_OFFLOAD_GET_LI(_peer_metadata) \ 93 (((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK) \ 94 >> DP_PEER_METADATA_OFFLOAD_SHIFT) 95 96 static inline uint16_t 97 dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata) 98 { 99 struct htt_rx_peer_metadata_v0 *metadata = 100 (struct htt_rx_peer_metadata_v0 *)&peer_metadata; 101 102 return metadata->peer_id; 103 } 104 105 bool 106 dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, 107 qdf_nbuf_t nbuf_copy, 108 struct cdp_tid_rx_stats *tid_stats); 109 #ifdef QCA_DP_RX_NBUF_AND_NBUF_DATA_PREFETCH 110 static inline 111 void dp_rx_prefetch_nbuf_data(qdf_nbuf_t nbuf, qdf_nbuf_t next) 112 { 113 struct rx_pkt_tlvs *pkt_tlvs; 114 115 if (next) { 116 /* prefetch skb->next and first few bytes of skb->cb */ 117 qdf_prefetch(next); 118 /* skb->cb spread across 2 cache lines hence below prefetch */ 119 qdf_prefetch(&next->_skb_refdst); 120 qdf_prefetch(&next->len); 121 qdf_prefetch(&next->protocol); 122 pkt_tlvs = (struct rx_pkt_tlvs *)next->data; 123 /* sa_idx, da_idx, l3_pad in RX msdu_end TLV */ 124 qdf_prefetch(pkt_tlvs); 125 /* msdu_done in RX attention TLV */ 126 qdf_prefetch(&pkt_tlvs->attn_tlv); 127 /* fr_ds & to_ds in RX MPDU start TLV */ 128 if (qdf_nbuf_is_rx_chfrag_end(nbuf)) 129 qdf_prefetch(&pkt_tlvs->mpdu_start_tlv); 130 } 131 } 132 #else 133 static inline 134 void dp_rx_prefetch_nbuf_data(qdf_nbuf_t nbuf, qdf_nbuf_t next) 135 { 136 } 137 #endif 138 139 #ifdef QCA_DP_RX_HW_SW_NBUF_DESC_PREFETCH 140 /** 141 * dp_rx_cookie_2_va_rxdma_buf_prefetch() - function to prefetch the SW desc 142 * @soc: Handle to DP Soc structure 143 * @cookie: cookie used to lookup virtual address 144 * 145 * Return: prefetched Rx descriptor virtual address 146 */ 147 static inline 148 void *dp_rx_cookie_2_va_rxdma_buf_prefetch(struct dp_soc *soc, uint32_t cookie) 149 { 150 uint8_t pool_id = DP_RX_DESC_COOKIE_POOL_ID_GET(cookie); 151 uint16_t index = DP_RX_DESC_COOKIE_INDEX_GET(cookie); 152 struct rx_desc_pool *rx_desc_pool; 153 void *prefetch_desc; 154 155 if (qdf_unlikely(pool_id >= MAX_RXDESC_POOLS)) 156 return NULL; 157 158 rx_desc_pool = &soc->rx_desc_buf[pool_id]; 159 160 if (qdf_unlikely(index >= rx_desc_pool->pool_size)) 161 return NULL; 162 163 prefetch_desc = &soc->rx_desc_buf[pool_id].array[index].rx_desc; 164 qdf_prefetch(prefetch_desc); 165 return prefetch_desc; 166 } 167 168 /** 169 * dp_rx_prefetch_hw_sw_nbuf_desc() - function to prefetch HW and SW desc 170 * @soc: Handle to HAL Soc structure 171 * @num_entries: valid number of HW descriptors 172 * @hal_ring_hdl: Destination ring pointer 173 * @last_prefetched_hw_desc: pointer to the last prefetched HW descriptor 174 * @last_prefetched_sw_desc: input & output param of last prefetch SW desc 175 * 176 * Return: None 177 */ 178 static inline 179 void dp_rx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc, 180 hal_soc_handle_t hal_soc, 181 uint32_t num_entries, 182 hal_ring_handle_t hal_ring_hdl, 183 hal_ring_desc_t *last_prefetched_hw_desc, 184 struct dp_rx_desc **last_prefetched_sw_desc) 185 { 186 if (*last_prefetched_sw_desc) { 187 qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf); 188 qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf + 64); 189 } 190 191 if (num_entries) { 192 *last_prefetched_sw_desc = dp_rx_cookie_2_va_rxdma_buf_prefetch(soc, HAL_RX_REO_BUF_COOKIE_GET(*last_prefetched_hw_desc)); 193 *last_prefetched_hw_desc = hal_srng_dst_prefetch_next_cached_desc(hal_soc, 194 hal_ring_hdl, 195 (uint8_t *)*last_prefetched_hw_desc); 196 } 197 } 198 #else 199 static inline 200 void dp_rx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc, 201 hal_soc_handle_t hal_soc, 202 uint32_t quota, 203 hal_ring_handle_t hal_ring_hdl, 204 hal_ring_desc_t *last_prefetched_hw_desc, 205 struct dp_rx_desc **last_prefetched_sw_desc) 206 { 207 } 208 #endif 209 210 static inline 211 QDF_STATUS dp_peer_rx_reorder_queue_setup_li(struct dp_soc *soc, 212 struct dp_peer *peer, 213 int tid, 214 uint32_t ba_window_size) 215 { 216 struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; 217 218 if (!rx_tid->hw_qdesc_paddr) 219 return QDF_STATUS_E_INVAL; 220 221 if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) { 222 if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup( 223 soc->ctrl_psoc, 224 peer->vdev->pdev->pdev_id, 225 peer->vdev->vdev_id, 226 peer->mac_addr.raw, rx_tid->hw_qdesc_paddr, tid, tid, 227 1, ba_window_size)) { 228 dp_peer_err("%pK: Failed to send reo queue setup to FW - tid %d\n", 229 soc, tid); 230 return QDF_STATUS_E_FAILURE; 231 } 232 } 233 234 return QDF_STATUS_SUCCESS; 235 } 236 #endif 237