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