xref: /openbmc/linux/drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
21edb9ca6SSiva Reddy /* 10G controller driver for Samsung SoCs
31edb9ca6SSiva Reddy  *
41edb9ca6SSiva Reddy  * Copyright (C) 2013 Samsung Electronics Co., Ltd.
51edb9ca6SSiva Reddy  *		http://www.samsung.com
61edb9ca6SSiva Reddy  *
71edb9ca6SSiva Reddy  * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
81edb9ca6SSiva Reddy  */
91edb9ca6SSiva Reddy #ifndef __SXGBE_DESC_H__
101edb9ca6SSiva Reddy #define __SXGBE_DESC_H__
111edb9ca6SSiva Reddy 
121edb9ca6SSiva Reddy #define SXGBE_DESC_SIZE_BYTES	16
131edb9ca6SSiva Reddy 
141edb9ca6SSiva Reddy /* forward declaration */
151edb9ca6SSiva Reddy struct sxgbe_extra_stats;
161edb9ca6SSiva Reddy 
171edb9ca6SSiva Reddy /* Transmit checksum insertion control */
181edb9ca6SSiva Reddy enum tdes_csum_insertion {
191edb9ca6SSiva Reddy 	cic_disabled		= 0,	/* Checksum Insertion Control */
201edb9ca6SSiva Reddy 	cic_only_ip		= 1,	/* Only IP header */
211edb9ca6SSiva Reddy 	/* IP header but pseudoheader is not calculated */
221edb9ca6SSiva Reddy 	cic_no_pseudoheader	= 2,
231edb9ca6SSiva Reddy 	cic_full		= 3,	/* IP header and pseudoheader */
241edb9ca6SSiva Reddy };
251edb9ca6SSiva Reddy 
261edb9ca6SSiva Reddy struct sxgbe_tx_norm_desc {
271edb9ca6SSiva Reddy 	u64 tdes01; /* buf1 address */
281edb9ca6SSiva Reddy 	union {
291edb9ca6SSiva Reddy 		/* TX Read-Format Desc 2,3 */
301edb9ca6SSiva Reddy 		struct {
311edb9ca6SSiva Reddy 			/* TDES2 */
321edb9ca6SSiva Reddy 			u32 buf1_size:14;
331edb9ca6SSiva Reddy 			u32 vlan_tag_ctl:2;
341edb9ca6SSiva Reddy 			u32 buf2_size:14;
351edb9ca6SSiva Reddy 			u32 timestmp_enable:1;
361edb9ca6SSiva Reddy 			u32 int_on_com:1;
371edb9ca6SSiva Reddy 			/* TDES3 */
381edb9ca6SSiva Reddy 			union {
393ee2b7c4SByungho An 				u16 tcp_payload_len;
401edb9ca6SSiva Reddy 				struct {
411edb9ca6SSiva Reddy 					u32 total_pkt_len:15;
421edb9ca6SSiva Reddy 					u32 reserved1:1;
433ee2b7c4SByungho An 				} pkt_len;
441edb9ca6SSiva Reddy 			} tx_pkt_len;
451edb9ca6SSiva Reddy 
463ee2b7c4SByungho An 			u16 cksum_ctl:2;
473ee2b7c4SByungho An 			u16 tse_bit:1;
483ee2b7c4SByungho An 			u16 tcp_hdr_len:4;
493ee2b7c4SByungho An 			u16 sa_insert_ctl:3;
503ee2b7c4SByungho An 			u16 crc_pad_ctl:2;
513ee2b7c4SByungho An 			u16 last_desc:1;
523ee2b7c4SByungho An 			u16 first_desc:1;
533ee2b7c4SByungho An 			u16 ctxt_bit:1;
543ee2b7c4SByungho An 			u16 own_bit:1;
551edb9ca6SSiva Reddy 		} tx_rd_des23;
561edb9ca6SSiva Reddy 
571edb9ca6SSiva Reddy 		/* tx write back Desc 2,3 */
581edb9ca6SSiva Reddy 		struct {
591edb9ca6SSiva Reddy 			/* WB TES2 */
601edb9ca6SSiva Reddy 			u32 reserved1;
611edb9ca6SSiva Reddy 			/* WB TES3 */
621edb9ca6SSiva Reddy 			u32 reserved2:31;
631edb9ca6SSiva Reddy 			u32 own_bit:1;
641edb9ca6SSiva Reddy 		} tx_wb_des23;
651edb9ca6SSiva Reddy 	} tdes23;
661edb9ca6SSiva Reddy };
671edb9ca6SSiva Reddy 
681edb9ca6SSiva Reddy struct sxgbe_rx_norm_desc {
691edb9ca6SSiva Reddy 	union {
703ee2b7c4SByungho An 		u64 rdes01; /* buf1 address */
713ee2b7c4SByungho An 		union {
721edb9ca6SSiva Reddy 			u32 out_vlan_tag:16;
731edb9ca6SSiva Reddy 			u32 in_vlan_tag:16;
743ee2b7c4SByungho An 			u32 rss_hash;
753ee2b7c4SByungho An 		} rx_wb_des01;
763ee2b7c4SByungho An 	} rdes01;
771edb9ca6SSiva Reddy 
781edb9ca6SSiva Reddy 	union {
791edb9ca6SSiva Reddy 		/* RX Read format Desc 2,3 */
801edb9ca6SSiva Reddy 		struct{
811edb9ca6SSiva Reddy 			/* RDES2 */
823ee2b7c4SByungho An 			u64 buf2_addr:62;
831edb9ca6SSiva Reddy 			/* RDES3 */
841edb9ca6SSiva Reddy 			u32 int_on_com:1;
851edb9ca6SSiva Reddy 			u32 own_bit:1;
861edb9ca6SSiva Reddy 		} rx_rd_des23;
871edb9ca6SSiva Reddy 
881edb9ca6SSiva Reddy 		/* RX write back */
891edb9ca6SSiva Reddy 		struct{
901edb9ca6SSiva Reddy 			/* WB RDES2 */
911edb9ca6SSiva Reddy 			u32 hdr_len:10;
921edb9ca6SSiva Reddy 			u32 rdes2_reserved:2;
931edb9ca6SSiva Reddy 			u32 elrd_val:1;
941edb9ca6SSiva Reddy 			u32 iovt_sel:1;
951edb9ca6SSiva Reddy 			u32 res_pkt:1;
961edb9ca6SSiva Reddy 			u32 vlan_filter_match:1;
971edb9ca6SSiva Reddy 			u32 sa_filter_fail:1;
981edb9ca6SSiva Reddy 			u32 da_filter_fail:1;
991edb9ca6SSiva Reddy 			u32 hash_filter_pass:1;
1001edb9ca6SSiva Reddy 			u32 macaddr_filter_match:8;
1011edb9ca6SSiva Reddy 			u32 l3_filter_match:1;
1021edb9ca6SSiva Reddy 			u32 l4_filter_match:1;
1031edb9ca6SSiva Reddy 			u32 l34_filter_num:3;
1041edb9ca6SSiva Reddy 
1051edb9ca6SSiva Reddy 			/* WB RDES3 */
1061edb9ca6SSiva Reddy 			u32 pkt_len:14;
1071edb9ca6SSiva Reddy 			u32 rdes3_reserved:1;
1088f7807aeSVipul Pandya 			u32 err_summary:1;
1091edb9ca6SSiva Reddy 			u32 err_l2_type:4;
1101edb9ca6SSiva Reddy 			u32 layer34_pkt_type:4;
1111edb9ca6SSiva Reddy 			u32 no_coagulation_pkt:1;
1121edb9ca6SSiva Reddy 			u32 in_seq_pkt:1;
1131edb9ca6SSiva Reddy 			u32 rss_valid:1;
1141edb9ca6SSiva Reddy 			u32 context_des_avail:1;
1151edb9ca6SSiva Reddy 			u32 last_desc:1;
1161edb9ca6SSiva Reddy 			u32 first_desc:1;
1171edb9ca6SSiva Reddy 			u32 recv_context_desc:1;
1181edb9ca6SSiva Reddy 			u32 own_bit:1;
1191edb9ca6SSiva Reddy 		} rx_wb_des23;
1201edb9ca6SSiva Reddy 	} rdes23;
1211edb9ca6SSiva Reddy };
1221edb9ca6SSiva Reddy 
1231edb9ca6SSiva Reddy /* Context descriptor structure */
1241edb9ca6SSiva Reddy struct sxgbe_tx_ctxt_desc {
1251edb9ca6SSiva Reddy 	u32 tstamp_lo;
1261edb9ca6SSiva Reddy 	u32 tstamp_hi;
1271edb9ca6SSiva Reddy 	u32 maxseg_size:15;
1281edb9ca6SSiva Reddy 	u32 reserved1:1;
1291edb9ca6SSiva Reddy 	u32 ivlan_tag:16;
1301edb9ca6SSiva Reddy 	u32 vlan_tag:16;
1311edb9ca6SSiva Reddy 	u32 vltag_valid:1;
1321edb9ca6SSiva Reddy 	u32 ivlan_tag_valid:1;
1331edb9ca6SSiva Reddy 	u32 ivlan_tag_ctl:2;
1341edb9ca6SSiva Reddy 	u32 reserved2:3;
1351edb9ca6SSiva Reddy 	u32 ctxt_desc_err:1;
1361edb9ca6SSiva Reddy 	u32 reserved3:2;
1371edb9ca6SSiva Reddy 	u32 ostc:1;
1381edb9ca6SSiva Reddy 	u32 tcmssv:1;
1391edb9ca6SSiva Reddy 	u32 reserved4:2;
1401edb9ca6SSiva Reddy 	u32 ctxt_bit:1;
1411edb9ca6SSiva Reddy 	u32 own_bit:1;
1421edb9ca6SSiva Reddy };
1431edb9ca6SSiva Reddy 
1441edb9ca6SSiva Reddy struct sxgbe_rx_ctxt_desc {
1451edb9ca6SSiva Reddy 	u32 tstamp_lo;
1461edb9ca6SSiva Reddy 	u32 tstamp_hi;
1471edb9ca6SSiva Reddy 	u32 reserved1;
1481edb9ca6SSiva Reddy 	u32 ptp_msgtype:4;
1491edb9ca6SSiva Reddy 	u32 tstamp_available:1;
1501edb9ca6SSiva Reddy 	u32 ptp_rsp_err:1;
1511edb9ca6SSiva Reddy 	u32 tstamp_dropped:1;
1521edb9ca6SSiva Reddy 	u32 reserved2:23;
1531edb9ca6SSiva Reddy 	u32 rx_ctxt_desc:1;
1541edb9ca6SSiva Reddy 	u32 own_bit:1;
1551edb9ca6SSiva Reddy };
1561edb9ca6SSiva Reddy 
1571edb9ca6SSiva Reddy struct sxgbe_desc_ops {
1581edb9ca6SSiva Reddy 	/* DMA TX descriptor ring initialization */
1591edb9ca6SSiva Reddy 	void (*init_tx_desc)(struct sxgbe_tx_norm_desc *p);
1601edb9ca6SSiva Reddy 
1611edb9ca6SSiva Reddy 	/* Invoked by the xmit function to prepare the tx descriptor */
1621edb9ca6SSiva Reddy 	void (*tx_desc_enable_tse)(struct sxgbe_tx_norm_desc *p, u8 is_tse,
1631051125dSVipul Pandya 				   u32 total_hdr_len, u32 tcp_hdr_len,
1641edb9ca6SSiva Reddy 				   u32 tcp_payload_len);
1651edb9ca6SSiva Reddy 
1661edb9ca6SSiva Reddy 	/* Assign buffer lengths for descriptor */
1671edb9ca6SSiva Reddy 	void (*prepare_tx_desc)(struct sxgbe_tx_norm_desc *p, u8 is_fd,
1681edb9ca6SSiva Reddy 				int buf1_len, int pkt_len, int cksum);
1691edb9ca6SSiva Reddy 
1701edb9ca6SSiva Reddy 	/* Set VLAN control information */
1711edb9ca6SSiva Reddy 	void (*tx_vlanctl_desc)(struct sxgbe_tx_norm_desc *p, int vlan_ctl);
1721edb9ca6SSiva Reddy 
1731edb9ca6SSiva Reddy 	/* Set the owner of the descriptor */
1741edb9ca6SSiva Reddy 	void (*set_tx_owner)(struct sxgbe_tx_norm_desc *p);
1751edb9ca6SSiva Reddy 
1761edb9ca6SSiva Reddy 	/* Get the owner of the descriptor */
1771edb9ca6SSiva Reddy 	int (*get_tx_owner)(struct sxgbe_tx_norm_desc *p);
1781edb9ca6SSiva Reddy 
1791edb9ca6SSiva Reddy 	/* Invoked by the xmit function to close the tx descriptor */
1801edb9ca6SSiva Reddy 	void (*close_tx_desc)(struct sxgbe_tx_norm_desc *p);
1811edb9ca6SSiva Reddy 
1821edb9ca6SSiva Reddy 	/* Clean the tx descriptor as soon as the tx irq is received */
1831edb9ca6SSiva Reddy 	void (*release_tx_desc)(struct sxgbe_tx_norm_desc *p);
1841edb9ca6SSiva Reddy 
1851edb9ca6SSiva Reddy 	/* Clear interrupt on tx frame completion. When this bit is
1861edb9ca6SSiva Reddy 	 * set an interrupt happens as soon as the frame is transmitted
1871edb9ca6SSiva Reddy 	 */
1881edb9ca6SSiva Reddy 	void (*clear_tx_ic)(struct sxgbe_tx_norm_desc *p);
1891edb9ca6SSiva Reddy 
1901edb9ca6SSiva Reddy 	/* Last tx segment reports the transmit status */
1911edb9ca6SSiva Reddy 	int (*get_tx_ls)(struct sxgbe_tx_norm_desc *p);
1921edb9ca6SSiva Reddy 
1931edb9ca6SSiva Reddy 	/* Get the buffer size from the descriptor */
1941edb9ca6SSiva Reddy 	int (*get_tx_len)(struct sxgbe_tx_norm_desc *p);
1951edb9ca6SSiva Reddy 
1961edb9ca6SSiva Reddy 	/* Set tx timestamp enable bit */
1971edb9ca6SSiva Reddy 	void (*tx_enable_tstamp)(struct sxgbe_tx_norm_desc *p);
1981edb9ca6SSiva Reddy 
1991edb9ca6SSiva Reddy 	/* get tx timestamp status */
2001edb9ca6SSiva Reddy 	int (*get_tx_timestamp_status)(struct sxgbe_tx_norm_desc *p);
2011edb9ca6SSiva Reddy 
2021edb9ca6SSiva Reddy 	/* TX Context Descripto Specific */
2031edb9ca6SSiva Reddy 	void (*tx_ctxt_desc_set_ctxt)(struct sxgbe_tx_ctxt_desc *p);
2041edb9ca6SSiva Reddy 
2051edb9ca6SSiva Reddy 	/* Set the owner of the TX context descriptor */
2061edb9ca6SSiva Reddy 	void (*tx_ctxt_desc_set_owner)(struct sxgbe_tx_ctxt_desc *p);
2071edb9ca6SSiva Reddy 
2081edb9ca6SSiva Reddy 	/* Get the owner of the TX context descriptor */
2091edb9ca6SSiva Reddy 	int (*get_tx_ctxt_owner)(struct sxgbe_tx_ctxt_desc *p);
2101edb9ca6SSiva Reddy 
2111edb9ca6SSiva Reddy 	/* Set TX mss */
2121051125dSVipul Pandya 	void (*tx_ctxt_desc_set_mss)(struct sxgbe_tx_ctxt_desc *p, u16 mss);
2131edb9ca6SSiva Reddy 
2141edb9ca6SSiva Reddy 	/* Set TX mss */
2151edb9ca6SSiva Reddy 	int (*tx_ctxt_desc_get_mss)(struct sxgbe_tx_ctxt_desc *p);
2161edb9ca6SSiva Reddy 
2171edb9ca6SSiva Reddy 	/* Set TX tcmssv */
2181edb9ca6SSiva Reddy 	void (*tx_ctxt_desc_set_tcmssv)(struct sxgbe_tx_ctxt_desc *p);
2191edb9ca6SSiva Reddy 
2201edb9ca6SSiva Reddy 	/* Reset TX ostc */
2211edb9ca6SSiva Reddy 	void (*tx_ctxt_desc_reset_ostc)(struct sxgbe_tx_ctxt_desc *p);
2221edb9ca6SSiva Reddy 
2231edb9ca6SSiva Reddy 	/* Set IVLAN information */
2241edb9ca6SSiva Reddy 	void (*tx_ctxt_desc_set_ivlantag)(struct sxgbe_tx_ctxt_desc *p,
2251edb9ca6SSiva Reddy 					  int is_ivlanvalid, int ivlan_tag,
2261edb9ca6SSiva Reddy 					  int ivlan_ctl);
2271edb9ca6SSiva Reddy 
2281edb9ca6SSiva Reddy 	/* Return IVLAN Tag */
2291edb9ca6SSiva Reddy 	int (*tx_ctxt_desc_get_ivlantag)(struct sxgbe_tx_ctxt_desc *p);
2301edb9ca6SSiva Reddy 
2311edb9ca6SSiva Reddy 	/* Set VLAN Tag */
2321edb9ca6SSiva Reddy 	void (*tx_ctxt_desc_set_vlantag)(struct sxgbe_tx_ctxt_desc *p,
2331edb9ca6SSiva Reddy 					 int is_vlanvalid, int vlan_tag);
2341edb9ca6SSiva Reddy 
2351edb9ca6SSiva Reddy 	/* Return VLAN Tag */
2361edb9ca6SSiva Reddy 	int (*tx_ctxt_desc_get_vlantag)(struct sxgbe_tx_ctxt_desc *p);
2371edb9ca6SSiva Reddy 
2381edb9ca6SSiva Reddy 	/* Set Time stamp */
2391edb9ca6SSiva Reddy 	void (*tx_ctxt_set_tstamp)(struct sxgbe_tx_ctxt_desc *p,
2401edb9ca6SSiva Reddy 				   u8 ostc_enable, u64 tstamp);
2411edb9ca6SSiva Reddy 
2421edb9ca6SSiva Reddy 	/* Close TX context descriptor */
2431edb9ca6SSiva Reddy 	void (*close_tx_ctxt_desc)(struct sxgbe_tx_ctxt_desc *p);
2441edb9ca6SSiva Reddy 
2451edb9ca6SSiva Reddy 	/* WB status of context descriptor */
2461edb9ca6SSiva Reddy 	int (*get_tx_ctxt_cde)(struct sxgbe_tx_ctxt_desc *p);
2471edb9ca6SSiva Reddy 
2481edb9ca6SSiva Reddy 	/* DMA RX descriptor ring initialization */
2491edb9ca6SSiva Reddy 	void (*init_rx_desc)(struct sxgbe_rx_norm_desc *p, int disable_rx_ic,
2501edb9ca6SSiva Reddy 			     int mode, int end);
2511edb9ca6SSiva Reddy 
2521edb9ca6SSiva Reddy 	/* Get own bit */
2531edb9ca6SSiva Reddy 	int (*get_rx_owner)(struct sxgbe_rx_norm_desc *p);
2541edb9ca6SSiva Reddy 
2551edb9ca6SSiva Reddy 	/* Set own bit */
2561edb9ca6SSiva Reddy 	void (*set_rx_owner)(struct sxgbe_rx_norm_desc *p);
2571edb9ca6SSiva Reddy 
2583dc638d1SByungho An 	/* Set Interrupt on completion bit */
2593dc638d1SByungho An 	void (*set_rx_int_on_com)(struct sxgbe_rx_norm_desc *p);
2603dc638d1SByungho An 
2611edb9ca6SSiva Reddy 	/* Get the receive frame size */
2621edb9ca6SSiva Reddy 	int (*get_rx_frame_len)(struct sxgbe_rx_norm_desc *p);
2631edb9ca6SSiva Reddy 
2641edb9ca6SSiva Reddy 	/* Return first Descriptor status */
2651edb9ca6SSiva Reddy 	int (*get_rx_fd_status)(struct sxgbe_rx_norm_desc *p);
2661edb9ca6SSiva Reddy 
2671edb9ca6SSiva Reddy 	/* Return first Descriptor status */
2681edb9ca6SSiva Reddy 	int (*get_rx_ld_status)(struct sxgbe_rx_norm_desc *p);
2691edb9ca6SSiva Reddy 
2701edb9ca6SSiva Reddy 	/* Return the reception status looking at the RDES1 */
2711edb9ca6SSiva Reddy 	int (*rx_wbstatus)(struct sxgbe_rx_norm_desc *p,
2721edb9ca6SSiva Reddy 			   struct sxgbe_extra_stats *x, int *checksum);
2731edb9ca6SSiva Reddy 
2741edb9ca6SSiva Reddy 	/* Get own bit */
2751edb9ca6SSiva Reddy 	int (*get_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
2761edb9ca6SSiva Reddy 
2771edb9ca6SSiva Reddy 	/* Set own bit */
2781edb9ca6SSiva Reddy 	void (*set_rx_ctxt_owner)(struct sxgbe_rx_ctxt_desc *p);
2791edb9ca6SSiva Reddy 
2801edb9ca6SSiva Reddy 	/* Return the reception status looking at Context control information */
2811edb9ca6SSiva Reddy 	void (*rx_ctxt_wbstatus)(struct sxgbe_rx_ctxt_desc *p,
2821edb9ca6SSiva Reddy 				 struct sxgbe_extra_stats *x);
2831edb9ca6SSiva Reddy 
2841edb9ca6SSiva Reddy 	/* Get rx timestamp status */
2851edb9ca6SSiva Reddy 	int (*get_rx_ctxt_tstamp_status)(struct sxgbe_rx_ctxt_desc *p);
2861edb9ca6SSiva Reddy 
2871edb9ca6SSiva Reddy 	/* Get timestamp value for rx, need to check this */
2881edb9ca6SSiva Reddy 	u64 (*get_timestamp)(struct sxgbe_rx_ctxt_desc *p);
2891edb9ca6SSiva Reddy };
2901edb9ca6SSiva Reddy 
2911edb9ca6SSiva Reddy const struct sxgbe_desc_ops *sxgbe_get_desc_ops(void);
2921edb9ca6SSiva Reddy 
2931edb9ca6SSiva Reddy #endif /* __SXGBE_DESC_H__ */
294