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 #include "prestera_acl.h" 9 10 enum prestera_accept_frm_type { 11 PRESTERA_ACCEPT_FRAME_TYPE_TAGGED, 12 PRESTERA_ACCEPT_FRAME_TYPE_UNTAGGED, 13 PRESTERA_ACCEPT_FRAME_TYPE_ALL, 14 }; 15 16 enum prestera_fdb_flush_mode { 17 PRESTERA_FDB_FLUSH_MODE_DYNAMIC = BIT(0), 18 PRESTERA_FDB_FLUSH_MODE_STATIC = BIT(1), 19 PRESTERA_FDB_FLUSH_MODE_ALL = PRESTERA_FDB_FLUSH_MODE_DYNAMIC 20 | PRESTERA_FDB_FLUSH_MODE_STATIC, 21 }; 22 23 enum { 24 PRESTERA_MAC_MODE_INTERNAL, 25 PRESTERA_MAC_MODE_SGMII, 26 PRESTERA_MAC_MODE_1000BASE_X, 27 PRESTERA_MAC_MODE_KR, 28 PRESTERA_MAC_MODE_KR2, 29 PRESTERA_MAC_MODE_KR4, 30 PRESTERA_MAC_MODE_CR, 31 PRESTERA_MAC_MODE_CR2, 32 PRESTERA_MAC_MODE_CR4, 33 PRESTERA_MAC_MODE_SR_LR, 34 PRESTERA_MAC_MODE_SR_LR2, 35 PRESTERA_MAC_MODE_SR_LR4, 36 37 PRESTERA_MAC_MODE_MAX 38 }; 39 40 enum { 41 PRESTERA_LINK_MODE_10baseT_Half, 42 PRESTERA_LINK_MODE_10baseT_Full, 43 PRESTERA_LINK_MODE_100baseT_Half, 44 PRESTERA_LINK_MODE_100baseT_Full, 45 PRESTERA_LINK_MODE_1000baseT_Half, 46 PRESTERA_LINK_MODE_1000baseT_Full, 47 PRESTERA_LINK_MODE_1000baseX_Full, 48 PRESTERA_LINK_MODE_1000baseKX_Full, 49 PRESTERA_LINK_MODE_2500baseX_Full, 50 PRESTERA_LINK_MODE_10GbaseKR_Full, 51 PRESTERA_LINK_MODE_10GbaseSR_Full, 52 PRESTERA_LINK_MODE_10GbaseLR_Full, 53 PRESTERA_LINK_MODE_20GbaseKR2_Full, 54 PRESTERA_LINK_MODE_25GbaseCR_Full, 55 PRESTERA_LINK_MODE_25GbaseKR_Full, 56 PRESTERA_LINK_MODE_25GbaseSR_Full, 57 PRESTERA_LINK_MODE_40GbaseKR4_Full, 58 PRESTERA_LINK_MODE_40GbaseCR4_Full, 59 PRESTERA_LINK_MODE_40GbaseSR4_Full, 60 PRESTERA_LINK_MODE_50GbaseCR2_Full, 61 PRESTERA_LINK_MODE_50GbaseKR2_Full, 62 PRESTERA_LINK_MODE_50GbaseSR2_Full, 63 PRESTERA_LINK_MODE_100GbaseKR4_Full, 64 PRESTERA_LINK_MODE_100GbaseSR4_Full, 65 PRESTERA_LINK_MODE_100GbaseCR4_Full, 66 67 PRESTERA_LINK_MODE_MAX 68 }; 69 70 enum { 71 PRESTERA_PORT_TYPE_NONE, 72 PRESTERA_PORT_TYPE_TP, 73 PRESTERA_PORT_TYPE_AUI, 74 PRESTERA_PORT_TYPE_MII, 75 PRESTERA_PORT_TYPE_FIBRE, 76 PRESTERA_PORT_TYPE_BNC, 77 PRESTERA_PORT_TYPE_DA, 78 PRESTERA_PORT_TYPE_OTHER, 79 80 PRESTERA_PORT_TYPE_MAX 81 }; 82 83 enum { 84 PRESTERA_PORT_TCVR_COPPER, 85 PRESTERA_PORT_TCVR_SFP, 86 87 PRESTERA_PORT_TCVR_MAX 88 }; 89 90 enum { 91 PRESTERA_PORT_FEC_OFF, 92 PRESTERA_PORT_FEC_BASER, 93 PRESTERA_PORT_FEC_RS, 94 95 PRESTERA_PORT_FEC_MAX 96 }; 97 98 enum { 99 PRESTERA_PORT_DUPLEX_HALF, 100 PRESTERA_PORT_DUPLEX_FULL, 101 }; 102 103 enum { 104 PRESTERA_STP_DISABLED, 105 PRESTERA_STP_BLOCK_LISTEN, 106 PRESTERA_STP_LEARN, 107 PRESTERA_STP_FORWARD, 108 }; 109 110 enum { 111 PRESTERA_POLICER_TYPE_INGRESS, 112 PRESTERA_POLICER_TYPE_EGRESS 113 }; 114 115 enum prestera_hw_cpu_code_cnt_t { 116 PRESTERA_HW_CPU_CODE_CNT_TYPE_DROP = 0, 117 PRESTERA_HW_CPU_CODE_CNT_TYPE_TRAP = 1, 118 }; 119 120 enum prestera_hw_vtcam_direction_t { 121 PRESTERA_HW_VTCAM_DIR_INGRESS = 0, 122 PRESTERA_HW_VTCAM_DIR_EGRESS = 1, 123 }; 124 125 enum { 126 PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_0 = 0, 127 PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_1 = 1, 128 PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_2 = 2, 129 PRESTERA_HW_COUNTER_CLIENT_EGRESS_LOOKUP = 3, 130 }; 131 132 struct prestera_switch; 133 struct prestera_port; 134 struct prestera_port_stats; 135 struct prestera_port_caps; 136 enum prestera_event_type; 137 struct prestera_event; 138 139 typedef void (*prestera_event_cb_t) 140 (struct prestera_switch *sw, struct prestera_event *evt, void *arg); 141 142 struct prestera_rxtx_params; 143 struct prestera_acl_hw_action_info; 144 struct prestera_acl_iface; 145 struct prestera_counter_stats; 146 struct prestera_iface; 147 struct prestera_flood_domain; 148 struct prestera_mdb_entry; 149 struct prestera_neigh_info; 150 151 /* Switch API */ 152 int prestera_hw_switch_init(struct prestera_switch *sw); 153 void prestera_hw_switch_fini(struct prestera_switch *sw); 154 int prestera_hw_switch_ageing_set(struct prestera_switch *sw, u32 ageing_ms); 155 int prestera_hw_switch_mac_set(struct prestera_switch *sw, const char *mac); 156 157 /* Port API */ 158 int prestera_hw_port_info_get(const struct prestera_port *port, 159 u32 *dev_id, u32 *hw_id, u16 *fp_id); 160 161 int prestera_hw_port_mac_mode_get(const struct prestera_port *port, 162 u32 *mode, u32 *speed, u8 *duplex, u8 *fec); 163 int prestera_hw_port_mac_mode_set(const struct prestera_port *port, 164 bool admin, u32 mode, u8 inband, 165 u32 speed, u8 duplex, u8 fec); 166 int prestera_hw_port_phy_mode_get(const struct prestera_port *port, 167 u8 *mdix, u64 *lmode_bmap, 168 bool *fc_pause, bool *fc_asym); 169 int prestera_hw_port_phy_mode_set(const struct prestera_port *port, 170 bool admin, bool adv, u32 mode, u64 modes, 171 u8 mdix); 172 173 int prestera_hw_port_mtu_set(const struct prestera_port *port, u32 mtu); 174 int prestera_hw_port_mtu_get(const struct prestera_port *port, u32 *mtu); 175 int prestera_hw_port_mac_set(const struct prestera_port *port, const char *mac); 176 int prestera_hw_port_mac_get(const struct prestera_port *port, char *mac); 177 int prestera_hw_port_cap_get(const struct prestera_port *port, 178 struct prestera_port_caps *caps); 179 int prestera_hw_port_type_get(const struct prestera_port *port, u8 *type); 180 int prestera_hw_port_autoneg_restart(struct prestera_port *port); 181 int prestera_hw_port_stats_get(const struct prestera_port *port, 182 struct prestera_port_stats *stats); 183 int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed); 184 int prestera_hw_port_learning_set(struct prestera_port *port, bool enable); 185 int prestera_hw_port_uc_flood_set(const struct prestera_port *port, bool flood); 186 int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood); 187 int prestera_hw_port_br_locked_set(const struct prestera_port *port, 188 bool br_locked); 189 int prestera_hw_port_accept_frm_type(struct prestera_port *port, 190 enum prestera_accept_frm_type type); 191 /* Vlan API */ 192 int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid); 193 int prestera_hw_vlan_delete(struct prestera_switch *sw, u16 vid); 194 int prestera_hw_vlan_port_set(struct prestera_port *port, u16 vid, 195 bool is_member, bool untagged); 196 int prestera_hw_vlan_port_vid_set(struct prestera_port *port, u16 vid); 197 int prestera_hw_vlan_port_stp_set(struct prestera_port *port, u16 vid, u8 state); 198 199 /* FDB API */ 200 int prestera_hw_fdb_add(struct prestera_port *port, const unsigned char *mac, 201 u16 vid, bool dynamic); 202 int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac, 203 u16 vid); 204 int prestera_hw_fdb_flush_port(struct prestera_port *port, u32 mode); 205 int prestera_hw_fdb_flush_vlan(struct prestera_switch *sw, u16 vid, u32 mode); 206 int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid, 207 u32 mode); 208 209 /* Bridge API */ 210 int prestera_hw_bridge_create(struct prestera_switch *sw, u16 *bridge_id); 211 int prestera_hw_bridge_delete(struct prestera_switch *sw, u16 bridge_id); 212 int prestera_hw_bridge_port_add(struct prestera_port *port, u16 bridge_id); 213 int prestera_hw_bridge_port_delete(struct prestera_port *port, u16 bridge_id); 214 215 /* vTCAM API */ 216 int prestera_hw_vtcam_create(struct prestera_switch *sw, 217 u8 lookup, const u32 *keymask, u32 *vtcam_id, 218 enum prestera_hw_vtcam_direction_t direction); 219 int prestera_hw_vtcam_rule_add(struct prestera_switch *sw, u32 vtcam_id, 220 u32 prio, void *key, void *keymask, 221 struct prestera_acl_hw_action_info *act, 222 u8 n_act, u32 *rule_id); 223 int prestera_hw_vtcam_rule_del(struct prestera_switch *sw, 224 u32 vtcam_id, u32 rule_id); 225 int prestera_hw_vtcam_destroy(struct prestera_switch *sw, u32 vtcam_id); 226 int prestera_hw_vtcam_iface_bind(struct prestera_switch *sw, 227 struct prestera_acl_iface *iface, 228 u32 vtcam_id, u16 pcl_id); 229 int prestera_hw_vtcam_iface_unbind(struct prestera_switch *sw, 230 struct prestera_acl_iface *iface, 231 u32 vtcam_id); 232 233 /* Counter API */ 234 int prestera_hw_counter_trigger(struct prestera_switch *sw, u32 block_id); 235 int prestera_hw_counter_abort(struct prestera_switch *sw); 236 int prestera_hw_counters_get(struct prestera_switch *sw, u32 idx, 237 u32 *len, bool *done, 238 struct prestera_counter_stats *stats); 239 int prestera_hw_counter_block_get(struct prestera_switch *sw, 240 u32 client, u32 *block_id, u32 *offset, 241 u32 *num_counters); 242 int prestera_hw_counter_block_release(struct prestera_switch *sw, 243 u32 block_id); 244 int prestera_hw_counter_clear(struct prestera_switch *sw, u32 block_id, 245 u32 counter_id); 246 247 /* SPAN API */ 248 int prestera_hw_span_get(const struct prestera_port *port, u8 *span_id); 249 int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id, 250 bool ingress); 251 int prestera_hw_span_unbind(const struct prestera_port *port, bool ingress); 252 int prestera_hw_span_release(struct prestera_switch *sw, u8 span_id); 253 254 /* Router API */ 255 int prestera_hw_rif_create(struct prestera_switch *sw, 256 struct prestera_iface *iif, u8 *mac, u16 *rif_id); 257 int prestera_hw_rif_delete(struct prestera_switch *sw, u16 rif_id, 258 struct prestera_iface *iif); 259 260 /* Virtual Router API */ 261 int prestera_hw_vr_create(struct prestera_switch *sw, u16 *vr_id); 262 int prestera_hw_vr_delete(struct prestera_switch *sw, u16 vr_id); 263 264 /* LPM PI */ 265 int prestera_hw_lpm_add(struct prestera_switch *sw, u16 vr_id, 266 __be32 dst, u32 dst_len, u32 grp_id); 267 int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id, 268 __be32 dst, u32 dst_len); 269 270 /* NH API */ 271 int prestera_hw_nh_entries_set(struct prestera_switch *sw, int count, 272 struct prestera_neigh_info *nhs, u32 grp_id); 273 int prestera_hw_nhgrp_blk_get(struct prestera_switch *sw, 274 u8 *hw_state, u32 buf_size /* Buffer in bytes */); 275 int prestera_hw_nh_group_create(struct prestera_switch *sw, u16 nh_count, 276 u32 *grp_id); 277 int prestera_hw_nh_group_delete(struct prestera_switch *sw, u16 nh_count, 278 u32 grp_id); 279 280 /* Event handlers */ 281 int prestera_hw_event_handler_register(struct prestera_switch *sw, 282 enum prestera_event_type type, 283 prestera_event_cb_t fn, 284 void *arg); 285 void prestera_hw_event_handler_unregister(struct prestera_switch *sw, 286 enum prestera_event_type type, 287 prestera_event_cb_t fn); 288 289 /* RX/TX */ 290 int prestera_hw_rxtx_init(struct prestera_switch *sw, 291 struct prestera_rxtx_params *params); 292 293 /* LAG API */ 294 int prestera_hw_lag_member_add(struct prestera_port *port, u16 lag_id); 295 int prestera_hw_lag_member_del(struct prestera_port *port, u16 lag_id); 296 int prestera_hw_lag_member_enable(struct prestera_port *port, u16 lag_id, 297 bool enable); 298 int prestera_hw_lag_fdb_add(struct prestera_switch *sw, u16 lag_id, 299 const unsigned char *mac, u16 vid, bool dynamic); 300 int prestera_hw_lag_fdb_del(struct prestera_switch *sw, u16 lag_id, 301 const unsigned char *mac, u16 vid); 302 int prestera_hw_fdb_flush_lag(struct prestera_switch *sw, u16 lag_id, 303 u32 mode); 304 int prestera_hw_fdb_flush_lag_vlan(struct prestera_switch *sw, 305 u16 lag_id, u16 vid, u32 mode); 306 307 /* HW trap/drop counters API */ 308 int 309 prestera_hw_cpu_code_counters_get(struct prestera_switch *sw, u8 code, 310 enum prestera_hw_cpu_code_cnt_t counter_type, 311 u64 *packet_count); 312 313 /* Policer API */ 314 int prestera_hw_policer_create(struct prestera_switch *sw, u8 type, 315 u32 *policer_id); 316 int prestera_hw_policer_release(struct prestera_switch *sw, 317 u32 policer_id); 318 int prestera_hw_policer_sr_tcm_set(struct prestera_switch *sw, 319 u32 policer_id, u64 cir, u32 cbs); 320 321 /* Flood domain / MDB API */ 322 int prestera_hw_flood_domain_create(struct prestera_flood_domain *domain); 323 int prestera_hw_flood_domain_destroy(struct prestera_flood_domain *domain); 324 int prestera_hw_flood_domain_ports_set(struct prestera_flood_domain *domain); 325 int prestera_hw_flood_domain_ports_reset(struct prestera_flood_domain *domain); 326 327 int prestera_hw_mdb_create(struct prestera_mdb_entry *mdb); 328 int prestera_hw_mdb_destroy(struct prestera_mdb_entry *mdb); 329 330 #endif /* _PRESTERA_HW_H_ */ 331