Prepare v2023.10
[platform/kernel/u-boot.git] / include / fsl-mc / fsl_dpmac.h
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)
39 struct dpmac_cmd_open {
40         __le32 dpmac_id;
41 };
42
43 struct dpmac_cmd_create {
44         __le32 mac_id;
45 };
46
47 struct 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
56 struct 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
67 struct dpmac_cmd_get_counter {
68         u8 type;
69 };
70
71 struct 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
82 struct fsl_mc_io;
83
84 int dpmac_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpmac_id, u16 *token);
85
86 int 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  */
96 struct dpmac_cfg {
97         int mac_id;
98 };
99
100 int dpmac_create(struct fsl_mc_io *mc_io, u16 dprc_token, u32 cmd_flags,
101                  const struct dpmac_cfg *cfg, u32 *obj_id);
102
103 int 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  */
113 enum 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  */
132 enum 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  */
162 struct 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  */
190 struct dpmac_link_state {
191         u32 rate;
192         u64 options;
193         int up;
194         int state_valid;
195         u64 supported;
196         u64 advertising;
197 };
198
199 int 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  */
248 enum 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
279 int dpmac_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
280                       enum dpmac_counter type, u64 *counter);
281
282 int 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 */