xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_tx.h (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
1*17fcb3dcSFan Gong /* SPDX-License-Identifier: GPL-2.0 */
2*17fcb3dcSFan Gong /* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */
3*17fcb3dcSFan Gong 
4*17fcb3dcSFan Gong #ifndef _HINIC3_TX_H_
5*17fcb3dcSFan Gong #define _HINIC3_TX_H_
6*17fcb3dcSFan Gong 
7*17fcb3dcSFan Gong #include <linux/bitops.h>
8*17fcb3dcSFan Gong #include <linux/ip.h>
9*17fcb3dcSFan Gong #include <linux/ipv6.h>
10*17fcb3dcSFan Gong #include <linux/netdevice.h>
11*17fcb3dcSFan Gong #include <net/checksum.h>
12*17fcb3dcSFan Gong 
13*17fcb3dcSFan Gong #define VXLAN_OFFLOAD_PORT_LE            cpu_to_be16(4789)
14*17fcb3dcSFan Gong #define TCP_HDR_DATA_OFF_UNIT_SHIFT      2
15*17fcb3dcSFan Gong #define TRANSPORT_OFFSET(l4_hdr, skb)    ((l4_hdr) - (skb)->data)
16*17fcb3dcSFan Gong 
17*17fcb3dcSFan Gong #define HINIC3_COMPACT_WQEE_SKB_MAX_LEN  16383
18*17fcb3dcSFan Gong #define HINIC3_TX_POLL_WEIGHT		 64
19*17fcb3dcSFan Gong #define HINIC3_DEFAULT_STOP_THRS	 6
20*17fcb3dcSFan Gong #define HINIC3_DEFAULT_START_THRS	 24
21*17fcb3dcSFan Gong 
22*17fcb3dcSFan Gong enum sq_wqe_data_format {
23*17fcb3dcSFan Gong 	SQ_NORMAL_WQE = 0,
24*17fcb3dcSFan Gong };
25*17fcb3dcSFan Gong 
26*17fcb3dcSFan Gong enum sq_wqe_ec_type {
27*17fcb3dcSFan Gong 	SQ_WQE_COMPACT_TYPE  = 0,
28*17fcb3dcSFan Gong 	SQ_WQE_EXTENDED_TYPE = 1,
29*17fcb3dcSFan Gong };
30*17fcb3dcSFan Gong 
31*17fcb3dcSFan Gong enum sq_wqe_tasksect_len_type {
32*17fcb3dcSFan Gong 	SQ_WQE_TASKSECT_46BITS  = 0,
33*17fcb3dcSFan Gong 	SQ_WQE_TASKSECT_16BYTES = 1,
34*17fcb3dcSFan Gong };
35*17fcb3dcSFan Gong 
36*17fcb3dcSFan Gong enum hinic3_tx_offload_type {
37*17fcb3dcSFan Gong 	HINIC3_TX_OFFLOAD_TSO     = BIT(0),
38*17fcb3dcSFan Gong 	HINIC3_TX_OFFLOAD_CSUM    = BIT(1),
39*17fcb3dcSFan Gong 	HINIC3_TX_OFFLOAD_VLAN    = BIT(2),
40*17fcb3dcSFan Gong 	HINIC3_TX_OFFLOAD_INVALID = BIT(3),
41*17fcb3dcSFan Gong 	HINIC3_TX_OFFLOAD_ESP     = BIT(4),
42*17fcb3dcSFan Gong };
43*17fcb3dcSFan Gong 
44*17fcb3dcSFan Gong #define SQ_CTRL_BUFDESC_NUM_MASK   GENMASK(26, 19)
45*17fcb3dcSFan Gong #define SQ_CTRL_TASKSECT_LEN_MASK  BIT(27)
46*17fcb3dcSFan Gong #define SQ_CTRL_DATA_FORMAT_MASK   BIT(28)
47*17fcb3dcSFan Gong #define SQ_CTRL_EXTENDED_MASK      BIT(30)
48*17fcb3dcSFan Gong #define SQ_CTRL_OWNER_MASK         BIT(31)
49*17fcb3dcSFan Gong #define SQ_CTRL_SET(val, member) \
50*17fcb3dcSFan Gong 	FIELD_PREP(SQ_CTRL_##member##_MASK, val)
51*17fcb3dcSFan Gong 
52*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_PLDOFF_MASK  GENMASK(9, 2)
53*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_UFO_MASK     BIT(10)
54*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_TSO_MASK     BIT(11)
55*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_MSS_MASK     GENMASK(26, 13)
56*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_UC_MASK      BIT(28)
57*17fcb3dcSFan Gong 
58*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_SET(val, member) \
59*17fcb3dcSFan Gong 	FIELD_PREP(SQ_CTRL_QUEUE_INFO_##member##_MASK, val)
60*17fcb3dcSFan Gong #define SQ_CTRL_QUEUE_INFO_GET(val, member) \
61*17fcb3dcSFan Gong 	FIELD_GET(SQ_CTRL_QUEUE_INFO_##member##_MASK, val)
62*17fcb3dcSFan Gong 
63*17fcb3dcSFan Gong #define SQ_CTRL_MAX_PLDOFF  221
64*17fcb3dcSFan Gong 
65*17fcb3dcSFan Gong #define SQ_TASK_INFO0_TUNNEL_FLAG_MASK  BIT(19)
66*17fcb3dcSFan Gong #define SQ_TASK_INFO0_INNER_L4_EN_MASK  BIT(24)
67*17fcb3dcSFan Gong #define SQ_TASK_INFO0_INNER_L3_EN_MASK  BIT(25)
68*17fcb3dcSFan Gong #define SQ_TASK_INFO0_OUT_L4_EN_MASK    BIT(27)
69*17fcb3dcSFan Gong #define SQ_TASK_INFO0_OUT_L3_EN_MASK    BIT(28)
70*17fcb3dcSFan Gong #define SQ_TASK_INFO0_SET(val, member) \
71*17fcb3dcSFan Gong 	FIELD_PREP(SQ_TASK_INFO0_##member##_MASK, val)
72*17fcb3dcSFan Gong 
73*17fcb3dcSFan Gong #define SQ_TASK_INFO3_VLAN_TAG_MASK        GENMASK(15, 0)
74*17fcb3dcSFan Gong #define SQ_TASK_INFO3_VLAN_TPID_MASK       GENMASK(18, 16)
75*17fcb3dcSFan Gong #define SQ_TASK_INFO3_VLAN_TAG_VALID_MASK  BIT(19)
76*17fcb3dcSFan Gong #define SQ_TASK_INFO3_SET(val, member) \
77*17fcb3dcSFan Gong 	FIELD_PREP(SQ_TASK_INFO3_##member##_MASK, val)
78*17fcb3dcSFan Gong 
79*17fcb3dcSFan Gong struct hinic3_sq_wqe_desc {
80*17fcb3dcSFan Gong 	u32 ctrl_len;
81*17fcb3dcSFan Gong 	u32 queue_info;
82*17fcb3dcSFan Gong 	u32 hi_addr;
83*17fcb3dcSFan Gong 	u32 lo_addr;
84*17fcb3dcSFan Gong };
85*17fcb3dcSFan Gong 
86*17fcb3dcSFan Gong struct hinic3_sq_task {
87*17fcb3dcSFan Gong 	u32 pkt_info0;
88*17fcb3dcSFan Gong 	u32 ip_identify;
89*17fcb3dcSFan Gong 	u32 rsvd;
90*17fcb3dcSFan Gong 	u32 vlan_offload;
91*17fcb3dcSFan Gong };
92*17fcb3dcSFan Gong 
93*17fcb3dcSFan Gong struct hinic3_sq_wqe_combo {
94*17fcb3dcSFan Gong 	struct hinic3_sq_wqe_desc *ctrl_bd0;
95*17fcb3dcSFan Gong 	struct hinic3_sq_task     *task;
96*17fcb3dcSFan Gong 	struct hinic3_sq_bufdesc  *bds_head;
97*17fcb3dcSFan Gong 	struct hinic3_sq_bufdesc  *bds_sec2;
98*17fcb3dcSFan Gong 	u16                       first_bds_num;
99*17fcb3dcSFan Gong 	u32                       wqe_type;
100*17fcb3dcSFan Gong 	u32                       task_type;
101*17fcb3dcSFan Gong };
102*17fcb3dcSFan Gong 
103*17fcb3dcSFan Gong struct hinic3_dma_info {
104*17fcb3dcSFan Gong 	dma_addr_t dma;
105*17fcb3dcSFan Gong 	u32        len;
106*17fcb3dcSFan Gong };
107*17fcb3dcSFan Gong 
108*17fcb3dcSFan Gong struct hinic3_tx_info {
109*17fcb3dcSFan Gong 	struct sk_buff         *skb;
110*17fcb3dcSFan Gong 	u16                    wqebb_cnt;
111*17fcb3dcSFan Gong 	struct hinic3_dma_info *dma_info;
112*17fcb3dcSFan Gong };
113*17fcb3dcSFan Gong 
114*17fcb3dcSFan Gong struct hinic3_txq {
115*17fcb3dcSFan Gong 	struct net_device       *netdev;
116*17fcb3dcSFan Gong 	struct device           *dev;
117*17fcb3dcSFan Gong 
118*17fcb3dcSFan Gong 	u16                     q_id;
119*17fcb3dcSFan Gong 	u16                     tx_stop_thrs;
120*17fcb3dcSFan Gong 	u16                     tx_start_thrs;
121*17fcb3dcSFan Gong 	u32                     q_mask;
122*17fcb3dcSFan Gong 	u32                     q_depth;
123*17fcb3dcSFan Gong 
124*17fcb3dcSFan Gong 	struct hinic3_tx_info   *tx_info;
125*17fcb3dcSFan Gong 	struct hinic3_io_queue  *sq;
126*17fcb3dcSFan Gong } ____cacheline_aligned;
127*17fcb3dcSFan Gong 
128*17fcb3dcSFan Gong int hinic3_alloc_txqs(struct net_device *netdev);
129*17fcb3dcSFan Gong void hinic3_free_txqs(struct net_device *netdev);
130*17fcb3dcSFan Gong 
131*17fcb3dcSFan Gong netdev_tx_t hinic3_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
132*17fcb3dcSFan Gong bool hinic3_tx_poll(struct hinic3_txq *txq, int budget);
133*17fcb3dcSFan Gong void hinic3_flush_txqs(struct net_device *netdev);
134*17fcb3dcSFan Gong 
135*17fcb3dcSFan Gong #endif
136