Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
0002 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
0003 
0004 #ifndef _PRESTERA_HW_H_
0005 #define _PRESTERA_HW_H_
0006 
0007 #include <linux/types.h>
0008 #include "prestera_acl.h"
0009 
0010 enum prestera_accept_frm_type {
0011     PRESTERA_ACCEPT_FRAME_TYPE_TAGGED,
0012     PRESTERA_ACCEPT_FRAME_TYPE_UNTAGGED,
0013     PRESTERA_ACCEPT_FRAME_TYPE_ALL,
0014 };
0015 
0016 enum prestera_fdb_flush_mode {
0017     PRESTERA_FDB_FLUSH_MODE_DYNAMIC = BIT(0),
0018     PRESTERA_FDB_FLUSH_MODE_STATIC = BIT(1),
0019     PRESTERA_FDB_FLUSH_MODE_ALL = PRESTERA_FDB_FLUSH_MODE_DYNAMIC
0020                     | PRESTERA_FDB_FLUSH_MODE_STATIC,
0021 };
0022 
0023 enum {
0024     PRESTERA_MAC_MODE_INTERNAL,
0025     PRESTERA_MAC_MODE_SGMII,
0026     PRESTERA_MAC_MODE_1000BASE_X,
0027     PRESTERA_MAC_MODE_KR,
0028     PRESTERA_MAC_MODE_KR2,
0029     PRESTERA_MAC_MODE_KR4,
0030     PRESTERA_MAC_MODE_CR,
0031     PRESTERA_MAC_MODE_CR2,
0032     PRESTERA_MAC_MODE_CR4,
0033     PRESTERA_MAC_MODE_SR_LR,
0034     PRESTERA_MAC_MODE_SR_LR2,
0035     PRESTERA_MAC_MODE_SR_LR4,
0036 
0037     PRESTERA_MAC_MODE_MAX
0038 };
0039 
0040 enum {
0041     PRESTERA_LINK_MODE_10baseT_Half,
0042     PRESTERA_LINK_MODE_10baseT_Full,
0043     PRESTERA_LINK_MODE_100baseT_Half,
0044     PRESTERA_LINK_MODE_100baseT_Full,
0045     PRESTERA_LINK_MODE_1000baseT_Half,
0046     PRESTERA_LINK_MODE_1000baseT_Full,
0047     PRESTERA_LINK_MODE_1000baseX_Full,
0048     PRESTERA_LINK_MODE_1000baseKX_Full,
0049     PRESTERA_LINK_MODE_2500baseX_Full,
0050     PRESTERA_LINK_MODE_10GbaseKR_Full,
0051     PRESTERA_LINK_MODE_10GbaseSR_Full,
0052     PRESTERA_LINK_MODE_10GbaseLR_Full,
0053     PRESTERA_LINK_MODE_20GbaseKR2_Full,
0054     PRESTERA_LINK_MODE_25GbaseCR_Full,
0055     PRESTERA_LINK_MODE_25GbaseKR_Full,
0056     PRESTERA_LINK_MODE_25GbaseSR_Full,
0057     PRESTERA_LINK_MODE_40GbaseKR4_Full,
0058     PRESTERA_LINK_MODE_40GbaseCR4_Full,
0059     PRESTERA_LINK_MODE_40GbaseSR4_Full,
0060     PRESTERA_LINK_MODE_50GbaseCR2_Full,
0061     PRESTERA_LINK_MODE_50GbaseKR2_Full,
0062     PRESTERA_LINK_MODE_50GbaseSR2_Full,
0063     PRESTERA_LINK_MODE_100GbaseKR4_Full,
0064     PRESTERA_LINK_MODE_100GbaseSR4_Full,
0065     PRESTERA_LINK_MODE_100GbaseCR4_Full,
0066 
0067     PRESTERA_LINK_MODE_MAX
0068 };
0069 
0070 enum {
0071     PRESTERA_PORT_TYPE_NONE,
0072     PRESTERA_PORT_TYPE_TP,
0073     PRESTERA_PORT_TYPE_AUI,
0074     PRESTERA_PORT_TYPE_MII,
0075     PRESTERA_PORT_TYPE_FIBRE,
0076     PRESTERA_PORT_TYPE_BNC,
0077     PRESTERA_PORT_TYPE_DA,
0078     PRESTERA_PORT_TYPE_OTHER,
0079 
0080     PRESTERA_PORT_TYPE_MAX
0081 };
0082 
0083 enum {
0084     PRESTERA_PORT_TCVR_COPPER,
0085     PRESTERA_PORT_TCVR_SFP,
0086 
0087     PRESTERA_PORT_TCVR_MAX
0088 };
0089 
0090 enum {
0091     PRESTERA_PORT_FEC_OFF,
0092     PRESTERA_PORT_FEC_BASER,
0093     PRESTERA_PORT_FEC_RS,
0094 
0095     PRESTERA_PORT_FEC_MAX
0096 };
0097 
0098 enum {
0099     PRESTERA_PORT_DUPLEX_HALF,
0100     PRESTERA_PORT_DUPLEX_FULL,
0101 };
0102 
0103 enum {
0104     PRESTERA_STP_DISABLED,
0105     PRESTERA_STP_BLOCK_LISTEN,
0106     PRESTERA_STP_LEARN,
0107     PRESTERA_STP_FORWARD,
0108 };
0109 
0110 enum {
0111     PRESTERA_POLICER_TYPE_INGRESS,
0112     PRESTERA_POLICER_TYPE_EGRESS
0113 };
0114 
0115 enum prestera_hw_cpu_code_cnt_t {
0116     PRESTERA_HW_CPU_CODE_CNT_TYPE_DROP = 0,
0117     PRESTERA_HW_CPU_CODE_CNT_TYPE_TRAP = 1,
0118 };
0119 
0120 enum prestera_hw_vtcam_direction_t {
0121     PRESTERA_HW_VTCAM_DIR_INGRESS = 0,
0122     PRESTERA_HW_VTCAM_DIR_EGRESS = 1,
0123 };
0124 
0125 enum {
0126     PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_0 = 0,
0127     PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_1 = 1,
0128     PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_2 = 2,
0129     PRESTERA_HW_COUNTER_CLIENT_EGRESS_LOOKUP = 3,
0130 };
0131 
0132 struct prestera_switch;
0133 struct prestera_port;
0134 struct prestera_port_stats;
0135 struct prestera_port_caps;
0136 enum prestera_event_type;
0137 struct prestera_event;
0138 
0139 typedef void (*prestera_event_cb_t)
0140     (struct prestera_switch *sw, struct prestera_event *evt, void *arg);
0141 
0142 struct prestera_rxtx_params;
0143 struct prestera_acl_hw_action_info;
0144 struct prestera_acl_iface;
0145 struct prestera_counter_stats;
0146 struct prestera_iface;
0147 struct prestera_flood_domain;
0148 struct prestera_mdb_entry;
0149 
0150 /* Switch API */
0151 int prestera_hw_switch_init(struct prestera_switch *sw);
0152 void prestera_hw_switch_fini(struct prestera_switch *sw);
0153 int prestera_hw_switch_ageing_set(struct prestera_switch *sw, u32 ageing_ms);
0154 int prestera_hw_switch_mac_set(struct prestera_switch *sw, const char *mac);
0155 
0156 /* Port API */
0157 int prestera_hw_port_info_get(const struct prestera_port *port,
0158                   u32 *dev_id, u32 *hw_id, u16 *fp_id);
0159 
0160 int prestera_hw_port_mac_mode_get(const struct prestera_port *port,
0161                   u32 *mode, u32 *speed, u8 *duplex, u8 *fec);
0162 int prestera_hw_port_mac_mode_set(const struct prestera_port *port,
0163                   bool admin, u32 mode, u8 inband,
0164                   u32 speed, u8 duplex, u8 fec);
0165 int prestera_hw_port_phy_mode_get(const struct prestera_port *port,
0166                   u8 *mdix, u64 *lmode_bmap,
0167                   bool *fc_pause, bool *fc_asym);
0168 int prestera_hw_port_phy_mode_set(const struct prestera_port *port,
0169                   bool admin, bool adv, u32 mode, u64 modes,
0170                   u8 mdix);
0171 
0172 int prestera_hw_port_mtu_set(const struct prestera_port *port, u32 mtu);
0173 int prestera_hw_port_mtu_get(const struct prestera_port *port, u32 *mtu);
0174 int prestera_hw_port_mac_set(const struct prestera_port *port, const char *mac);
0175 int prestera_hw_port_mac_get(const struct prestera_port *port, char *mac);
0176 int prestera_hw_port_cap_get(const struct prestera_port *port,
0177                  struct prestera_port_caps *caps);
0178 int prestera_hw_port_type_get(const struct prestera_port *port, u8 *type);
0179 int prestera_hw_port_autoneg_restart(struct prestera_port *port);
0180 int prestera_hw_port_stats_get(const struct prestera_port *port,
0181                    struct prestera_port_stats *stats);
0182 int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed);
0183 int prestera_hw_port_learning_set(struct prestera_port *port, bool enable);
0184 int prestera_hw_port_uc_flood_set(const struct prestera_port *port, bool flood);
0185 int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood);
0186 int prestera_hw_port_accept_frm_type(struct prestera_port *port,
0187                      enum prestera_accept_frm_type type);
0188 /* Vlan API */
0189 int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid);
0190 int prestera_hw_vlan_delete(struct prestera_switch *sw, u16 vid);
0191 int prestera_hw_vlan_port_set(struct prestera_port *port, u16 vid,
0192                   bool is_member, bool untagged);
0193 int prestera_hw_vlan_port_vid_set(struct prestera_port *port, u16 vid);
0194 int prestera_hw_vlan_port_stp_set(struct prestera_port *port, u16 vid, u8 state);
0195 
0196 /* FDB API */
0197 int prestera_hw_fdb_add(struct prestera_port *port, const unsigned char *mac,
0198             u16 vid, bool dynamic);
0199 int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac,
0200             u16 vid);
0201 int prestera_hw_fdb_flush_port(struct prestera_port *port, u32 mode);
0202 int prestera_hw_fdb_flush_vlan(struct prestera_switch *sw, u16 vid, u32 mode);
0203 int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
0204                     u32 mode);
0205 
0206 /* Bridge API */
0207 int prestera_hw_bridge_create(struct prestera_switch *sw, u16 *bridge_id);
0208 int prestera_hw_bridge_delete(struct prestera_switch *sw, u16 bridge_id);
0209 int prestera_hw_bridge_port_add(struct prestera_port *port, u16 bridge_id);
0210 int prestera_hw_bridge_port_delete(struct prestera_port *port, u16 bridge_id);
0211 
0212 /* vTCAM API */
0213 int prestera_hw_vtcam_create(struct prestera_switch *sw,
0214                  u8 lookup, const u32 *keymask, u32 *vtcam_id,
0215                  enum prestera_hw_vtcam_direction_t direction);
0216 int prestera_hw_vtcam_rule_add(struct prestera_switch *sw, u32 vtcam_id,
0217                    u32 prio, void *key, void *keymask,
0218                    struct prestera_acl_hw_action_info *act,
0219                    u8 n_act, u32 *rule_id);
0220 int prestera_hw_vtcam_rule_del(struct prestera_switch *sw,
0221                    u32 vtcam_id, u32 rule_id);
0222 int prestera_hw_vtcam_destroy(struct prestera_switch *sw, u32 vtcam_id);
0223 int prestera_hw_vtcam_iface_bind(struct prestera_switch *sw,
0224                  struct prestera_acl_iface *iface,
0225                  u32 vtcam_id, u16 pcl_id);
0226 int prestera_hw_vtcam_iface_unbind(struct prestera_switch *sw,
0227                    struct prestera_acl_iface *iface,
0228                    u32 vtcam_id);
0229 
0230 /* Counter API */
0231 int prestera_hw_counter_trigger(struct prestera_switch *sw, u32 block_id);
0232 int prestera_hw_counter_abort(struct prestera_switch *sw);
0233 int prestera_hw_counters_get(struct prestera_switch *sw, u32 idx,
0234                  u32 *len, bool *done,
0235                  struct prestera_counter_stats *stats);
0236 int prestera_hw_counter_block_get(struct prestera_switch *sw,
0237                   u32 client, u32 *block_id, u32 *offset,
0238                   u32 *num_counters);
0239 int prestera_hw_counter_block_release(struct prestera_switch *sw,
0240                       u32 block_id);
0241 int prestera_hw_counter_clear(struct prestera_switch *sw, u32 block_id,
0242                   u32 counter_id);
0243 
0244 /* SPAN API */
0245 int prestera_hw_span_get(const struct prestera_port *port, u8 *span_id);
0246 int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id);
0247 int prestera_hw_span_unbind(const struct prestera_port *port);
0248 int prestera_hw_span_release(struct prestera_switch *sw, u8 span_id);
0249 
0250 /* Router API */
0251 int prestera_hw_rif_create(struct prestera_switch *sw,
0252                struct prestera_iface *iif, u8 *mac, u16 *rif_id);
0253 int prestera_hw_rif_delete(struct prestera_switch *sw, u16 rif_id,
0254                struct prestera_iface *iif);
0255 
0256 /* Virtual Router API */
0257 int prestera_hw_vr_create(struct prestera_switch *sw, u16 *vr_id);
0258 int prestera_hw_vr_delete(struct prestera_switch *sw, u16 vr_id);
0259 
0260 /* LPM PI */
0261 int prestera_hw_lpm_add(struct prestera_switch *sw, u16 vr_id,
0262             __be32 dst, u32 dst_len, u32 grp_id);
0263 int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id,
0264             __be32 dst, u32 dst_len);
0265 
0266 /* Event handlers */
0267 int prestera_hw_event_handler_register(struct prestera_switch *sw,
0268                        enum prestera_event_type type,
0269                        prestera_event_cb_t fn,
0270                        void *arg);
0271 void prestera_hw_event_handler_unregister(struct prestera_switch *sw,
0272                       enum prestera_event_type type,
0273                       prestera_event_cb_t fn);
0274 
0275 /* RX/TX */
0276 int prestera_hw_rxtx_init(struct prestera_switch *sw,
0277               struct prestera_rxtx_params *params);
0278 
0279 /* LAG API */
0280 int prestera_hw_lag_member_add(struct prestera_port *port, u16 lag_id);
0281 int prestera_hw_lag_member_del(struct prestera_port *port, u16 lag_id);
0282 int prestera_hw_lag_member_enable(struct prestera_port *port, u16 lag_id,
0283                   bool enable);
0284 int prestera_hw_lag_fdb_add(struct prestera_switch *sw, u16 lag_id,
0285                 const unsigned char *mac, u16 vid, bool dynamic);
0286 int prestera_hw_lag_fdb_del(struct prestera_switch *sw, u16 lag_id,
0287                 const unsigned char *mac, u16 vid);
0288 int prestera_hw_fdb_flush_lag(struct prestera_switch *sw, u16 lag_id,
0289                   u32 mode);
0290 int prestera_hw_fdb_flush_lag_vlan(struct prestera_switch *sw,
0291                    u16 lag_id, u16 vid, u32 mode);
0292 
0293 /* HW trap/drop counters API */
0294 int
0295 prestera_hw_cpu_code_counters_get(struct prestera_switch *sw, u8 code,
0296                   enum prestera_hw_cpu_code_cnt_t counter_type,
0297                   u64 *packet_count);
0298 
0299 /* Policer API */
0300 int prestera_hw_policer_create(struct prestera_switch *sw, u8 type,
0301                    u32 *policer_id);
0302 int prestera_hw_policer_release(struct prestera_switch *sw,
0303                 u32 policer_id);
0304 int prestera_hw_policer_sr_tcm_set(struct prestera_switch *sw,
0305                    u32 policer_id, u64 cir, u32 cbs);
0306 
0307 /* Flood domain / MDB API */
0308 int prestera_hw_flood_domain_create(struct prestera_flood_domain *domain);
0309 int prestera_hw_flood_domain_destroy(struct prestera_flood_domain *domain);
0310 int prestera_hw_flood_domain_ports_set(struct prestera_flood_domain *domain);
0311 int prestera_hw_flood_domain_ports_reset(struct prestera_flood_domain *domain);
0312 
0313 int prestera_hw_mdb_create(struct prestera_mdb_entry *mdb);
0314 int prestera_hw_mdb_destroy(struct prestera_mdb_entry *mdb);
0315 
0316 #endif /* _PRESTERA_HW_H_ */