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