xref: /dpdk/drivers/net/hinic/hinic_pmd_rx.h (revision e12a0166c80f65e35408f4715b2f3a60763c3741)
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