1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Freescale Layerscape MC I/O wrapper
4 *
5 * Copyright 2015-2016 Freescale Semiconductor, Inc.
6 * Copyright 2017 NXP
7 * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
8 */
9
10#ifndef __FSL_DPMAC_H
11#define __FSL_DPMAC_H
12
13/* DPMAC Version */
14#define DPMAC_VER_MAJOR				4
15#define DPMAC_VER_MINOR				2
16
17/* Command IDs */
18#define DPMAC_CMDID_CLOSE			0x8001
19#define DPMAC_CMDID_OPEN			0x80c1
20#define DPMAC_CMDID_CREATE			0x90c1
21#define DPMAC_CMDID_DESTROY			0x98c1
22#define DPMAC_CMDID_GET_API_VERSION             0xa0c1
23
24#define DPMAC_CMDID_RESET			0x0051
25
26#define DPMAC_CMDID_SET_LINK_STATE		0x0c31
27#define DPMAC_CMDID_GET_COUNTER			0x0c41
28
29/* Macros for accessing command fields smaller than 1byte */
30#define DPMAC_MASK(field)        \
31	GENMASK(DPMAC_##field##_SHIFT + DPMAC_##field##_SIZE - 1, \
32		DPMAC_##field##_SHIFT)
33#define dpmac_set_field(var, field, val) \
34	((var) |= (((val) << DPMAC_##field##_SHIFT) & DPMAC_MASK(field)))
35#define dpmac_get_field(var, field)      \
36	(((var) & DPMAC_MASK(field)) >> DPMAC_##field##_SHIFT)
37
38#pragma pack(push, 1)
39struct dpmac_cmd_open {
40	__le32 dpmac_id;
41};
42
43struct dpmac_cmd_create {
44	__le32 mac_id;
45};
46
47struct dpmac_cmd_destroy {
48	__le32 dpmac_id;
49};
50
51#define DPMAC_STATE_SIZE		1
52#define DPMAC_STATE_SHIFT		0
53#define DPMAC_STATE_VALID_SIZE		1
54#define DPMAC_STATE_VALID_SHIFT		1
55
56struct dpmac_cmd_set_link_state {
57	__le64 options;
58	__le32 rate;
59	__le32 pad;
60	/* only least significant bit is valid */
61	u8 up;
62	u8 pad0[7];
63	__le64 supported;
64	__le64 advertising;
65};
66
67struct dpmac_cmd_get_counter {
68	u8 type;
69};
70
71struct dpmac_rsp_get_counter {
72	__le64 pad;
73	__le64 counter;
74};
75
76#pragma pack(pop)
77
78/* Data Path MAC API
79 * Contains initialization APIs and runtime control APIs for DPMAC
80 */
81
82struct fsl_mc_io;
83
84int dpmac_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpmac_id, u16 *token);
85
86int dpmac_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
87
88/**
89 * struct dpmac_cfg - Structure representing DPMAC configuration
90 * @mac_id:	Represents the Hardware MAC ID; in case of multiple WRIOP,
91 *		the MAC IDs are continuous.
92 *		For example:  2 WRIOPs, 16 MACs in each:
93 *				MAC IDs for the 1st WRIOP: 1-16,
94 *				MAC IDs for the 2nd WRIOP: 17-32.
95 */
96struct dpmac_cfg {
97	int mac_id;
98};
99
100int dpmac_create(struct fsl_mc_io *mc_io, u16 dprc_token, u32 cmd_flags,
101		 const struct dpmac_cfg *cfg, u32 *obj_id);
102
103int dpmac_destroy(struct fsl_mc_io *mc_io, u16 dprc_token, u32 cmd_flags,
104		  u32 object_id);
105
106/**
107 * enum dpmac_link_type -  DPMAC link type
108 * @DPMAC_LINK_TYPE_NONE: No link
109 * @DPMAC_LINK_TYPE_FIXED: Link is fixed type
110 * @DPMAC_LINK_TYPE_PHY: Link by PHY ID
111 * @DPMAC_LINK_TYPE_BACKPLANE: Backplane link type
112 */
113enum dpmac_link_type {
114	DPMAC_LINK_TYPE_NONE,
115	DPMAC_LINK_TYPE_FIXED,
116	DPMAC_LINK_TYPE_PHY,
117	DPMAC_LINK_TYPE_BACKPLANE
118};
119
120/**
121 * enum dpmac_eth_if - DPMAC Ethrnet interface
122 * @DPMAC_ETH_IF_MII: MII interface
123 * @DPMAC_ETH_IF_RMII: RMII interface
124 * @DPMAC_ETH_IF_SMII: SMII interface
125 * @DPMAC_ETH_IF_GMII: GMII interface
126 * @DPMAC_ETH_IF_RGMII: RGMII interface
127 * @DPMAC_ETH_IF_SGMII: SGMII interface
128 * @DPMAC_ETH_IF_QSGMII: QSGMII interface
129 * @DPMAC_ETH_IF_XAUI: XAUI interface
130 * @DPMAC_ETH_IF_XFI: XFI interface
131 */
132enum dpmac_eth_if {
133	DPMAC_ETH_IF_MII,
134	DPMAC_ETH_IF_RMII,
135	DPMAC_ETH_IF_SMII,
136	DPMAC_ETH_IF_GMII,
137	DPMAC_ETH_IF_RGMII,
138	DPMAC_ETH_IF_SGMII,
139	DPMAC_ETH_IF_QSGMII,
140	DPMAC_ETH_IF_XAUI,
141	DPMAC_ETH_IF_XFI
142};
143
144/* DPMAC IRQ Index and Events */
145
146/* IRQ index */
147#define DPMAC_IRQ_INDEX						0
148/* IRQ event - indicates a change in link state */
149#define DPMAC_IRQ_EVENT_LINK_CFG_REQ		0x00000001
150/* irq event - Indicates that the link state changed */
151#define DPMAC_IRQ_EVENT_LINK_CHANGED		0x00000002
152
153/**
154 * struct dpmac_attr - Structure representing DPMAC attributes
155 * @id:		DPMAC object ID
156 * @phy_id:	PHY ID
157 * @link_type: link type
158 * @eth_if: Ethernet interface
159 * @max_rate: Maximum supported rate - in Mbps
160 * @version:	DPMAC version
161 */
162struct dpmac_attr {
163	int			id;
164	int			phy_id;
165	enum dpmac_link_type	link_type;
166	enum dpmac_eth_if	eth_if;
167	u32		max_rate;
168};
169
170/* DPMAC link configuration/state options */
171
172/* Enable auto-negotiation */
173#define DPMAC_LINK_OPT_AUTONEG		0x0000000000000001ULL
174/* Enable half-duplex mode */
175#define DPMAC_LINK_OPT_HALF_DUPLEX	0x0000000000000002ULL
176/* Enable pause frames */
177#define DPMAC_LINK_OPT_PAUSE		0x0000000000000004ULL
178/* Enable a-symmetric pause frames */
179#define DPMAC_LINK_OPT_ASYM_PAUSE	0x0000000000000008ULL
180
181/**
182 * struct dpmac_link_state - DPMAC link configuration request
183 * @rate: Rate in Mbps
184 * @options: Enable/Disable DPMAC link cfg features (bitmap)
185 * @up: Link state
186 * @state_valid: Ignore/Update the state of the link
187 * @supported: Speeds capability of the phy (bitmap)
188 * @advertising: Speeds that are advertised for autoneg (bitmap)
189 */
190struct dpmac_link_state {
191	u32 rate;
192	u64 options;
193	int up;
194	int state_valid;
195	u64 supported;
196	u64 advertising;
197};
198
199int dpmac_set_link_state(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
200			 struct dpmac_link_state *link_state);
201/**
202 * enum dpni_counter - DPNI counter types
203 * @DPMAC_CNT_ING_FRAME_64: counts 64-octet frame, good or bad.
204 * @DPMAC_CNT_ING_FRAME_127: counts 65- to 127-octet frame, good or bad.
205 * @DPMAC_CNT_ING_FRAME_255: counts 128- to 255-octet frame, good or bad.
206 * @DPMAC_CNT_ING_FRAME_511: counts 256- to 511-octet frame, good or bad.
207 * @DPMAC_CNT_ING_FRAME_1023: counts 512- to 1023-octet frame, good or bad.
208 * @DPMAC_CNT_ING_FRAME_1518: counts 1024- to 1518-octet frame, good or bad.
209 * @DPMAC_CNT_ING_FRAME_1519_MAX: counts 1519-octet frame and larger
210 *				  (up to max frame length specified),
211 *				  good or bad.
212 * @DPMAC_CNT_ING_FRAG: counts packet which is shorter than 64 octets received
213 *			with a wrong CRC
214 * @DPMAC_CNT_ING_JABBER: counts packet longer than the maximum frame length
215 *			  specified, with a bad frame check sequence.
216 * @DPMAC_CNT_ING_FRAME_DISCARD: counts dropped packet due to internal errors.
217 *				 Occurs when a receive FIFO overflows.
218 *				 Includes also packets truncated as a result of
219 *				 the receive FIFO overflow.
220 * @DPMAC_CNT_ING_ALIGN_ERR: counts frame with an alignment error
221 *			     (optional used for wrong SFD)
222 * @DPMAC_CNT_EGR_UNDERSIZED: counts packet transmitted that was less than 64
223 *			      octets long with a good CRC.
224 * @DPMAC_CNT_ING_OVERSIZED: counts packet longer than the maximum frame length
225 *			     specified, with a good frame check sequence.
226 * @DPMAC_CNT_ING_VALID_PAUSE_FRAME: counts valid pause frame (regular and PFC).
227 * @DPMAC_CNT_EGR_VALID_PAUSE_FRAME: counts valid pause frame transmitted
228 *				     (regular and PFC).
229 * @DPMAC_CNT_ING_BYTE: counts octet received except preamble for all valid
230 *				frames and valid pause frames.
231 * @DPMAC_CNT_ING_MCAST_FRAME: counts received multicast frame
232 * @DPMAC_CNT_ING_BCAST_FRAME: counts received broadcast frame
233 * @DPMAC_CNT_ING_ALL_FRAME: counts each good or bad packet received.
234 * @DPMAC_CNT_ING_UCAST_FRAME: counts received unicast frame
235 * @DPMAC_CNT_ING_ERR_FRAME: counts frame received with an error
236 *			     (except for undersized/fragment frame)
237 * @DPMAC_CNT_EGR_BYTE: counts octet transmitted except preamble for all valid
238 *			frames and valid pause frames transmitted.
239 * @DPMAC_CNT_EGR_MCAST_FRAME: counts transmitted multicast frame
240 * @DPMAC_CNT_EGR_BCAST_FRAME: counts transmitted broadcast frame
241 * @DPMAC_CNT_EGR_UCAST_FRAME: counts transmitted unicast frame
242 * @DPMAC_CNT_EGR_ERR_FRAME: counts frame transmitted with an error
243 * @DPMAC_CNT_ING_GOOD_FRAME: counts frame received without error, including
244 *			      pause frames.
245 * @DPMAC_CNT_EGR_GOOD_FRAME: counts frames transmitted without error, including
246 *			      pause frames.
247 */
248enum dpmac_counter {
249	DPMAC_CNT_ING_FRAME_64,
250	DPMAC_CNT_ING_FRAME_127,
251	DPMAC_CNT_ING_FRAME_255,
252	DPMAC_CNT_ING_FRAME_511,
253	DPMAC_CNT_ING_FRAME_1023,
254	DPMAC_CNT_ING_FRAME_1518,
255	DPMAC_CNT_ING_FRAME_1519_MAX,
256	DPMAC_CNT_ING_FRAG,
257	DPMAC_CNT_ING_JABBER,
258	DPMAC_CNT_ING_FRAME_DISCARD,
259	DPMAC_CNT_ING_ALIGN_ERR,
260	DPMAC_CNT_EGR_UNDERSIZED,
261	DPMAC_CNT_ING_OVERSIZED,
262	DPMAC_CNT_ING_VALID_PAUSE_FRAME,
263	DPMAC_CNT_EGR_VALID_PAUSE_FRAME,
264	DPMAC_CNT_ING_BYTE,
265	DPMAC_CNT_ING_MCAST_FRAME,
266	DPMAC_CNT_ING_BCAST_FRAME,
267	DPMAC_CNT_ING_ALL_FRAME,
268	DPMAC_CNT_ING_UCAST_FRAME,
269	DPMAC_CNT_ING_ERR_FRAME,
270	DPMAC_CNT_EGR_BYTE,
271	DPMAC_CNT_EGR_MCAST_FRAME,
272	DPMAC_CNT_EGR_BCAST_FRAME,
273	DPMAC_CNT_EGR_UCAST_FRAME,
274	DPMAC_CNT_EGR_ERR_FRAME,
275	DPMAC_CNT_ING_GOOD_FRAME,
276	DPMAC_CNT_EGR_GOOD_FRAME,
277};
278
279int dpmac_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
280		      enum dpmac_counter type, u64 *counter);
281
282int dpmac_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
283			  u16 *major_ver, u16 *minor_ver);
284
285#endif /* __FSL_DPMAC_H */
286