49fa565173be1f2c14037bdbb1c97386c06059b7
[dpdk.git] / drivers / net / hinic / hinic_pmd_rx.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Huawei Technologies Co., Ltd
3  */
4
5 #ifndef _HINIC_PMD_RX_H_
6 #define _HINIC_PMD_RX_H_
7
8 #define HINIC_DEFAULT_RX_FREE_THRESH    32
9
10 #define HINIC_RSS_OFFLOAD_ALL ( \
11         ETH_RSS_IPV4 | \
12         ETH_RSS_FRAG_IPV4 |\
13         ETH_RSS_NONFRAG_IPV4_TCP | \
14         ETH_RSS_NONFRAG_IPV4_UDP | \
15         ETH_RSS_IPV6 | \
16         ETH_RSS_FRAG_IPV6 | \
17         ETH_RSS_NONFRAG_IPV6_TCP | \
18         ETH_RSS_NONFRAG_IPV6_UDP | \
19         ETH_RSS_IPV6_EX | \
20         ETH_RSS_IPV6_TCP_EX | \
21         ETH_RSS_IPV6_UDP_EX)
22
23 enum rq_completion_fmt {
24         RQ_COMPLETE_SGE = 1
25 };
26
27 struct hinic_rq_ctrl {
28         u32     ctrl_fmt;
29 };
30
31 struct hinic_rq_cqe {
32         u32 status;
33         u32 vlan_len;
34         u32 offload_type;
35         u32 rss_hash;
36
37         u32 rsvd[4];
38 } __rte_cache_aligned;
39
40 struct hinic_rq_cqe_sect {
41         struct hinic_sge        sge;
42         u32                     rsvd;
43 };
44
45 struct hinic_rq_bufdesc {
46         u32     addr_high;
47         u32     addr_low;
48 };
49
50 struct hinic_rq_wqe {
51         struct hinic_rq_ctrl            ctrl;
52         u32                             rsvd;
53         struct hinic_rq_cqe_sect        cqe_sect;
54         struct hinic_rq_bufdesc         buf_desc;
55 };
56
57 struct hinic_rxq_stats {
58         u64 packets;
59         u64 bytes;
60         u64 rx_nombuf;
61         u64 errors;
62         u64 rx_discards;
63         u64 burst_pkts;
64 };
65
66 /* Attention, Do not add any member in hinic_rx_info
67  * as rxq bulk rearm mode will write mbuf in rx_info
68  */
69 struct hinic_rx_info {
70         struct rte_mbuf *mbuf;
71 };
72
73 struct hinic_rxq {
74         struct hinic_wq *wq;
75         volatile u16 *pi_virt_addr;
76
77         u16 port_id;
78         u16 q_id;
79         u16 q_depth;
80         u16 buf_len;
81
82         u16 rx_free_thresh;
83         u16 rxinfo_align_end;
84
85         u32 socket_id;
86
87         unsigned long status;
88         struct hinic_rxq_stats rxq_stats;
89
90         struct hinic_nic_dev *nic_dev;
91
92         struct hinic_rx_info    *rx_info;
93         volatile struct hinic_rq_cqe *rx_cqe;
94
95         dma_addr_t cqe_start_paddr;
96         void *cqe_start_vaddr;
97         struct rte_mempool *mb_pool;
98 };
99
100 int hinic_setup_rx_resources(struct hinic_rxq *rxq);
101
102 void hinic_free_all_rx_resources(struct rte_eth_dev *eth_dev);
103
104 void hinic_free_all_rx_mbuf(struct rte_eth_dev *eth_dev);
105
106 void hinic_free_rx_resources(struct hinic_rxq *rxq);
107
108 u16 hinic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, u16 nb_pkts);
109
110 void hinic_free_all_rx_mbufs(struct hinic_rxq *rxq);
111
112 void hinic_rx_alloc_pkts(struct hinic_rxq *rxq);
113
114 void hinic_rxq_get_stats(struct hinic_rxq *rxq, struct hinic_rxq_stats *stats);
115
116 void hinic_rxq_stats_reset(struct hinic_rxq *rxq);
117
118 int hinic_config_mq_mode(struct rte_eth_dev *dev, bool on);
119
120 int hinic_rx_configure(struct rte_eth_dev *dev);
121
122 void hinic_rx_remove_configure(struct rte_eth_dev *dev);
123
124 void hinic_get_func_rx_buf_size(struct hinic_nic_dev *nic_dev);
125
126 int hinic_create_rq(struct hinic_hwdev *hwdev, u16 q_id,
127                         u16 rq_depth, unsigned int socket_id);
128
129 void hinic_destroy_rq(struct hinic_hwdev *hwdev, u16 q_id);
130
131 #endif /* _HINIC_PMD_RX_H_ */