1*c10d12e3SJakub Kicinski /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2*c10d12e3SJakub Kicinski /* Copyright (C) 2019 Netronome Systems, Inc. */
3*c10d12e3SJakub Kicinski 
4*c10d12e3SJakub Kicinski #ifndef _NFP_DP_NFDK_H_
5*c10d12e3SJakub Kicinski #define _NFP_DP_NFDK_H_
6*c10d12e3SJakub Kicinski 
7*c10d12e3SJakub Kicinski #include <linux/bitops.h>
8*c10d12e3SJakub Kicinski #include <linux/types.h>
9*c10d12e3SJakub Kicinski 
10*c10d12e3SJakub Kicinski #define NFDK_TX_DESC_PER_SIMPLE_PKT	2
11*c10d12e3SJakub Kicinski 
12*c10d12e3SJakub Kicinski #define NFDK_TX_MAX_DATA_PER_HEAD	SZ_4K
13*c10d12e3SJakub Kicinski #define NFDK_TX_MAX_DATA_PER_DESC	SZ_16K
14*c10d12e3SJakub Kicinski #define NFDK_TX_DESC_BLOCK_SZ		256
15*c10d12e3SJakub Kicinski #define NFDK_TX_DESC_BLOCK_CNT		(NFDK_TX_DESC_BLOCK_SZ /	\
16*c10d12e3SJakub Kicinski 					 sizeof(struct nfp_nfdk_tx_desc))
17*c10d12e3SJakub Kicinski #define NFDK_TX_DESC_STOP_CNT		(NFDK_TX_DESC_BLOCK_CNT *	\
18*c10d12e3SJakub Kicinski 					 NFDK_TX_DESC_PER_SIMPLE_PKT)
19*c10d12e3SJakub Kicinski #define NFDK_TX_MAX_DATA_PER_BLOCK	SZ_64K
20*c10d12e3SJakub Kicinski #define NFDK_TX_DESC_GATHER_MAX		17
21*c10d12e3SJakub Kicinski 
22*c10d12e3SJakub Kicinski /* TX descriptor format */
23*c10d12e3SJakub Kicinski 
24*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_MSS_MASK		GENMASK(13, 0)
25*c10d12e3SJakub Kicinski 
26*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_CHAIN_META		BIT(3)
27*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_ENCAP		BIT(2)
28*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_L4_CSUM		BIT(1)
29*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_L3_CSUM		BIT(0)
30*c10d12e3SJakub Kicinski 
31*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_DMA_LEN_HEAD	GENMASK(11, 0)
32*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_TYPE_HEAD		GENMASK(15, 12)
33*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_DMA_LEN		GENMASK(13, 0)
34*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_TYPE_NOP		0
35*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_TYPE_GATHER	1
36*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_TYPE_TSO		2
37*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_TYPE_SIMPLE	8
38*c10d12e3SJakub Kicinski #define NFDK_DESC_TX_EOP		BIT(14)
39*c10d12e3SJakub Kicinski 
40*c10d12e3SJakub Kicinski #define NFDK_META_LEN			GENMASK(7, 0)
41*c10d12e3SJakub Kicinski #define NFDK_META_FIELDS		GENMASK(31, 8)
42*c10d12e3SJakub Kicinski 
43*c10d12e3SJakub Kicinski #define D_BLOCK_CPL(idx)		(NFDK_TX_DESC_BLOCK_CNT -	\
44*c10d12e3SJakub Kicinski 					 (idx) % NFDK_TX_DESC_BLOCK_CNT)
45*c10d12e3SJakub Kicinski 
46*c10d12e3SJakub Kicinski struct nfp_nfdk_tx_desc {
47*c10d12e3SJakub Kicinski 	union {
48*c10d12e3SJakub Kicinski 		struct {
49*c10d12e3SJakub Kicinski 			u8 dma_addr_hi;  /* High bits of host buf address */
50*c10d12e3SJakub Kicinski 			u8 padding;  /* Must be zero */
51*c10d12e3SJakub Kicinski 			__le16 dma_len_type; /* Length to DMA for this desc */
52*c10d12e3SJakub Kicinski 			__le32 dma_addr_lo;  /* Low 32bit of host buf addr */
53*c10d12e3SJakub Kicinski 		};
54*c10d12e3SJakub Kicinski 
55*c10d12e3SJakub Kicinski 		struct {
56*c10d12e3SJakub Kicinski 			__le16 mss;	/* MSS to be used for LSO */
57*c10d12e3SJakub Kicinski 			u8 lso_hdrlen;  /* LSO, TCP payload offset */
58*c10d12e3SJakub Kicinski 			u8 lso_totsegs; /* LSO, total segments */
59*c10d12e3SJakub Kicinski 			u8 l3_offset;   /* L3 header offset */
60*c10d12e3SJakub Kicinski 			u8 l4_offset;   /* L4 header offset */
61*c10d12e3SJakub Kicinski 			__le16 lso_meta_res; /* Rsvd bits in TSO metadata */
62*c10d12e3SJakub Kicinski 		};
63*c10d12e3SJakub Kicinski 
64*c10d12e3SJakub Kicinski 		struct {
65*c10d12e3SJakub Kicinski 			u8 flags;	/* TX Flags, see @NFDK_DESC_TX_* */
66*c10d12e3SJakub Kicinski 			u8 reserved[7];	/* meta byte placeholder */
67*c10d12e3SJakub Kicinski 		};
68*c10d12e3SJakub Kicinski 
69*c10d12e3SJakub Kicinski 		__le32 vals[2];
70*c10d12e3SJakub Kicinski 		__le64 raw;
71*c10d12e3SJakub Kicinski 	};
72*c10d12e3SJakub Kicinski };
73*c10d12e3SJakub Kicinski 
74*c10d12e3SJakub Kicinski struct nfp_nfdk_tx_buf {
75*c10d12e3SJakub Kicinski 	union {
76*c10d12e3SJakub Kicinski 		/* First slot */
77*c10d12e3SJakub Kicinski 		union {
78*c10d12e3SJakub Kicinski 			struct sk_buff *skb;
79*c10d12e3SJakub Kicinski 			void *frag;
80*c10d12e3SJakub Kicinski 		};
81*c10d12e3SJakub Kicinski 
82*c10d12e3SJakub Kicinski 		/* 1 + nr_frags next slots */
83*c10d12e3SJakub Kicinski 		dma_addr_t dma_addr;
84*c10d12e3SJakub Kicinski 
85*c10d12e3SJakub Kicinski 		/* TSO (optional) */
86*c10d12e3SJakub Kicinski 		struct {
87*c10d12e3SJakub Kicinski 			u32 pkt_cnt;
88*c10d12e3SJakub Kicinski 			u32 real_len;
89*c10d12e3SJakub Kicinski 		};
90*c10d12e3SJakub Kicinski 
91*c10d12e3SJakub Kicinski 		u64 raw;
92*c10d12e3SJakub Kicinski 	};
93*c10d12e3SJakub Kicinski };
94*c10d12e3SJakub Kicinski 
95*c10d12e3SJakub Kicinski static inline int nfp_nfdk_headlen_to_segs(unsigned int headlen)
96*c10d12e3SJakub Kicinski {
97*c10d12e3SJakub Kicinski 	/* First descriptor fits less data, so adjust for that */
98*c10d12e3SJakub Kicinski 	return DIV_ROUND_UP(headlen +
99*c10d12e3SJakub Kicinski 			    NFDK_TX_MAX_DATA_PER_DESC -
100*c10d12e3SJakub Kicinski 			    NFDK_TX_MAX_DATA_PER_HEAD,
101*c10d12e3SJakub Kicinski 			    NFDK_TX_MAX_DATA_PER_DESC);
102*c10d12e3SJakub Kicinski }
103*c10d12e3SJakub Kicinski 
104*c10d12e3SJakub Kicinski int nfp_nfdk_poll(struct napi_struct *napi, int budget);
105*c10d12e3SJakub Kicinski netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev);
106*c10d12e3SJakub Kicinski bool
107*c10d12e3SJakub Kicinski nfp_nfdk_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
108*c10d12e3SJakub Kicinski 		     struct sk_buff *skb, bool old);
109*c10d12e3SJakub Kicinski void nfp_nfdk_ctrl_poll(struct tasklet_struct *t);
110*c10d12e3SJakub Kicinski void nfp_nfdk_rx_ring_fill_freelist(struct nfp_net_dp *dp,
111*c10d12e3SJakub Kicinski 				    struct nfp_net_rx_ring *rx_ring);
112*c10d12e3SJakub Kicinski #endif
113