1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
3 
4 #ifndef _PRESTERA_H_
5 #define _PRESTERA_H_
6 
7 #include <linux/notifier.h>
8 #include <linux/skbuff.h>
9 #include <linux/workqueue.h>
10 #include <net/devlink.h>
11 #include <uapi/linux/if_ether.h>
12 
13 #define PRESTERA_DRV_NAME	"prestera"
14 
15 #define PRESTERA_DEFAULT_VID    1
16 
17 struct prestera_fw_rev {
18 	u16 maj;
19 	u16 min;
20 	u16 sub;
21 };
22 
23 struct prestera_port_stats {
24 	u64 good_octets_received;
25 	u64 bad_octets_received;
26 	u64 mac_trans_error;
27 	u64 broadcast_frames_received;
28 	u64 multicast_frames_received;
29 	u64 frames_64_octets;
30 	u64 frames_65_to_127_octets;
31 	u64 frames_128_to_255_octets;
32 	u64 frames_256_to_511_octets;
33 	u64 frames_512_to_1023_octets;
34 	u64 frames_1024_to_max_octets;
35 	u64 excessive_collision;
36 	u64 multicast_frames_sent;
37 	u64 broadcast_frames_sent;
38 	u64 fc_sent;
39 	u64 fc_received;
40 	u64 buffer_overrun;
41 	u64 undersize;
42 	u64 fragments;
43 	u64 oversize;
44 	u64 jabber;
45 	u64 rx_error_frame_received;
46 	u64 bad_crc;
47 	u64 collisions;
48 	u64 late_collision;
49 	u64 unicast_frames_received;
50 	u64 unicast_frames_sent;
51 	u64 sent_multiple;
52 	u64 sent_deferred;
53 	u64 good_octets_sent;
54 };
55 
56 #define PRESTERA_AP_PORT_MAX   (10)
57 
58 struct prestera_port_caps {
59 	u64 supp_link_modes;
60 	u8 supp_fec;
61 	u8 type;
62 	u8 transceiver;
63 };
64 
65 struct prestera_lag {
66 	struct net_device *dev;
67 	struct list_head members;
68 	u16 member_count;
69 	u16 lag_id;
70 };
71 
72 struct prestera_flow_block;
73 
74 struct prestera_port_mac_state {
75 	u32 mode;
76 	u32 speed;
77 	bool oper;
78 	u8 duplex;
79 	u8 fc;
80 	u8 fec;
81 };
82 
83 struct prestera_port_phy_state {
84 	u64 lmode_bmap;
85 	struct {
86 		bool pause;
87 		bool asym_pause;
88 	} remote_fc;
89 	u8 mdix;
90 };
91 
92 struct prestera_port_mac_config {
93 	u32 mode;
94 	u32 speed;
95 	bool admin;
96 	u8 inband;
97 	u8 duplex;
98 	u8 fec;
99 };
100 
101 struct prestera_port_phy_config {
102 	u32 mode;
103 	bool admin;
104 	u8 mdix;
105 };
106 
107 struct prestera_port {
108 	struct net_device *dev;
109 	struct prestera_switch *sw;
110 	struct prestera_flow_block *ingress_flow_block;
111 	struct prestera_flow_block *egress_flow_block;
112 	struct devlink_port dl_port;
113 	struct list_head lag_member;
114 	struct prestera_lag *lag;
115 	u32 id;
116 	u32 hw_id;
117 	u32 dev_id;
118 	u16 fp_id;
119 	u16 pvid;
120 	bool autoneg;
121 	u64 adver_link_modes;
122 	u8 adver_fec;
123 	struct prestera_port_caps caps;
124 	struct list_head list;
125 	struct list_head vlans_list;
126 	struct {
127 		struct prestera_port_stats stats;
128 		struct delayed_work caching_dw;
129 	} cached_hw_stats;
130 	struct prestera_port_mac_config cfg_mac;
131 	struct prestera_port_phy_config cfg_phy;
132 	struct prestera_port_mac_state state_mac;
133 	struct prestera_port_phy_state state_phy;
134 };
135 
136 struct prestera_device {
137 	struct device *dev;
138 	u8 __iomem *ctl_regs;
139 	u8 __iomem *pp_regs;
140 	struct prestera_fw_rev fw_rev;
141 	void *priv;
142 
143 	/* called by device driver to handle received packets */
144 	void (*recv_pkt)(struct prestera_device *dev);
145 
146 	/* called by device driver to pass event up to the higher layer */
147 	int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size);
148 
149 	/* called by higher layer to send request to the firmware */
150 	int (*send_req)(struct prestera_device *dev, int qid, void *in_msg,
151 			size_t in_size, void *out_msg, size_t out_size,
152 			unsigned int wait);
153 };
154 
155 enum prestera_event_type {
156 	PRESTERA_EVENT_TYPE_UNSPEC,
157 
158 	PRESTERA_EVENT_TYPE_PORT,
159 	PRESTERA_EVENT_TYPE_FDB,
160 	PRESTERA_EVENT_TYPE_RXTX,
161 
162 	PRESTERA_EVENT_TYPE_MAX
163 };
164 
165 enum prestera_rxtx_event_id {
166 	PRESTERA_RXTX_EVENT_UNSPEC,
167 	PRESTERA_RXTX_EVENT_RCV_PKT,
168 };
169 
170 enum prestera_port_event_id {
171 	PRESTERA_PORT_EVENT_UNSPEC,
172 	PRESTERA_PORT_EVENT_MAC_STATE_CHANGED,
173 };
174 
175 struct prestera_port_event {
176 	u32 port_id;
177 	union {
178 		struct {
179 			u32 mode;
180 			u32 speed;
181 			u8 oper;
182 			u8 duplex;
183 			u8 fc;
184 			u8 fec;
185 		} mac;
186 		struct {
187 			u64 lmode_bmap;
188 			struct {
189 				bool pause;
190 				bool asym_pause;
191 			} remote_fc;
192 			u8 mdix;
193 		} phy;
194 	} data;
195 };
196 
197 enum prestera_fdb_entry_type {
198 	PRESTERA_FDB_ENTRY_TYPE_REG_PORT,
199 	PRESTERA_FDB_ENTRY_TYPE_LAG,
200 	PRESTERA_FDB_ENTRY_TYPE_MAX
201 };
202 
203 enum prestera_fdb_event_id {
204 	PRESTERA_FDB_EVENT_UNSPEC,
205 	PRESTERA_FDB_EVENT_LEARNED,
206 	PRESTERA_FDB_EVENT_AGED,
207 };
208 
209 struct prestera_fdb_event {
210 	enum prestera_fdb_entry_type type;
211 	union {
212 		u32 port_id;
213 		u16 lag_id;
214 	} dest;
215 	u32 vid;
216 	union {
217 		u8 mac[ETH_ALEN];
218 	} data;
219 };
220 
221 struct prestera_event {
222 	u16 id;
223 	union {
224 		struct prestera_port_event port_evt;
225 		struct prestera_fdb_event fdb_evt;
226 	};
227 };
228 
229 enum prestera_if_type {
230 	/* the interface is of port type (dev,port) */
231 	PRESTERA_IF_PORT_E = 0,
232 
233 	/* the interface is of lag type (lag-id) */
234 	PRESTERA_IF_LAG_E = 1,
235 
236 	/* the interface is of Vid type (vlan-id) */
237 	PRESTERA_IF_VID_E = 3,
238 };
239 
240 struct prestera_iface {
241 	enum prestera_if_type type;
242 	struct {
243 		u32 hw_dev_num;
244 		u32 port_num;
245 	} dev_port;
246 	u32 hw_dev_num;
247 	u16 vr_id;
248 	u16 lag_id;
249 	u16 vlan_id;
250 };
251 
252 struct prestera_switchdev;
253 struct prestera_span;
254 struct prestera_rxtx;
255 struct prestera_trap_data;
256 struct prestera_acl;
257 
258 struct prestera_switch {
259 	struct prestera_device *dev;
260 	struct prestera_switchdev *swdev;
261 	struct prestera_rxtx *rxtx;
262 	struct prestera_acl *acl;
263 	struct prestera_span *span;
264 	struct list_head event_handlers;
265 	struct notifier_block netdev_nb;
266 	struct prestera_trap_data *trap_data;
267 	char base_mac[ETH_ALEN];
268 	struct list_head port_list;
269 	rwlock_t port_list_lock;
270 	u32 port_count;
271 	u32 mtu_min;
272 	u32 mtu_max;
273 	u8 id;
274 	struct prestera_router *router;
275 	struct prestera_lag *lags;
276 	struct prestera_counter *counter;
277 	u8 lag_member_max;
278 	u8 lag_max;
279 };
280 
281 struct prestera_router {
282 	struct prestera_switch *sw;
283 	struct list_head vr_list;
284 	struct list_head rif_entry_list;
285 	struct rhashtable fib_ht;
286 	struct rhashtable kern_fib_cache_ht;
287 	struct notifier_block inetaddr_nb;
288 	struct notifier_block inetaddr_valid_nb;
289 	struct notifier_block fib_nb;
290 };
291 
292 struct prestera_rxtx_params {
293 	bool use_sdma;
294 	u32 map_addr;
295 };
296 
297 #define prestera_dev(sw)		((sw)->dev->dev)
298 
299 static inline void prestera_write(const struct prestera_switch *sw,
300 				  unsigned int reg, u32 val)
301 {
302 	writel(val, sw->dev->pp_regs + reg);
303 }
304 
305 static inline u32 prestera_read(const struct prestera_switch *sw,
306 				unsigned int reg)
307 {
308 	return readl(sw->dev->pp_regs + reg);
309 }
310 
311 int prestera_device_register(struct prestera_device *dev);
312 void prestera_device_unregister(struct prestera_device *dev);
313 
314 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
315 						 u32 dev_id, u32 hw_id);
316 
317 int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes);
318 
319 int prestera_router_init(struct prestera_switch *sw);
320 void prestera_router_fini(struct prestera_switch *sw);
321 
322 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
323 
324 int prestera_port_cfg_mac_read(struct prestera_port *port,
325 			       struct prestera_port_mac_config *cfg);
326 
327 int prestera_port_cfg_mac_write(struct prestera_port *port,
328 				struct prestera_port_mac_config *cfg);
329 
330 struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
331 
332 void prestera_queue_work(struct work_struct *work);
333 
334 int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
335 
336 bool prestera_netdev_check(const struct net_device *dev);
337 
338 int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr);
339 
340 bool prestera_port_is_lag_member(const struct prestera_port *port);
341 
342 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id);
343 
344 u16 prestera_port_lag_id(const struct prestera_port *port);
345 
346 #endif /* _PRESTERA_H_ */
347