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_HW_H_
5#define _PRESTERA_HW_H_
6
7#include <linux/types.h>
8
9enum prestera_accept_frm_type {
10	PRESTERA_ACCEPT_FRAME_TYPE_TAGGED,
11	PRESTERA_ACCEPT_FRAME_TYPE_UNTAGGED,
12	PRESTERA_ACCEPT_FRAME_TYPE_ALL,
13};
14
15enum prestera_fdb_flush_mode {
16	PRESTERA_FDB_FLUSH_MODE_DYNAMIC = BIT(0),
17	PRESTERA_FDB_FLUSH_MODE_STATIC = BIT(1),
18	PRESTERA_FDB_FLUSH_MODE_ALL = PRESTERA_FDB_FLUSH_MODE_DYNAMIC
19					| PRESTERA_FDB_FLUSH_MODE_STATIC,
20};
21
22enum {
23	PRESTERA_LINK_MODE_10baseT_Half,
24	PRESTERA_LINK_MODE_10baseT_Full,
25	PRESTERA_LINK_MODE_100baseT_Half,
26	PRESTERA_LINK_MODE_100baseT_Full,
27	PRESTERA_LINK_MODE_1000baseT_Half,
28	PRESTERA_LINK_MODE_1000baseT_Full,
29	PRESTERA_LINK_MODE_1000baseX_Full,
30	PRESTERA_LINK_MODE_1000baseKX_Full,
31	PRESTERA_LINK_MODE_2500baseX_Full,
32	PRESTERA_LINK_MODE_10GbaseKR_Full,
33	PRESTERA_LINK_MODE_10GbaseSR_Full,
34	PRESTERA_LINK_MODE_10GbaseLR_Full,
35	PRESTERA_LINK_MODE_20GbaseKR2_Full,
36	PRESTERA_LINK_MODE_25GbaseCR_Full,
37	PRESTERA_LINK_MODE_25GbaseKR_Full,
38	PRESTERA_LINK_MODE_25GbaseSR_Full,
39	PRESTERA_LINK_MODE_40GbaseKR4_Full,
40	PRESTERA_LINK_MODE_40GbaseCR4_Full,
41	PRESTERA_LINK_MODE_40GbaseSR4_Full,
42	PRESTERA_LINK_MODE_50GbaseCR2_Full,
43	PRESTERA_LINK_MODE_50GbaseKR2_Full,
44	PRESTERA_LINK_MODE_50GbaseSR2_Full,
45	PRESTERA_LINK_MODE_100GbaseKR4_Full,
46	PRESTERA_LINK_MODE_100GbaseSR4_Full,
47	PRESTERA_LINK_MODE_100GbaseCR4_Full,
48
49	PRESTERA_LINK_MODE_MAX
50};
51
52enum {
53	PRESTERA_PORT_TYPE_NONE,
54	PRESTERA_PORT_TYPE_TP,
55	PRESTERA_PORT_TYPE_AUI,
56	PRESTERA_PORT_TYPE_MII,
57	PRESTERA_PORT_TYPE_FIBRE,
58	PRESTERA_PORT_TYPE_BNC,
59	PRESTERA_PORT_TYPE_DA,
60	PRESTERA_PORT_TYPE_OTHER,
61
62	PRESTERA_PORT_TYPE_MAX
63};
64
65enum {
66	PRESTERA_PORT_TCVR_COPPER,
67	PRESTERA_PORT_TCVR_SFP,
68
69	PRESTERA_PORT_TCVR_MAX
70};
71
72enum {
73	PRESTERA_PORT_FEC_OFF,
74	PRESTERA_PORT_FEC_BASER,
75	PRESTERA_PORT_FEC_RS,
76
77	PRESTERA_PORT_FEC_MAX
78};
79
80enum {
81	PRESTERA_PORT_DUPLEX_HALF,
82	PRESTERA_PORT_DUPLEX_FULL,
83};
84
85enum {
86	PRESTERA_STP_DISABLED,
87	PRESTERA_STP_BLOCK_LISTEN,
88	PRESTERA_STP_LEARN,
89	PRESTERA_STP_FORWARD,
90};
91
92struct prestera_switch;
93struct prestera_port;
94struct prestera_port_stats;
95struct prestera_port_caps;
96enum prestera_event_type;
97struct prestera_event;
98
99typedef void (*prestera_event_cb_t)
100	(struct prestera_switch *sw, struct prestera_event *evt, void *arg);
101
102struct prestera_rxtx_params;
103
104/* Switch API */
105int prestera_hw_switch_init(struct prestera_switch *sw);
106void prestera_hw_switch_fini(struct prestera_switch *sw);
107int prestera_hw_switch_ageing_set(struct prestera_switch *sw, u32 ageing_ms);
108int prestera_hw_switch_mac_set(struct prestera_switch *sw, const char *mac);
109
110/* Port API */
111int prestera_hw_port_info_get(const struct prestera_port *port,
112			      u32 *dev_id, u32 *hw_id, u16 *fp_id);
113int prestera_hw_port_state_set(const struct prestera_port *port,
114			       bool admin_state);
115int prestera_hw_port_mtu_set(const struct prestera_port *port, u32 mtu);
116int prestera_hw_port_mtu_get(const struct prestera_port *port, u32 *mtu);
117int prestera_hw_port_mac_set(const struct prestera_port *port, const char *mac);
118int prestera_hw_port_mac_get(const struct prestera_port *port, char *mac);
119int prestera_hw_port_cap_get(const struct prestera_port *port,
120			     struct prestera_port_caps *caps);
121int prestera_hw_port_remote_cap_get(const struct prestera_port *port,
122				    u64 *link_mode_bitmap);
123int prestera_hw_port_remote_fc_get(const struct prestera_port *port,
124				   bool *pause, bool *asym_pause);
125int prestera_hw_port_type_get(const struct prestera_port *port, u8 *type);
126int prestera_hw_port_fec_get(const struct prestera_port *port, u8 *fec);
127int prestera_hw_port_fec_set(const struct prestera_port *port, u8 fec);
128int prestera_hw_port_autoneg_set(const struct prestera_port *port,
129				 bool autoneg, u64 link_modes, u8 fec);
130int prestera_hw_port_autoneg_restart(struct prestera_port *port);
131int prestera_hw_port_duplex_get(const struct prestera_port *port, u8 *duplex);
132int prestera_hw_port_stats_get(const struct prestera_port *port,
133			       struct prestera_port_stats *stats);
134int prestera_hw_port_link_mode_set(const struct prestera_port *port, u32 mode);
135int prestera_hw_port_link_mode_get(const struct prestera_port *port, u32 *mode);
136int prestera_hw_port_mdix_get(const struct prestera_port *port, u8 *status,
137			      u8 *admin_mode);
138int prestera_hw_port_mdix_set(const struct prestera_port *port, u8 mode);
139int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed);
140int prestera_hw_port_learning_set(struct prestera_port *port, bool enable);
141int prestera_hw_port_flood_set(struct prestera_port *port, bool flood);
142int prestera_hw_port_accept_frm_type(struct prestera_port *port,
143				     enum prestera_accept_frm_type type);
144/* Vlan API */
145int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid);
146int prestera_hw_vlan_delete(struct prestera_switch *sw, u16 vid);
147int prestera_hw_vlan_port_set(struct prestera_port *port, u16 vid,
148			      bool is_member, bool untagged);
149int prestera_hw_vlan_port_vid_set(struct prestera_port *port, u16 vid);
150int prestera_hw_vlan_port_stp_set(struct prestera_port *port, u16 vid, u8 state);
151
152/* FDB API */
153int prestera_hw_fdb_add(struct prestera_port *port, const unsigned char *mac,
154			u16 vid, bool dynamic);
155int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac,
156			u16 vid);
157int prestera_hw_fdb_flush_port(struct prestera_port *port, u32 mode);
158int prestera_hw_fdb_flush_vlan(struct prestera_switch *sw, u16 vid, u32 mode);
159int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
160				    u32 mode);
161
162/* Bridge API */
163int prestera_hw_bridge_create(struct prestera_switch *sw, u16 *bridge_id);
164int prestera_hw_bridge_delete(struct prestera_switch *sw, u16 bridge_id);
165int prestera_hw_bridge_port_add(struct prestera_port *port, u16 bridge_id);
166int prestera_hw_bridge_port_delete(struct prestera_port *port, u16 bridge_id);
167
168/* Event handlers */
169int prestera_hw_event_handler_register(struct prestera_switch *sw,
170				       enum prestera_event_type type,
171				       prestera_event_cb_t fn,
172				       void *arg);
173void prestera_hw_event_handler_unregister(struct prestera_switch *sw,
174					  enum prestera_event_type type,
175					  prestera_event_cb_t fn);
176
177/* RX/TX */
178int prestera_hw_rxtx_init(struct prestera_switch *sw,
179			  struct prestera_rxtx_params *params);
180int prestera_hw_rxtx_port_init(struct prestera_port *port);
181
182#endif /* _PRESTERA_HW_H_ */
183