xref: /dpdk/drivers/net/enetfec/enet_ethdev.h (revision 191128d7f6a02b816deaa86d761fbde4483724e9)
1fc0ec740SApeksha Gupta /* SPDX-License-Identifier: BSD-3-Clause
2fc0ec740SApeksha Gupta  * Copyright 2020-2021 NXP
3fc0ec740SApeksha Gupta  */
4fc0ec740SApeksha Gupta 
5fc0ec740SApeksha Gupta #ifndef __ENETFEC_ETHDEV_H__
6fc0ec740SApeksha Gupta #define __ENETFEC_ETHDEV_H__
7fc0ec740SApeksha Gupta 
8b84fdd39SApeksha Gupta #include <rte_ethdev.h>
9b84fdd39SApeksha Gupta 
10ecae7157SApeksha Gupta #define BD_LEN			49152
11ecae7157SApeksha Gupta #define ENETFEC_TX_FR_SIZE	2048
12ecae7157SApeksha Gupta #define ETH_HLEN		RTE_ETHER_HDR_LEN
13ecae7157SApeksha Gupta 
14b84fdd39SApeksha Gupta /* full duplex */
15b84fdd39SApeksha Gupta #define FULL_DUPLEX		0x00
16b84fdd39SApeksha Gupta 
17bb5b5bf1SApeksha Gupta #define MAX_TX_BD_RING_SIZE	512	/* It should be power of 2 */
18bb5b5bf1SApeksha Gupta #define MAX_RX_BD_RING_SIZE	512
19b84fdd39SApeksha Gupta #define PKT_MAX_BUF_SIZE	1984
20b84fdd39SApeksha Gupta #define OPT_FRAME_SIZE		(PKT_MAX_BUF_SIZE << 16)
21bb5b5bf1SApeksha Gupta #define ENETFEC_MAX_RX_PKT_LEN	3000
22b84fdd39SApeksha Gupta 
23bb5b5bf1SApeksha Gupta #define __iomem
24ecae7157SApeksha Gupta #if defined(RTE_ARCH_ARM)
25ecae7157SApeksha Gupta #if defined(RTE_ARCH_64)
26ecae7157SApeksha Gupta #define dcbf(p) { asm volatile("dc cvac, %0" : : "r"(p) : "memory"); }
27ecae7157SApeksha Gupta #define dcbf_64(p) dcbf(p)
28ecae7157SApeksha Gupta 
29ecae7157SApeksha Gupta #else /* RTE_ARCH_32 */
30ecae7157SApeksha Gupta #define dcbf(p) RTE_SET_USED(p)
31ecae7157SApeksha Gupta #define dcbf_64(p) dcbf(p)
32ecae7157SApeksha Gupta #endif
33ecae7157SApeksha Gupta 
34ecae7157SApeksha Gupta #else
35ecae7157SApeksha Gupta #define dcbf(p) RTE_SET_USED(p)
36ecae7157SApeksha Gupta #define dcbf_64(p) dcbf(p)
37ecae7157SApeksha Gupta #endif
38ecae7157SApeksha Gupta 
39fc0ec740SApeksha Gupta /*
40fc0ec740SApeksha Gupta  * ENETFEC can support 1 rx and tx queue..
41fc0ec740SApeksha Gupta  */
42fc0ec740SApeksha Gupta 
43fc0ec740SApeksha Gupta #define ENETFEC_MAX_Q		1
44fc0ec740SApeksha Gupta 
45*93998f3cSTyler Retzlaff #define writel(v, p) __extension__ ({*(volatile unsigned int *)(p) = (v); })
46b84fdd39SApeksha Gupta #define readl(p) rte_read32(p)
47b84fdd39SApeksha Gupta 
48bb5b5bf1SApeksha Gupta struct bufdesc {
49bb5b5bf1SApeksha Gupta 	uint16_t		bd_datlen;  /* buffer data length */
50bb5b5bf1SApeksha Gupta 	uint16_t		bd_sc;      /* buffer control & status */
51bb5b5bf1SApeksha Gupta 	uint32_t		bd_bufaddr; /* buffer address */
52bb5b5bf1SApeksha Gupta };
53bb5b5bf1SApeksha Gupta 
54bb5b5bf1SApeksha Gupta struct bufdesc_ex {
55bb5b5bf1SApeksha Gupta 	struct			bufdesc desc;
56bb5b5bf1SApeksha Gupta 	uint32_t		bd_esc;
57bb5b5bf1SApeksha Gupta 	uint32_t		bd_prot;
58bb5b5bf1SApeksha Gupta 	uint32_t		bd_bdu;
59bb5b5bf1SApeksha Gupta 	uint32_t		ts;
60bb5b5bf1SApeksha Gupta 	uint16_t		res0[4];
61bb5b5bf1SApeksha Gupta };
62bb5b5bf1SApeksha Gupta 
63bb5b5bf1SApeksha Gupta struct bufdesc_prop {
64bb5b5bf1SApeksha Gupta 	int			queue_id;
65bb5b5bf1SApeksha Gupta 	/* Addresses of Tx and Rx buffers */
66bb5b5bf1SApeksha Gupta 	struct bufdesc		*base;
67bb5b5bf1SApeksha Gupta 	struct bufdesc		*last;
68bb5b5bf1SApeksha Gupta 	struct bufdesc		*cur;
69bb5b5bf1SApeksha Gupta 	void __iomem		*active_reg_desc;
70bb5b5bf1SApeksha Gupta 	uint64_t		descr_baseaddr_p;
71bb5b5bf1SApeksha Gupta 	unsigned short		ring_size;
72bb5b5bf1SApeksha Gupta 	unsigned char		d_size;
73bb5b5bf1SApeksha Gupta 	unsigned char		d_size_log2;
74bb5b5bf1SApeksha Gupta };
75bb5b5bf1SApeksha Gupta 
76bb5b5bf1SApeksha Gupta struct enetfec_priv_tx_q {
77bb5b5bf1SApeksha Gupta 	struct bufdesc_prop	bd;
78bb5b5bf1SApeksha Gupta 	struct rte_mbuf		*tx_mbuf[MAX_TX_BD_RING_SIZE];
79bb5b5bf1SApeksha Gupta 	struct bufdesc		*dirty_tx;
80bb5b5bf1SApeksha Gupta 	struct rte_mempool	*pool;
81bb5b5bf1SApeksha Gupta 	struct enetfec_private	*fep;
82bb5b5bf1SApeksha Gupta };
83bb5b5bf1SApeksha Gupta 
84bb5b5bf1SApeksha Gupta struct enetfec_priv_rx_q {
85bb5b5bf1SApeksha Gupta 	struct bufdesc_prop	bd;
86bb5b5bf1SApeksha Gupta 	struct rte_mbuf		*rx_mbuf[MAX_RX_BD_RING_SIZE];
87bb5b5bf1SApeksha Gupta 	struct rte_mempool	*pool;
88bb5b5bf1SApeksha Gupta 	struct enetfec_private	*fep;
89bb5b5bf1SApeksha Gupta };
90bb5b5bf1SApeksha Gupta 
91fc0ec740SApeksha Gupta struct enetfec_private {
92fc0ec740SApeksha Gupta 	struct rte_eth_dev	*dev;
93ecae7157SApeksha Gupta 	struct rte_eth_stats	stats;
94b84fdd39SApeksha Gupta 	int			full_duplex;
95b84fdd39SApeksha Gupta 	int			flag_pause;
96c75b9c3aSApeksha Gupta 	int			flag_csum;
97b84fdd39SApeksha Gupta 	uint32_t		quirks;
98b84fdd39SApeksha Gupta 	uint32_t		cbus_size;
99b84fdd39SApeksha Gupta 	uint32_t		enetfec_e_cntl;
100b84fdd39SApeksha Gupta 	uint16_t		max_rx_queues;
101b84fdd39SApeksha Gupta 	uint16_t		max_tx_queues;
102bb5b5bf1SApeksha Gupta 	unsigned int		total_tx_ring_size;
103bb5b5bf1SApeksha Gupta 	unsigned int		total_rx_ring_size;
104b84fdd39SApeksha Gupta 	unsigned int		reg_size;
105b84fdd39SApeksha Gupta 	unsigned int		bd_size;
106b84fdd39SApeksha Gupta 	bool			bufdesc_ex;
107b84fdd39SApeksha Gupta 	bool			rgmii_txc_delay;
108b84fdd39SApeksha Gupta 	bool			rgmii_rxc_delay;
109b84fdd39SApeksha Gupta 	void			*hw_baseaddr_v;
110b84fdd39SApeksha Gupta 	void			*bd_addr_v;
111b84fdd39SApeksha Gupta 	uint32_t		hw_baseaddr_p;
112b84fdd39SApeksha Gupta 	uint32_t		bd_addr_p;
113b84fdd39SApeksha Gupta 	uint32_t		bd_addr_p_r[ENETFEC_MAX_Q];
114b84fdd39SApeksha Gupta 	uint32_t		bd_addr_p_t[ENETFEC_MAX_Q];
115b84fdd39SApeksha Gupta 	void			*dma_baseaddr_r[ENETFEC_MAX_Q];
116b84fdd39SApeksha Gupta 	void			*dma_baseaddr_t[ENETFEC_MAX_Q];
117bb5b5bf1SApeksha Gupta 	struct enetfec_priv_rx_q *rx_queues[ENETFEC_MAX_Q];
118bb5b5bf1SApeksha Gupta 	struct enetfec_priv_tx_q *tx_queues[ENETFEC_MAX_Q];
119fc0ec740SApeksha Gupta };
120fc0ec740SApeksha Gupta 
121bb5b5bf1SApeksha Gupta static inline struct
122bb5b5bf1SApeksha Gupta bufdesc *enet_get_nextdesc(struct bufdesc *bdp, struct bufdesc_prop *bd)
123bb5b5bf1SApeksha Gupta {
124bb5b5bf1SApeksha Gupta 	return (bdp >= bd->last) ? bd->base
125bb5b5bf1SApeksha Gupta 		: (struct bufdesc *)(((uintptr_t)bdp) + bd->d_size);
126bb5b5bf1SApeksha Gupta }
127bb5b5bf1SApeksha Gupta 
128bb5b5bf1SApeksha Gupta static inline struct
129bb5b5bf1SApeksha Gupta bufdesc *enet_get_prevdesc(struct bufdesc *bdp, struct bufdesc_prop *bd)
130bb5b5bf1SApeksha Gupta {
131bb5b5bf1SApeksha Gupta 	return (bdp <= bd->base) ? bd->last
132bb5b5bf1SApeksha Gupta 		: (struct bufdesc *)(((uintptr_t)bdp) - bd->d_size);
133bb5b5bf1SApeksha Gupta }
134bb5b5bf1SApeksha Gupta 
135bb5b5bf1SApeksha Gupta static inline int
136bb5b5bf1SApeksha Gupta enet_get_bd_index(struct bufdesc *bdp, struct bufdesc_prop *bd)
137bb5b5bf1SApeksha Gupta {
138bb5b5bf1SApeksha Gupta 	return ((const char *)bdp - (const char *)bd->base) >> bd->d_size_log2;
139bb5b5bf1SApeksha Gupta }
140bb5b5bf1SApeksha Gupta 
141ecae7157SApeksha Gupta uint16_t enetfec_recv_pkts(void *rxq1, struct rte_mbuf **rx_pkts,
142ecae7157SApeksha Gupta 		uint16_t nb_pkts);
143ecae7157SApeksha Gupta uint16_t enetfec_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
144ecae7157SApeksha Gupta 		uint16_t nb_pkts);
145ecae7157SApeksha Gupta 
146fc0ec740SApeksha Gupta #endif /*__ENETFEC_ETHDEV_H__*/
147