331 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			331 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
 | 
						|
/* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
 | 
						|
 | 
						|
#ifndef _PRESTERA_HW_H_
 | 
						|
#define _PRESTERA_HW_H_
 | 
						|
 | 
						|
#include <linux/types.h>
 | 
						|
#include "prestera_acl.h"
 | 
						|
 | 
						|
enum prestera_accept_frm_type {
 | 
						|
	PRESTERA_ACCEPT_FRAME_TYPE_TAGGED,
 | 
						|
	PRESTERA_ACCEPT_FRAME_TYPE_UNTAGGED,
 | 
						|
	PRESTERA_ACCEPT_FRAME_TYPE_ALL,
 | 
						|
};
 | 
						|
 | 
						|
enum prestera_fdb_flush_mode {
 | 
						|
	PRESTERA_FDB_FLUSH_MODE_DYNAMIC = BIT(0),
 | 
						|
	PRESTERA_FDB_FLUSH_MODE_STATIC = BIT(1),
 | 
						|
	PRESTERA_FDB_FLUSH_MODE_ALL = PRESTERA_FDB_FLUSH_MODE_DYNAMIC
 | 
						|
					| PRESTERA_FDB_FLUSH_MODE_STATIC,
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_MAC_MODE_INTERNAL,
 | 
						|
	PRESTERA_MAC_MODE_SGMII,
 | 
						|
	PRESTERA_MAC_MODE_1000BASE_X,
 | 
						|
	PRESTERA_MAC_MODE_KR,
 | 
						|
	PRESTERA_MAC_MODE_KR2,
 | 
						|
	PRESTERA_MAC_MODE_KR4,
 | 
						|
	PRESTERA_MAC_MODE_CR,
 | 
						|
	PRESTERA_MAC_MODE_CR2,
 | 
						|
	PRESTERA_MAC_MODE_CR4,
 | 
						|
	PRESTERA_MAC_MODE_SR_LR,
 | 
						|
	PRESTERA_MAC_MODE_SR_LR2,
 | 
						|
	PRESTERA_MAC_MODE_SR_LR4,
 | 
						|
 | 
						|
	PRESTERA_MAC_MODE_MAX
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_LINK_MODE_10baseT_Half,
 | 
						|
	PRESTERA_LINK_MODE_10baseT_Full,
 | 
						|
	PRESTERA_LINK_MODE_100baseT_Half,
 | 
						|
	PRESTERA_LINK_MODE_100baseT_Full,
 | 
						|
	PRESTERA_LINK_MODE_1000baseT_Half,
 | 
						|
	PRESTERA_LINK_MODE_1000baseT_Full,
 | 
						|
	PRESTERA_LINK_MODE_1000baseX_Full,
 | 
						|
	PRESTERA_LINK_MODE_1000baseKX_Full,
 | 
						|
	PRESTERA_LINK_MODE_2500baseX_Full,
 | 
						|
	PRESTERA_LINK_MODE_10GbaseKR_Full,
 | 
						|
	PRESTERA_LINK_MODE_10GbaseSR_Full,
 | 
						|
	PRESTERA_LINK_MODE_10GbaseLR_Full,
 | 
						|
	PRESTERA_LINK_MODE_20GbaseKR2_Full,
 | 
						|
	PRESTERA_LINK_MODE_25GbaseCR_Full,
 | 
						|
	PRESTERA_LINK_MODE_25GbaseKR_Full,
 | 
						|
	PRESTERA_LINK_MODE_25GbaseSR_Full,
 | 
						|
	PRESTERA_LINK_MODE_40GbaseKR4_Full,
 | 
						|
	PRESTERA_LINK_MODE_40GbaseCR4_Full,
 | 
						|
	PRESTERA_LINK_MODE_40GbaseSR4_Full,
 | 
						|
	PRESTERA_LINK_MODE_50GbaseCR2_Full,
 | 
						|
	PRESTERA_LINK_MODE_50GbaseKR2_Full,
 | 
						|
	PRESTERA_LINK_MODE_50GbaseSR2_Full,
 | 
						|
	PRESTERA_LINK_MODE_100GbaseKR4_Full,
 | 
						|
	PRESTERA_LINK_MODE_100GbaseSR4_Full,
 | 
						|
	PRESTERA_LINK_MODE_100GbaseCR4_Full,
 | 
						|
 | 
						|
	PRESTERA_LINK_MODE_MAX
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_PORT_TYPE_NONE,
 | 
						|
	PRESTERA_PORT_TYPE_TP,
 | 
						|
	PRESTERA_PORT_TYPE_AUI,
 | 
						|
	PRESTERA_PORT_TYPE_MII,
 | 
						|
	PRESTERA_PORT_TYPE_FIBRE,
 | 
						|
	PRESTERA_PORT_TYPE_BNC,
 | 
						|
	PRESTERA_PORT_TYPE_DA,
 | 
						|
	PRESTERA_PORT_TYPE_OTHER,
 | 
						|
 | 
						|
	PRESTERA_PORT_TYPE_MAX
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_PORT_TCVR_COPPER,
 | 
						|
	PRESTERA_PORT_TCVR_SFP,
 | 
						|
 | 
						|
	PRESTERA_PORT_TCVR_MAX
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_PORT_FEC_OFF,
 | 
						|
	PRESTERA_PORT_FEC_BASER,
 | 
						|
	PRESTERA_PORT_FEC_RS,
 | 
						|
 | 
						|
	PRESTERA_PORT_FEC_MAX
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_PORT_DUPLEX_HALF,
 | 
						|
	PRESTERA_PORT_DUPLEX_FULL,
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_STP_DISABLED,
 | 
						|
	PRESTERA_STP_BLOCK_LISTEN,
 | 
						|
	PRESTERA_STP_LEARN,
 | 
						|
	PRESTERA_STP_FORWARD,
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_POLICER_TYPE_INGRESS,
 | 
						|
	PRESTERA_POLICER_TYPE_EGRESS
 | 
						|
};
 | 
						|
 | 
						|
enum prestera_hw_cpu_code_cnt_t {
 | 
						|
	PRESTERA_HW_CPU_CODE_CNT_TYPE_DROP = 0,
 | 
						|
	PRESTERA_HW_CPU_CODE_CNT_TYPE_TRAP = 1,
 | 
						|
};
 | 
						|
 | 
						|
enum prestera_hw_vtcam_direction_t {
 | 
						|
	PRESTERA_HW_VTCAM_DIR_INGRESS = 0,
 | 
						|
	PRESTERA_HW_VTCAM_DIR_EGRESS = 1,
 | 
						|
};
 | 
						|
 | 
						|
enum {
 | 
						|
	PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_0 = 0,
 | 
						|
	PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_1 = 1,
 | 
						|
	PRESTERA_HW_COUNTER_CLIENT_INGRESS_LOOKUP_2 = 2,
 | 
						|
	PRESTERA_HW_COUNTER_CLIENT_EGRESS_LOOKUP = 3,
 | 
						|
};
 | 
						|
 | 
						|
struct prestera_switch;
 | 
						|
struct prestera_port;
 | 
						|
struct prestera_port_stats;
 | 
						|
struct prestera_port_caps;
 | 
						|
enum prestera_event_type;
 | 
						|
struct prestera_event;
 | 
						|
 | 
						|
typedef void (*prestera_event_cb_t)
 | 
						|
	(struct prestera_switch *sw, struct prestera_event *evt, void *arg);
 | 
						|
 | 
						|
struct prestera_rxtx_params;
 | 
						|
struct prestera_acl_hw_action_info;
 | 
						|
struct prestera_acl_iface;
 | 
						|
struct prestera_counter_stats;
 | 
						|
struct prestera_iface;
 | 
						|
struct prestera_flood_domain;
 | 
						|
struct prestera_mdb_entry;
 | 
						|
struct prestera_neigh_info;
 | 
						|
 | 
						|
/* Switch API */
 | 
						|
int prestera_hw_switch_init(struct prestera_switch *sw);
 | 
						|
void prestera_hw_switch_fini(struct prestera_switch *sw);
 | 
						|
int prestera_hw_switch_ageing_set(struct prestera_switch *sw, u32 ageing_ms);
 | 
						|
int prestera_hw_switch_mac_set(struct prestera_switch *sw, const char *mac);
 | 
						|
 | 
						|
/* Port API */
 | 
						|
int prestera_hw_port_info_get(const struct prestera_port *port,
 | 
						|
			      u32 *dev_id, u32 *hw_id, u16 *fp_id);
 | 
						|
 | 
						|
int prestera_hw_port_mac_mode_get(const struct prestera_port *port,
 | 
						|
				  u32 *mode, u32 *speed, u8 *duplex, u8 *fec);
 | 
						|
int prestera_hw_port_mac_mode_set(const struct prestera_port *port,
 | 
						|
				  bool admin, u32 mode, u8 inband,
 | 
						|
				  u32 speed, u8 duplex, u8 fec);
 | 
						|
int prestera_hw_port_phy_mode_get(const struct prestera_port *port,
 | 
						|
				  u8 *mdix, u64 *lmode_bmap,
 | 
						|
				  bool *fc_pause, bool *fc_asym);
 | 
						|
int prestera_hw_port_phy_mode_set(const struct prestera_port *port,
 | 
						|
				  bool admin, bool adv, u32 mode, u64 modes,
 | 
						|
				  u8 mdix);
 | 
						|
 | 
						|
int prestera_hw_port_mtu_set(const struct prestera_port *port, u32 mtu);
 | 
						|
int prestera_hw_port_mtu_get(const struct prestera_port *port, u32 *mtu);
 | 
						|
int prestera_hw_port_mac_set(const struct prestera_port *port, const char *mac);
 | 
						|
int prestera_hw_port_mac_get(const struct prestera_port *port, char *mac);
 | 
						|
int prestera_hw_port_cap_get(const struct prestera_port *port,
 | 
						|
			     struct prestera_port_caps *caps);
 | 
						|
int prestera_hw_port_type_get(const struct prestera_port *port, u8 *type);
 | 
						|
int prestera_hw_port_autoneg_restart(struct prestera_port *port);
 | 
						|
int prestera_hw_port_stats_get(const struct prestera_port *port,
 | 
						|
			       struct prestera_port_stats *stats);
 | 
						|
int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed);
 | 
						|
int prestera_hw_port_learning_set(struct prestera_port *port, bool enable);
 | 
						|
int prestera_hw_port_uc_flood_set(const struct prestera_port *port, bool flood);
 | 
						|
int prestera_hw_port_mc_flood_set(const struct prestera_port *port, bool flood);
 | 
						|
int prestera_hw_port_br_locked_set(const struct prestera_port *port,
 | 
						|
				   bool br_locked);
 | 
						|
int prestera_hw_port_accept_frm_type(struct prestera_port *port,
 | 
						|
				     enum prestera_accept_frm_type type);
 | 
						|
/* Vlan API */
 | 
						|
int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid);
 | 
						|
int prestera_hw_vlan_delete(struct prestera_switch *sw, u16 vid);
 | 
						|
int prestera_hw_vlan_port_set(struct prestera_port *port, u16 vid,
 | 
						|
			      bool is_member, bool untagged);
 | 
						|
int prestera_hw_vlan_port_vid_set(struct prestera_port *port, u16 vid);
 | 
						|
int prestera_hw_vlan_port_stp_set(struct prestera_port *port, u16 vid, u8 state);
 | 
						|
 | 
						|
/* FDB API */
 | 
						|
int prestera_hw_fdb_add(struct prestera_port *port, const unsigned char *mac,
 | 
						|
			u16 vid, bool dynamic);
 | 
						|
int prestera_hw_fdb_del(struct prestera_port *port, const unsigned char *mac,
 | 
						|
			u16 vid);
 | 
						|
int prestera_hw_fdb_flush_port(struct prestera_port *port, u32 mode);
 | 
						|
int prestera_hw_fdb_flush_vlan(struct prestera_switch *sw, u16 vid, u32 mode);
 | 
						|
int prestera_hw_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
 | 
						|
				    u32 mode);
 | 
						|
 | 
						|
/* Bridge API */
 | 
						|
int prestera_hw_bridge_create(struct prestera_switch *sw, u16 *bridge_id);
 | 
						|
int prestera_hw_bridge_delete(struct prestera_switch *sw, u16 bridge_id);
 | 
						|
int prestera_hw_bridge_port_add(struct prestera_port *port, u16 bridge_id);
 | 
						|
int prestera_hw_bridge_port_delete(struct prestera_port *port, u16 bridge_id);
 | 
						|
 | 
						|
/* vTCAM API */
 | 
						|
int prestera_hw_vtcam_create(struct prestera_switch *sw,
 | 
						|
			     u8 lookup, const u32 *keymask, u32 *vtcam_id,
 | 
						|
			     enum prestera_hw_vtcam_direction_t direction);
 | 
						|
int prestera_hw_vtcam_rule_add(struct prestera_switch *sw, u32 vtcam_id,
 | 
						|
			       u32 prio, void *key, void *keymask,
 | 
						|
			       struct prestera_acl_hw_action_info *act,
 | 
						|
			       u8 n_act, u32 *rule_id);
 | 
						|
int prestera_hw_vtcam_rule_del(struct prestera_switch *sw,
 | 
						|
			       u32 vtcam_id, u32 rule_id);
 | 
						|
int prestera_hw_vtcam_destroy(struct prestera_switch *sw, u32 vtcam_id);
 | 
						|
int prestera_hw_vtcam_iface_bind(struct prestera_switch *sw,
 | 
						|
				 struct prestera_acl_iface *iface,
 | 
						|
				 u32 vtcam_id, u16 pcl_id);
 | 
						|
int prestera_hw_vtcam_iface_unbind(struct prestera_switch *sw,
 | 
						|
				   struct prestera_acl_iface *iface,
 | 
						|
				   u32 vtcam_id);
 | 
						|
 | 
						|
/* Counter API */
 | 
						|
int prestera_hw_counter_trigger(struct prestera_switch *sw, u32 block_id);
 | 
						|
int prestera_hw_counter_abort(struct prestera_switch *sw);
 | 
						|
int prestera_hw_counters_get(struct prestera_switch *sw, u32 idx,
 | 
						|
			     u32 *len, bool *done,
 | 
						|
			     struct prestera_counter_stats *stats);
 | 
						|
int prestera_hw_counter_block_get(struct prestera_switch *sw,
 | 
						|
				  u32 client, u32 *block_id, u32 *offset,
 | 
						|
				  u32 *num_counters);
 | 
						|
int prestera_hw_counter_block_release(struct prestera_switch *sw,
 | 
						|
				      u32 block_id);
 | 
						|
int prestera_hw_counter_clear(struct prestera_switch *sw, u32 block_id,
 | 
						|
			      u32 counter_id);
 | 
						|
 | 
						|
/* SPAN API */
 | 
						|
int prestera_hw_span_get(const struct prestera_port *port, u8 *span_id);
 | 
						|
int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id,
 | 
						|
			  bool ingress);
 | 
						|
int prestera_hw_span_unbind(const struct prestera_port *port, bool ingress);
 | 
						|
int prestera_hw_span_release(struct prestera_switch *sw, u8 span_id);
 | 
						|
 | 
						|
/* Router API */
 | 
						|
int prestera_hw_rif_create(struct prestera_switch *sw,
 | 
						|
			   struct prestera_iface *iif, u8 *mac, u16 *rif_id);
 | 
						|
int prestera_hw_rif_delete(struct prestera_switch *sw, u16 rif_id,
 | 
						|
			   struct prestera_iface *iif);
 | 
						|
 | 
						|
/* Virtual Router API */
 | 
						|
int prestera_hw_vr_create(struct prestera_switch *sw, u16 *vr_id);
 | 
						|
int prestera_hw_vr_delete(struct prestera_switch *sw, u16 vr_id);
 | 
						|
 | 
						|
/* LPM PI */
 | 
						|
int prestera_hw_lpm_add(struct prestera_switch *sw, u16 vr_id,
 | 
						|
			__be32 dst, u32 dst_len, u32 grp_id);
 | 
						|
int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id,
 | 
						|
			__be32 dst, u32 dst_len);
 | 
						|
 | 
						|
/* NH API */
 | 
						|
int prestera_hw_nh_entries_set(struct prestera_switch *sw, int count,
 | 
						|
			       struct prestera_neigh_info *nhs, u32 grp_id);
 | 
						|
int prestera_hw_nhgrp_blk_get(struct prestera_switch *sw,
 | 
						|
			      u8 *hw_state, u32 buf_size /* Buffer in bytes */);
 | 
						|
int prestera_hw_nh_group_create(struct prestera_switch *sw, u16 nh_count,
 | 
						|
				u32 *grp_id);
 | 
						|
int prestera_hw_nh_group_delete(struct prestera_switch *sw, u16 nh_count,
 | 
						|
				u32 grp_id);
 | 
						|
 | 
						|
/* Event handlers */
 | 
						|
int prestera_hw_event_handler_register(struct prestera_switch *sw,
 | 
						|
				       enum prestera_event_type type,
 | 
						|
				       prestera_event_cb_t fn,
 | 
						|
				       void *arg);
 | 
						|
void prestera_hw_event_handler_unregister(struct prestera_switch *sw,
 | 
						|
					  enum prestera_event_type type,
 | 
						|
					  prestera_event_cb_t fn);
 | 
						|
 | 
						|
/* RX/TX */
 | 
						|
int prestera_hw_rxtx_init(struct prestera_switch *sw,
 | 
						|
			  struct prestera_rxtx_params *params);
 | 
						|
 | 
						|
/* LAG API */
 | 
						|
int prestera_hw_lag_member_add(struct prestera_port *port, u16 lag_id);
 | 
						|
int prestera_hw_lag_member_del(struct prestera_port *port, u16 lag_id);
 | 
						|
int prestera_hw_lag_member_enable(struct prestera_port *port, u16 lag_id,
 | 
						|
				  bool enable);
 | 
						|
int prestera_hw_lag_fdb_add(struct prestera_switch *sw, u16 lag_id,
 | 
						|
			    const unsigned char *mac, u16 vid, bool dynamic);
 | 
						|
int prestera_hw_lag_fdb_del(struct prestera_switch *sw, u16 lag_id,
 | 
						|
			    const unsigned char *mac, u16 vid);
 | 
						|
int prestera_hw_fdb_flush_lag(struct prestera_switch *sw, u16 lag_id,
 | 
						|
			      u32 mode);
 | 
						|
int prestera_hw_fdb_flush_lag_vlan(struct prestera_switch *sw,
 | 
						|
				   u16 lag_id, u16 vid, u32 mode);
 | 
						|
 | 
						|
/* HW trap/drop counters API */
 | 
						|
int
 | 
						|
prestera_hw_cpu_code_counters_get(struct prestera_switch *sw, u8 code,
 | 
						|
				  enum prestera_hw_cpu_code_cnt_t counter_type,
 | 
						|
				  u64 *packet_count);
 | 
						|
 | 
						|
/* Policer API */
 | 
						|
int prestera_hw_policer_create(struct prestera_switch *sw, u8 type,
 | 
						|
			       u32 *policer_id);
 | 
						|
int prestera_hw_policer_release(struct prestera_switch *sw,
 | 
						|
				u32 policer_id);
 | 
						|
int prestera_hw_policer_sr_tcm_set(struct prestera_switch *sw,
 | 
						|
				   u32 policer_id, u64 cir, u32 cbs);
 | 
						|
 | 
						|
/* Flood domain / MDB API */
 | 
						|
int prestera_hw_flood_domain_create(struct prestera_flood_domain *domain);
 | 
						|
int prestera_hw_flood_domain_destroy(struct prestera_flood_domain *domain);
 | 
						|
int prestera_hw_flood_domain_ports_set(struct prestera_flood_domain *domain);
 | 
						|
int prestera_hw_flood_domain_ports_reset(struct prestera_flood_domain *domain);
 | 
						|
 | 
						|
int prestera_hw_mdb_create(struct prestera_mdb_entry *mdb);
 | 
						|
int prestera_hw_mdb_destroy(struct prestera_mdb_entry *mdb);
 | 
						|
 | 
						|
#endif /* _PRESTERA_HW_H_ */
 |