cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

prestera.h (7345B)


      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_H_
      5#define _PRESTERA_H_
      6
      7#include <linux/notifier.h>
      8#include <linux/skbuff.h>
      9#include <linux/workqueue.h>
     10#include <net/devlink.h>
     11#include <uapi/linux/if_ether.h>
     12
     13#define PRESTERA_DRV_NAME	"prestera"
     14
     15#define PRESTERA_DEFAULT_VID    1
     16
     17struct prestera_fw_rev {
     18	u16 maj;
     19	u16 min;
     20	u16 sub;
     21};
     22
     23struct prestera_port_stats {
     24	u64 good_octets_received;
     25	u64 bad_octets_received;
     26	u64 mac_trans_error;
     27	u64 broadcast_frames_received;
     28	u64 multicast_frames_received;
     29	u64 frames_64_octets;
     30	u64 frames_65_to_127_octets;
     31	u64 frames_128_to_255_octets;
     32	u64 frames_256_to_511_octets;
     33	u64 frames_512_to_1023_octets;
     34	u64 frames_1024_to_max_octets;
     35	u64 excessive_collision;
     36	u64 multicast_frames_sent;
     37	u64 broadcast_frames_sent;
     38	u64 fc_sent;
     39	u64 fc_received;
     40	u64 buffer_overrun;
     41	u64 undersize;
     42	u64 fragments;
     43	u64 oversize;
     44	u64 jabber;
     45	u64 rx_error_frame_received;
     46	u64 bad_crc;
     47	u64 collisions;
     48	u64 late_collision;
     49	u64 unicast_frames_received;
     50	u64 unicast_frames_sent;
     51	u64 sent_multiple;
     52	u64 sent_deferred;
     53	u64 good_octets_sent;
     54};
     55
     56#define PRESTERA_AP_PORT_MAX   (10)
     57
     58struct prestera_port_caps {
     59	u64 supp_link_modes;
     60	u8 supp_fec;
     61	u8 type;
     62	u8 transceiver;
     63};
     64
     65struct prestera_lag {
     66	struct net_device *dev;
     67	struct list_head members;
     68	u16 member_count;
     69	u16 lag_id;
     70};
     71
     72struct prestera_flow_block;
     73
     74struct prestera_port_mac_state {
     75	u32 mode;
     76	u32 speed;
     77	bool oper;
     78	u8 duplex;
     79	u8 fc;
     80	u8 fec;
     81};
     82
     83struct prestera_port_phy_state {
     84	u64 lmode_bmap;
     85	struct {
     86		bool pause;
     87		bool asym_pause;
     88	} remote_fc;
     89	u8 mdix;
     90};
     91
     92struct prestera_port_mac_config {
     93	u32 mode;
     94	u32 speed;
     95	bool admin;
     96	u8 inband;
     97	u8 duplex;
     98	u8 fec;
     99};
    100
    101struct prestera_port_phy_config {
    102	u32 mode;
    103	bool admin;
    104	u8 mdix;
    105};
    106
    107struct prestera_port {
    108	struct net_device *dev;
    109	struct prestera_switch *sw;
    110	struct prestera_flow_block *flow_block;
    111	struct devlink_port dl_port;
    112	struct list_head lag_member;
    113	struct prestera_lag *lag;
    114	u32 id;
    115	u32 hw_id;
    116	u32 dev_id;
    117	u16 fp_id;
    118	u16 pvid;
    119	bool autoneg;
    120	u64 adver_link_modes;
    121	u8 adver_fec;
    122	struct prestera_port_caps caps;
    123	struct list_head list;
    124	struct list_head vlans_list;
    125	struct {
    126		struct prestera_port_stats stats;
    127		struct delayed_work caching_dw;
    128	} cached_hw_stats;
    129	struct prestera_port_mac_config cfg_mac;
    130	struct prestera_port_phy_config cfg_phy;
    131	struct prestera_port_mac_state state_mac;
    132	struct prestera_port_phy_state state_phy;
    133};
    134
    135struct prestera_device {
    136	struct device *dev;
    137	u8 __iomem *ctl_regs;
    138	u8 __iomem *pp_regs;
    139	struct prestera_fw_rev fw_rev;
    140	void *priv;
    141
    142	/* called by device driver to handle received packets */
    143	void (*recv_pkt)(struct prestera_device *dev);
    144
    145	/* called by device driver to pass event up to the higher layer */
    146	int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size);
    147
    148	/* called by higher layer to send request to the firmware */
    149	int (*send_req)(struct prestera_device *dev, int qid, void *in_msg,
    150			size_t in_size, void *out_msg, size_t out_size,
    151			unsigned int wait);
    152};
    153
    154enum prestera_event_type {
    155	PRESTERA_EVENT_TYPE_UNSPEC,
    156
    157	PRESTERA_EVENT_TYPE_PORT,
    158	PRESTERA_EVENT_TYPE_FDB,
    159	PRESTERA_EVENT_TYPE_RXTX,
    160
    161	PRESTERA_EVENT_TYPE_MAX
    162};
    163
    164enum prestera_rxtx_event_id {
    165	PRESTERA_RXTX_EVENT_UNSPEC,
    166	PRESTERA_RXTX_EVENT_RCV_PKT,
    167};
    168
    169enum prestera_port_event_id {
    170	PRESTERA_PORT_EVENT_UNSPEC,
    171	PRESTERA_PORT_EVENT_MAC_STATE_CHANGED,
    172};
    173
    174struct prestera_port_event {
    175	u32 port_id;
    176	union {
    177		struct {
    178			u32 mode;
    179			u32 speed;
    180			u8 oper;
    181			u8 duplex;
    182			u8 fc;
    183			u8 fec;
    184		} mac;
    185		struct {
    186			u64 lmode_bmap;
    187			struct {
    188				bool pause;
    189				bool asym_pause;
    190			} remote_fc;
    191			u8 mdix;
    192		} phy;
    193	} data;
    194};
    195
    196enum prestera_fdb_entry_type {
    197	PRESTERA_FDB_ENTRY_TYPE_REG_PORT,
    198	PRESTERA_FDB_ENTRY_TYPE_LAG,
    199	PRESTERA_FDB_ENTRY_TYPE_MAX
    200};
    201
    202enum prestera_fdb_event_id {
    203	PRESTERA_FDB_EVENT_UNSPEC,
    204	PRESTERA_FDB_EVENT_LEARNED,
    205	PRESTERA_FDB_EVENT_AGED,
    206};
    207
    208struct prestera_fdb_event {
    209	enum prestera_fdb_entry_type type;
    210	union {
    211		u32 port_id;
    212		u16 lag_id;
    213	} dest;
    214	u32 vid;
    215	union {
    216		u8 mac[ETH_ALEN];
    217	} data;
    218};
    219
    220struct prestera_event {
    221	u16 id;
    222	union {
    223		struct prestera_port_event port_evt;
    224		struct prestera_fdb_event fdb_evt;
    225	};
    226};
    227
    228enum prestera_if_type {
    229	/* the interface is of port type (dev,port) */
    230	PRESTERA_IF_PORT_E = 0,
    231
    232	/* the interface is of lag type (lag-id) */
    233	PRESTERA_IF_LAG_E = 1,
    234
    235	/* the interface is of Vid type (vlan-id) */
    236	PRESTERA_IF_VID_E = 3,
    237};
    238
    239struct prestera_iface {
    240	enum prestera_if_type type;
    241	struct {
    242		u32 hw_dev_num;
    243		u32 port_num;
    244	} dev_port;
    245	u32 hw_dev_num;
    246	u16 vr_id;
    247	u16 lag_id;
    248	u16 vlan_id;
    249};
    250
    251struct prestera_switchdev;
    252struct prestera_span;
    253struct prestera_rxtx;
    254struct prestera_trap_data;
    255struct prestera_acl;
    256
    257struct prestera_switch {
    258	struct prestera_device *dev;
    259	struct prestera_switchdev *swdev;
    260	struct prestera_rxtx *rxtx;
    261	struct prestera_acl *acl;
    262	struct prestera_span *span;
    263	struct list_head event_handlers;
    264	struct notifier_block netdev_nb;
    265	struct prestera_trap_data *trap_data;
    266	char base_mac[ETH_ALEN];
    267	struct list_head port_list;
    268	rwlock_t port_list_lock;
    269	u32 port_count;
    270	u32 mtu_min;
    271	u32 mtu_max;
    272	u8 id;
    273	struct prestera_router *router;
    274	struct prestera_lag *lags;
    275	struct prestera_counter *counter;
    276	u8 lag_member_max;
    277	u8 lag_max;
    278};
    279
    280struct prestera_router {
    281	struct prestera_switch *sw;
    282	struct list_head vr_list;
    283	struct list_head rif_entry_list;
    284	struct rhashtable fib_ht;
    285	struct rhashtable kern_fib_cache_ht;
    286	struct notifier_block inetaddr_nb;
    287	struct notifier_block inetaddr_valid_nb;
    288	struct notifier_block fib_nb;
    289};
    290
    291struct prestera_rxtx_params {
    292	bool use_sdma;
    293	u32 map_addr;
    294};
    295
    296#define prestera_dev(sw)		((sw)->dev->dev)
    297
    298static inline void prestera_write(const struct prestera_switch *sw,
    299				  unsigned int reg, u32 val)
    300{
    301	writel(val, sw->dev->pp_regs + reg);
    302}
    303
    304static inline u32 prestera_read(const struct prestera_switch *sw,
    305				unsigned int reg)
    306{
    307	return readl(sw->dev->pp_regs + reg);
    308}
    309
    310int prestera_device_register(struct prestera_device *dev);
    311void prestera_device_unregister(struct prestera_device *dev);
    312
    313struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
    314						 u32 dev_id, u32 hw_id);
    315
    316int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes);
    317
    318int prestera_router_init(struct prestera_switch *sw);
    319void prestera_router_fini(struct prestera_switch *sw);
    320
    321struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
    322
    323int prestera_port_cfg_mac_read(struct prestera_port *port,
    324			       struct prestera_port_mac_config *cfg);
    325
    326int prestera_port_cfg_mac_write(struct prestera_port *port,
    327				struct prestera_port_mac_config *cfg);
    328
    329struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
    330
    331void prestera_queue_work(struct work_struct *work);
    332
    333int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
    334
    335bool prestera_netdev_check(const struct net_device *dev);
    336
    337int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr);
    338
    339bool prestera_port_is_lag_member(const struct prestera_port *port);
    340
    341struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id);
    342
    343u16 prestera_port_lag_id(const struct prestera_port *port);
    344
    345#endif /* _PRESTERA_H_ */