LCOV - code coverage report
Current view: top level - drivers/net/hinic3 - hinic3_rx.h (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 5 0.0 %
Date: 2025-11-01 17:50:34 Functions: 0 0 -
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 8 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2025 Huawei Technologies Co., Ltd
       3                 :            :  */
       4                 :            : 
       5                 :            : #ifndef _HINIC3_RX_H_
       6                 :            : #define _HINIC3_RX_H_
       7                 :            : 
       8                 :            : #define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_SHIFT    0
       9                 :            : #define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_SHIFT 19
      10                 :            : #define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_SHIFT     21
      11                 :            : #define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_SHIFT    24
      12                 :            : 
      13                 :            : #define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_MASK    0xFFFU
      14                 :            : #define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_MASK 0x3U
      15                 :            : #define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_MASK     0x1U
      16                 :            : #define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_MASK    0xFFU
      17                 :            : 
      18                 :            : #define DPI_EXT_ACTION_FILED (1ULL << 32)
      19                 :            : 
      20                 :            : #define RQ_CQE_OFFOLAD_TYPE_GET(val, member)               \
      21                 :            :         (((val) >> RQ_CQE_OFFOLAD_TYPE_##member##_SHIFT) & \
      22                 :            :          RQ_CQE_OFFOLAD_TYPE_##member##_MASK)
      23                 :            : 
      24                 :            : #define HINIC3_GET_RX_PKT_TYPE(offload_type) \
      25                 :            :         RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_TYPE)
      26                 :            : 
      27                 :            : #define HINIC3_GET_RX_PKT_UMBCAST(offload_type) \
      28                 :            :         RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_UMBCAST)
      29                 :            : 
      30                 :            : #define HINIC3_GET_RX_VLAN_OFFLOAD_EN(offload_type) \
      31                 :            :         RQ_CQE_OFFOLAD_TYPE_GET(offload_type, VLAN_EN)
      32                 :            : 
      33                 :            : #define HINIC3_GET_RSS_TYPES(offload_type) \
      34                 :            :         RQ_CQE_OFFOLAD_TYPE_GET(offload_type, RSS_TYPE)
      35                 :            : 
      36                 :            : #define RQ_CQE_SGE_VLAN_SHIFT 0
      37                 :            : #define RQ_CQE_SGE_LEN_SHIFT  16
      38                 :            : 
      39                 :            : #define RQ_CQE_SGE_VLAN_MASK 0xFFFFU
      40                 :            : #define RQ_CQE_SGE_LEN_MASK  0xFFFFU
      41                 :            : 
      42                 :            : #define RQ_CQE_SGE_GET(val, member) \
      43                 :            :         (((val) >> RQ_CQE_SGE_##member##_SHIFT) & RQ_CQE_SGE_##member##_MASK)
      44                 :            : 
      45                 :            : #define HINIC3_GET_RX_VLAN_TAG(vlan_len) RQ_CQE_SGE_GET(vlan_len, VLAN)
      46                 :            : 
      47                 :            : #define HINIC3_GET_RX_PKT_LEN(vlan_len) RQ_CQE_SGE_GET(vlan_len, LEN)
      48                 :            : 
      49                 :            : #define RQ_CQE_STATUS_CSUM_ERR_SHIFT  0
      50                 :            : #define RQ_CQE_STATUS_NUM_LRO_SHIFT   16
      51                 :            : #define RQ_CQE_STATUS_LRO_PUSH_SHIFT  25
      52                 :            : #define RQ_CQE_STATUS_LRO_ENTER_SHIFT 26
      53                 :            : #define RQ_CQE_STATUS_LRO_INTR_SHIFT  27
      54                 :            : 
      55                 :            : #define RQ_CQE_STATUS_BP_EN_SHIFT     30
      56                 :            : #define RQ_CQE_STATUS_RXDONE_SHIFT    31
      57                 :            : #define RQ_CQE_STATUS_DECRY_PKT_SHIFT 29
      58                 :            : #define RQ_CQE_STATUS_FLUSH_SHIFT     28
      59                 :            : 
      60                 :            : #define RQ_CQE_STATUS_CSUM_ERR_MASK  0xFFFFU
      61                 :            : #define RQ_CQE_STATUS_NUM_LRO_MASK   0xFFU
      62                 :            : #define RQ_CQE_STATUS_LRO_PUSH_MASK  0X1U
      63                 :            : #define RQ_CQE_STATUS_LRO_ENTER_MASK 0X1U
      64                 :            : #define RQ_CQE_STATUS_LRO_INTR_MASK  0X1U
      65                 :            : #define RQ_CQE_STATUS_BP_EN_MASK     0X1U
      66                 :            : #define RQ_CQE_STATUS_RXDONE_MASK    0x1U
      67                 :            : #define RQ_CQE_STATUS_FLUSH_MASK     0x1U
      68                 :            : #define RQ_CQE_STATUS_DECRY_PKT_MASK 0x1U
      69                 :            : 
      70                 :            : #define RQ_CQE_STATUS_GET(val, member)               \
      71                 :            :         (((val) >> RQ_CQE_STATUS_##member##_SHIFT) & \
      72                 :            :          RQ_CQE_STATUS_##member##_MASK)
      73                 :            : 
      74                 :            : #define HINIC3_GET_RX_CSUM_ERR(status) RQ_CQE_STATUS_GET(status, CSUM_ERR)
      75                 :            : 
      76                 :            : #define HINIC3_GET_RX_DONE(status) RQ_CQE_STATUS_GET(status, RXDONE)
      77                 :            : 
      78                 :            : #define HINIC3_GET_RX_FLUSH(status) RQ_CQE_STATUS_GET(status, FLUSH)
      79                 :            : 
      80                 :            : #define HINIC3_GET_RX_BP_EN(status) RQ_CQE_STATUS_GET(status, BP_EN)
      81                 :            : 
      82                 :            : #define HINIC3_GET_RX_NUM_LRO(status) RQ_CQE_STATUS_GET(status, NUM_LRO)
      83                 :            : 
      84                 :            : #define HINIC3_RX_IS_DECRY_PKT(status) RQ_CQE_STATUS_GET(status, DECRY_PKT)
      85                 :            : 
      86                 :            : #define RQ_CQE_SUPER_CQE_EN_SHIFT  0
      87                 :            : #define RQ_CQE_PKT_NUM_SHIFT       1
      88                 :            : #define RQ_CQE_PKT_LAST_LEN_SHIFT  6
      89                 :            : #define RQ_CQE_PKT_FIRST_LEN_SHIFT 19
      90                 :            : 
      91                 :            : #define RQ_CQE_SUPER_CQE_EN_MASK  0x1
      92                 :            : #define RQ_CQE_PKT_NUM_MASK       0x1FU
      93                 :            : #define RQ_CQE_PKT_FIRST_LEN_MASK 0x1FFFU
      94                 :            : #define RQ_CQE_PKT_LAST_LEN_MASK  0x1FFFU
      95                 :            : 
      96                 :            : #define RQ_CQE_PKT_NUM_GET(val, member) \
      97                 :            :         (((val) >> RQ_CQE_PKT_##member##_SHIFT) & RQ_CQE_PKT_##member##_MASK)
      98                 :            : #define HINIC3_GET_RQ_CQE_PKT_NUM(pkt_info) RQ_CQE_PKT_NUM_GET(pkt_info, NUM)
      99                 :            : 
     100                 :            : #define RQ_CQE_SUPER_CQE_EN_GET(val, member) \
     101                 :            :         (((val) >> RQ_CQE_##member##_SHIFT) & RQ_CQE_##member##_MASK)
     102                 :            : 
     103                 :            : #define HINIC3_GET_SUPER_CQE_EN(pkt_info) \
     104                 :            :         RQ_CQE_SUPER_CQE_EN_GET(pkt_info, SUPER_CQE_EN)
     105                 :            : 
     106                 :            : #define RQ_CQE_PKT_LEN_GET(val, member) \
     107                 :            :         (((val) >> RQ_CQE_PKT_##member##_SHIFT) & RQ_CQE_PKT_##member##_MASK)
     108                 :            : 
     109                 :            : #define RQ_CQE_DECRY_INFO_DECRY_STATUS_SHIFT  8
     110                 :            : #define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_SHIFT 0
     111                 :            : 
     112                 :            : #define RQ_CQE_DECRY_INFO_DECRY_STATUS_MASK  0xFFU
     113                 :            : #define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_MASK 0xFFU
     114                 :            : 
     115                 :            : #define RQ_CQE_DECRY_INFO_GET(val, member)               \
     116                 :            :         (((val) >> RQ_CQE_DECRY_INFO_##member##_SHIFT) & \
     117                 :            :          RQ_CQE_DECRY_INFO_##member##_MASK)
     118                 :            : 
     119                 :            : #define HINIC3_GET_DECRYPT_STATUS(decry_info) \
     120                 :            :         RQ_CQE_DECRY_INFO_GET(decry_info, DECRY_STATUS)
     121                 :            : 
     122                 :            : #define HINIC3_GET_ESP_NEXT_HEAD(decry_info) \
     123                 :            :         RQ_CQE_DECRY_INFO_GET(decry_info, ESP_NEXT_HEAD)
     124                 :            : 
     125                 :            : /* Rx cqe checksum err */
     126                 :            : #define HINIC3_RX_CSUM_IP_CSUM_ERR      RTE_BIT32(0)
     127                 :            : #define HINIC3_RX_CSUM_TCP_CSUM_ERR     RTE_BIT32(1)
     128                 :            : #define HINIC3_RX_CSUM_UDP_CSUM_ERR     RTE_BIT32(2)
     129                 :            : #define HINIC3_RX_CSUM_IGMP_CSUM_ERR    RTE_BIT32(3)
     130                 :            : #define HINIC3_RX_CSUM_ICMP_V4_CSUM_ERR RTE_BIT32(4)
     131                 :            : #define HINIC3_RX_CSUM_ICMP_V6_CSUM_ERR RTE_BIT32(5)
     132                 :            : #define HINIC3_RX_CSUM_SCTP_CRC_ERR     RTE_BIT32(6)
     133                 :            : #define HINIC3_RX_CSUM_HW_CHECK_NONE    RTE_BIT32(7)
     134                 :            : #define HINIC3_RX_CSUM_IPSU_OTHER_ERR   RTE_BIT32(8)
     135                 :            : 
     136                 :            : #define HINIC3_DEFAULT_RX_CSUM_OFFLOAD 0xFFF
     137                 :            : #define HINIC3_CQE_LEN                 32
     138                 :            : 
     139                 :            : #define HINIC3_RSS_OFFLOAD_ALL (         \
     140                 :            :         RTE_ETH_RSS_IPV4 |               \
     141                 :            :         RTE_ETH_RSS_FRAG_IPV4 |          \
     142                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_TCP |   \
     143                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_UDP |   \
     144                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \
     145                 :            :         RTE_ETH_RSS_IPV6 |               \
     146                 :            :         RTE_ETH_RSS_FRAG_IPV6 |          \
     147                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_TCP |   \
     148                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_UDP |   \
     149                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_OTHER | \
     150                 :            :         RTE_ETH_RSS_IPV6_EX |            \
     151                 :            :         RTE_ETH_RSS_IPV6_TCP_EX |        \
     152                 :            :         RTE_ETH_RSS_IPV6_UDP_EX)
     153                 :            : 
     154                 :            : struct hinic3_rxq_stats {
     155                 :            :         uint64_t packets;
     156                 :            :         uint64_t bytes;
     157                 :            :         uint64_t errors;
     158                 :            :         uint64_t csum_errors;
     159                 :            :         uint64_t other_errors;
     160                 :            :         uint64_t unlock_bp;
     161                 :            :         uint64_t dropped;
     162                 :            : 
     163                 :            :         uint64_t rx_nombuf;
     164                 :            :         uint64_t rx_discards;
     165                 :            :         uint64_t burst_pkts;
     166                 :            :         uint64_t empty;
     167                 :            :         uint64_t tsc;
     168                 :            : #ifdef HINIC3_XSTAT_MBUF_USE
     169                 :            :         uint64_t rx_alloc_mbuf_bytes;
     170                 :            :         uint64_t rx_free_mbuf_bytes;
     171                 :            :         uint64_t rx_left_mbuf_bytes;
     172                 :            : #endif
     173                 :            : 
     174                 :            : #ifdef HINIC3_XSTAT_RXBUF_INFO
     175                 :            :         uint64_t rx_mbuf;
     176                 :            :         uint64_t rx_avail;
     177                 :            :         uint64_t rx_hole;
     178                 :            : #endif
     179                 :            : 
     180                 :            : #ifdef HINIC3_XSTAT_PROF_RX
     181                 :            :         uint64_t app_tsc;
     182                 :            :         uint64_t pmd_tsc;
     183                 :            : #endif
     184                 :            : };
     185                 :            : 
     186                 :            : struct __rte_cache_aligned hinic3_rq_cqe {
     187                 :            :         RTE_ATOMIC(uint32_t)status;
     188                 :            :         uint32_t vlan_len;
     189                 :            : 
     190                 :            :         uint32_t offload_type;
     191                 :            :         uint32_t hash_val;
     192                 :            :         uint32_t mark_id_0;
     193                 :            :         uint32_t mark_id_1;
     194                 :            :         uint32_t mark_id_2;
     195                 :            :         uint32_t pkt_info;
     196                 :            : };
     197                 :            : 
     198                 :            : /**
     199                 :            :  * Attention: please do not add any member in hinic3_rx_info
     200                 :            :  * because rxq bulk rearm mode will write mbuf in rx_info.
     201                 :            :  */
     202                 :            : struct hinic3_rx_info {
     203                 :            :         struct rte_mbuf *mbuf;
     204                 :            : };
     205                 :            : 
     206                 :            : struct hinic3_sge_sect {
     207                 :            :         struct hinic3_sge sge;
     208                 :            :         uint32_t rsvd;
     209                 :            : };
     210                 :            : 
     211                 :            : struct hinic3_rq_extend_wqe {
     212                 :            :         struct hinic3_sge_sect buf_desc;
     213                 :            :         struct hinic3_sge_sect cqe_sect;
     214                 :            : };
     215                 :            : 
     216                 :            : struct hinic3_rq_normal_wqe {
     217                 :            :         uint32_t buf_hi_addr;
     218                 :            :         uint32_t buf_lo_addr;
     219                 :            :         uint32_t cqe_hi_addr;
     220                 :            :         uint32_t cqe_lo_addr;
     221                 :            : };
     222                 :            : 
     223                 :            : struct hinic3_rq_wqe {
     224                 :            :         union {
     225                 :            :                 struct hinic3_rq_normal_wqe normal_wqe;
     226                 :            :                 struct hinic3_rq_extend_wqe extend_wqe;
     227                 :            :         };
     228                 :            : };
     229                 :            : 
     230                 :            : struct __rte_cache_aligned hinic3_rxq {
     231                 :            :         struct hinic3_nic_dev *nic_dev;
     232                 :            : 
     233                 :            :         uint16_t q_id;
     234                 :            :         uint16_t q_depth;
     235                 :            :         uint16_t q_mask;
     236                 :            :         uint16_t buf_len;
     237                 :            : 
     238                 :            :         uint32_t rx_buff_shift;
     239                 :            : 
     240                 :            :         uint16_t rx_free_thresh;
     241                 :            :         uint16_t rxinfo_align_end;
     242                 :            :         uint16_t wqebb_shift;
     243                 :            :         uint16_t wqebb_size;
     244                 :            : 
     245                 :            :         uint16_t wqe_type;
     246                 :            :         uint16_t cons_idx;
     247                 :            :         uint16_t prod_idx;
     248                 :            :         uint16_t delta;
     249                 :            : 
     250                 :            :         uint16_t next_to_update;
     251                 :            :         uint16_t port_id;
     252                 :            : 
     253                 :            :         const struct rte_memzone *rq_mz;
     254                 :            :         void *queue_buf_vaddr; /**< rxq dma info */
     255                 :            :         rte_iova_t queue_buf_paddr;
     256                 :            : 
     257                 :            :         const struct rte_memzone *pi_mz;
     258                 :            :         uint16_t *pi_virt_addr;
     259                 :            :         void *db_addr;
     260                 :            :         rte_iova_t pi_dma_addr;
     261                 :            : 
     262                 :            :         struct hinic3_rx_info *rx_info;
     263                 :            :         struct hinic3_rq_cqe *rx_cqe;
     264                 :            :         struct rte_mempool *mb_pool;
     265                 :            : 
     266                 :            :         const struct rte_memzone *cqe_mz;
     267                 :            :         rte_iova_t cqe_start_paddr;
     268                 :            :         void *cqe_start_vaddr;
     269                 :            :         uint8_t dp_intr_en;
     270                 :            :         uint16_t msix_entry_idx;
     271                 :            : 
     272                 :            :         bool rx_deferred_start; /* don't start this queue in dev start */
     273                 :            :         unsigned long status;
     274                 :            :         uint64_t wait_time_cycle;
     275                 :            : 
     276                 :            :         struct hinic3_rxq_stats rxq_stats;
     277                 :            : #ifdef HINIC3_XSTAT_PROF_RX
     278                 :            :         uint64_t prof_rx_end_tsc; /**< Performance profiling. */
     279                 :            : #endif
     280                 :            : };
     281                 :            : 
     282                 :            : uint16_t hinic3_rx_fill_wqe(struct hinic3_rxq *rxq);
     283                 :            : 
     284                 :            : uint16_t hinic3_rx_fill_buffers(struct hinic3_rxq *rxq);
     285                 :            : 
     286                 :            : void hinic3_free_rxq_mbufs(struct hinic3_rxq *rxq);
     287                 :            : 
     288                 :            : void hinic3_free_all_rxq_mbufs(struct hinic3_nic_dev *nic_dev);
     289                 :            : 
     290                 :            : int hinic3_update_rss_config(struct rte_eth_dev *dev,
     291                 :            :                              struct rte_eth_rss_conf *rss_conf);
     292                 :            : 
     293                 :            : int hinic3_poll_rq_empty(struct hinic3_rxq *rxq);
     294                 :            : 
     295                 :            : void hinic3_dump_cqe_status(struct hinic3_rxq *rxq, uint32_t *cqe_done_cnt,
     296                 :            :                             uint32_t *cqe_hole_cnt, uint32_t *head_ci, uint32_t *head_done);
     297                 :            : 
     298                 :            : int hinic3_stop_rq(struct rte_eth_dev *eth_dev, struct hinic3_rxq *rxq);
     299                 :            : 
     300                 :            : int hinic3_start_rq(struct rte_eth_dev *eth_dev, struct hinic3_rxq *rxq);
     301                 :            : 
     302                 :            : uint16_t hinic3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
     303                 :            : 
     304                 :            : void hinic3_add_rq_to_rx_queue_list(struct hinic3_nic_dev *nic_dev,
     305                 :            :                                     uint16_t queue_id);
     306                 :            : 
     307                 :            : int hinic3_refill_indir_rqid(struct hinic3_rxq *rxq);
     308                 :            : 
     309                 :            : void hinic3_init_rx_queue_list(struct hinic3_nic_dev *nic_dev);
     310                 :            : 
     311                 :            : void hinic3_remove_rq_from_rx_queue_list(struct hinic3_nic_dev *nic_dev,
     312                 :            :                                          uint16_t queue_id);
     313                 :            : int hinic3_start_all_rqs(struct rte_eth_dev *eth_dev);
     314                 :            : 
     315                 :            : #ifdef HINIC3_XSTAT_RXBUF_INFO
     316                 :            : void hinic3_get_stats(struct hinic3_rxq *rxq);
     317                 :            : #endif
     318                 :            : 
     319                 :            : /**
     320                 :            :  * Get receive queue local ci.
     321                 :            :  *
     322                 :            :  * @param[in] rxq
     323                 :            :  * Pointer to receive queue structure.
     324                 :            :  * @return
     325                 :            :  * Receive queue local ci.
     326                 :            :  */
     327                 :            : static inline uint16_t
     328                 :            : hinic3_get_rq_local_ci(struct hinic3_rxq *rxq)
     329                 :            : {
     330         [ #  # ]:          0 :         return MASKED_QUEUE_IDX(rxq, rxq->cons_idx);
     331                 :            : }
     332                 :            : 
     333                 :            : static inline uint16_t
     334                 :            : hinic3_get_rq_free_wqebb(struct hinic3_rxq *rxq)
     335                 :            : {
     336   [ #  #  #  # ]:          0 :         return rxq->delta - 1;
     337                 :            : }
     338                 :            : 
     339                 :            : /**
     340                 :            :  * Update receive queue local ci.
     341                 :            :  *
     342                 :            :  * @param[in] rxq
     343                 :            :  * Pointer to receive queue structure.
     344                 :            :  * @param[out] wqe_cnt
     345                 :            :  * Wqebb counters.
     346                 :            :  */
     347                 :            : static inline void
     348                 :            : hinic3_update_rq_local_ci(struct hinic3_rxq *rxq, uint16_t wqe_cnt)
     349                 :            : {
     350                 :          0 :         rxq->cons_idx += wqe_cnt;
     351         [ #  # ]:          0 :         rxq->delta += wqe_cnt;
     352                 :          0 : }
     353                 :            : 
     354                 :            : #endif /* _HINIC3_RX_H_ */

Generated by: LCOV version 1.14