164727024SZiyang Xuan /* SPDX-License-Identifier: BSD-3-Clause 264727024SZiyang Xuan * Copyright(c) 2017 Huawei Technologies Co., Ltd 364727024SZiyang Xuan */ 464727024SZiyang Xuan 564727024SZiyang Xuan #ifndef _HINIC_PMD_RX_H_ 664727024SZiyang Xuan #define _HINIC_PMD_RX_H_ 764727024SZiyang Xuan 864727024SZiyang Xuan #define HINIC_DEFAULT_RX_FREE_THRESH 32 964727024SZiyang Xuan 1064727024SZiyang Xuan #define HINIC_RSS_OFFLOAD_ALL ( \ 11295968d1SFerruh Yigit RTE_ETH_RSS_IPV4 | \ 12295968d1SFerruh Yigit RTE_ETH_RSS_FRAG_IPV4 |\ 13295968d1SFerruh Yigit RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ 14295968d1SFerruh Yigit RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ 15295968d1SFerruh Yigit RTE_ETH_RSS_IPV6 | \ 16295968d1SFerruh Yigit RTE_ETH_RSS_FRAG_IPV6 | \ 17295968d1SFerruh Yigit RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ 18295968d1SFerruh Yigit RTE_ETH_RSS_NONFRAG_IPV6_UDP | \ 19295968d1SFerruh Yigit RTE_ETH_RSS_IPV6_EX | \ 20295968d1SFerruh Yigit RTE_ETH_RSS_IPV6_TCP_EX | \ 21295968d1SFerruh Yigit RTE_ETH_RSS_IPV6_UDP_EX) 2264727024SZiyang Xuan 2364727024SZiyang Xuan enum rq_completion_fmt { 2464727024SZiyang Xuan RQ_COMPLETE_SGE = 1 2564727024SZiyang Xuan }; 2664727024SZiyang Xuan 2764727024SZiyang Xuan struct hinic_rq_ctrl { 2864727024SZiyang Xuan u32 ctrl_fmt; 2964727024SZiyang Xuan }; 3064727024SZiyang Xuan 3127595cd8STyler Retzlaff #if defined(RTE_ARCH_ARM64) 3227595cd8STyler Retzlaff struct __rte_cache_aligned hinic_rq_cqe { 3327595cd8STyler Retzlaff #else 3464727024SZiyang Xuan struct hinic_rq_cqe { 3527595cd8STyler Retzlaff #endif 36*e12a0166STyler Retzlaff RTE_ATOMIC(u32) status; 3764727024SZiyang Xuan u32 vlan_len; 3864727024SZiyang Xuan u32 offload_type; 3964727024SZiyang Xuan u32 rss_hash; 4064727024SZiyang Xuan 4164727024SZiyang Xuan u32 rsvd[4]; 42fae4b8c4SXiaoyun Wang }; 4364727024SZiyang Xuan 4464727024SZiyang Xuan struct hinic_rq_cqe_sect { 4564727024SZiyang Xuan struct hinic_sge sge; 4664727024SZiyang Xuan u32 rsvd; 4764727024SZiyang Xuan }; 4864727024SZiyang Xuan 4964727024SZiyang Xuan struct hinic_rq_bufdesc { 5064727024SZiyang Xuan u32 addr_high; 5164727024SZiyang Xuan u32 addr_low; 5264727024SZiyang Xuan }; 5364727024SZiyang Xuan 5464727024SZiyang Xuan struct hinic_rq_wqe { 5564727024SZiyang Xuan struct hinic_rq_ctrl ctrl; 5664727024SZiyang Xuan u32 rsvd; 5764727024SZiyang Xuan struct hinic_rq_cqe_sect cqe_sect; 5864727024SZiyang Xuan struct hinic_rq_bufdesc buf_desc; 5964727024SZiyang Xuan }; 6064727024SZiyang Xuan 6164727024SZiyang Xuan struct hinic_rxq_stats { 6264727024SZiyang Xuan u64 packets; 6364727024SZiyang Xuan u64 bytes; 6464727024SZiyang Xuan u64 rx_nombuf; 6564727024SZiyang Xuan u64 errors; 6664727024SZiyang Xuan u64 rx_discards; 6764727024SZiyang Xuan u64 burst_pkts; 6864727024SZiyang Xuan }; 6964727024SZiyang Xuan 7064727024SZiyang Xuan /* Attention, Do not add any member in hinic_rx_info 7164727024SZiyang Xuan * as rxq bulk rearm mode will write mbuf in rx_info 7264727024SZiyang Xuan */ 7364727024SZiyang Xuan struct hinic_rx_info { 7464727024SZiyang Xuan struct rte_mbuf *mbuf; 7564727024SZiyang Xuan }; 7664727024SZiyang Xuan 7764727024SZiyang Xuan struct hinic_rxq { 7864727024SZiyang Xuan struct hinic_wq *wq; 7964727024SZiyang Xuan volatile u16 *pi_virt_addr; 8064727024SZiyang Xuan 8164727024SZiyang Xuan u16 port_id; 8264727024SZiyang Xuan u16 q_id; 8364727024SZiyang Xuan u16 q_depth; 8464727024SZiyang Xuan u16 buf_len; 8564727024SZiyang Xuan 8664727024SZiyang Xuan u16 rx_free_thresh; 8764727024SZiyang Xuan u16 rxinfo_align_end; 8864727024SZiyang Xuan 891b7b9f17SXiaoyun Wang u32 socket_id; 901b7b9f17SXiaoyun Wang 9164727024SZiyang Xuan unsigned long status; 9264727024SZiyang Xuan struct hinic_rxq_stats rxq_stats; 9364727024SZiyang Xuan 9464727024SZiyang Xuan struct hinic_nic_dev *nic_dev; 9564727024SZiyang Xuan 9664727024SZiyang Xuan struct hinic_rx_info *rx_info; 9764727024SZiyang Xuan volatile struct hinic_rq_cqe *rx_cqe; 9864727024SZiyang Xuan 9964727024SZiyang Xuan dma_addr_t cqe_start_paddr; 10064727024SZiyang Xuan void *cqe_start_vaddr; 10164727024SZiyang Xuan struct rte_mempool *mb_pool; 10264727024SZiyang Xuan }; 10364727024SZiyang Xuan 10464727024SZiyang Xuan int hinic_setup_rx_resources(struct hinic_rxq *rxq); 10564727024SZiyang Xuan 10664727024SZiyang Xuan void hinic_free_all_rx_resources(struct rte_eth_dev *eth_dev); 10764727024SZiyang Xuan 10864727024SZiyang Xuan void hinic_free_all_rx_mbuf(struct rte_eth_dev *eth_dev); 10964727024SZiyang Xuan 11064727024SZiyang Xuan void hinic_free_rx_resources(struct hinic_rxq *rxq); 11164727024SZiyang Xuan 11264727024SZiyang Xuan u16 hinic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, u16 nb_pkts); 11364727024SZiyang Xuan 114c3ba1f0fSXiaoyun Wang void hinic_free_all_rx_mbufs(struct hinic_rxq *rxq); 11564727024SZiyang Xuan 11664727024SZiyang Xuan void hinic_rx_alloc_pkts(struct hinic_rxq *rxq); 11764727024SZiyang Xuan 11864727024SZiyang Xuan void hinic_rxq_get_stats(struct hinic_rxq *rxq, struct hinic_rxq_stats *stats); 11964727024SZiyang Xuan 12064727024SZiyang Xuan void hinic_rxq_stats_reset(struct hinic_rxq *rxq); 12164727024SZiyang Xuan 12264727024SZiyang Xuan int hinic_config_mq_mode(struct rte_eth_dev *dev, bool on); 12364727024SZiyang Xuan 12464727024SZiyang Xuan int hinic_rx_configure(struct rte_eth_dev *dev); 12564727024SZiyang Xuan 12664727024SZiyang Xuan void hinic_rx_remove_configure(struct rte_eth_dev *dev); 12764727024SZiyang Xuan 12864727024SZiyang Xuan void hinic_get_func_rx_buf_size(struct hinic_nic_dev *nic_dev); 12964727024SZiyang Xuan 1301b7b9f17SXiaoyun Wang int hinic_create_rq(struct hinic_hwdev *hwdev, u16 q_id, 1311b7b9f17SXiaoyun Wang u16 rq_depth, unsigned int socket_id); 13264727024SZiyang Xuan 13364727024SZiyang Xuan void hinic_destroy_rq(struct hinic_hwdev *hwdev, u16 q_id); 13464727024SZiyang Xuan 13564727024SZiyang Xuan #endif /* _HINIC_PMD_RX_H_ */ 136