Merge branch 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / net / ethernet / mscc / ocelot.h
1 /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
2 /*
3  * Microsemi Ocelot Switch driver
4  *
5  * Copyright (c) 2017 Microsemi Corporation
6  */
7
8 #ifndef _MSCC_OCELOT_H_
9 #define _MSCC_OCELOT_H_
10
11 #include <linux/bitops.h>
12 #include <linux/etherdevice.h>
13 #include <linux/if_vlan.h>
14 #include <linux/net_tstamp.h>
15 #include <linux/phy.h>
16 #include <linux/phy/phy.h>
17 #include <linux/platform_device.h>
18 #include <linux/ptp_clock_kernel.h>
19 #include <linux/regmap.h>
20
21 #include <soc/mscc/ocelot_sys.h>
22 #include <soc/mscc/ocelot.h>
23 #include "ocelot_ana.h"
24 #include "ocelot_dev.h"
25 #include "ocelot_qsys.h"
26 #include "ocelot_rew.h"
27 #include "ocelot_qs.h"
28 #include "ocelot_tc.h"
29 #include "ocelot_ptp.h"
30
31 #define PGID_AGGR    64
32 #define PGID_SRC     80
33
34 /* Reserved PGIDs */
35 #define PGID_CPU     (PGID_AGGR - 5)
36 #define PGID_UC      (PGID_AGGR - 4)
37 #define PGID_MC      (PGID_AGGR - 3)
38 #define PGID_MCIPV4  (PGID_AGGR - 2)
39 #define PGID_MCIPV6  (PGID_AGGR - 1)
40
41 #define OCELOT_BUFFER_CELL_SZ 60
42
43 #define OCELOT_STATS_CHECK_DELAY (2 * HZ)
44
45 #define OCELOT_PTP_QUEUE_SZ     128
46
47 struct frame_info {
48         u32 len;
49         u16 port;
50         u16 vid;
51         u8 tag_type;
52         u16 rew_op;
53         u32 timestamp;  /* rew_val */
54 };
55
56 struct ocelot_multicast {
57         struct list_head list;
58         unsigned char addr[ETH_ALEN];
59         u16 vid;
60         u16 ports;
61 };
62
63 struct ocelot_port_private {
64         struct ocelot_port port;
65         struct net_device *dev;
66         struct phy_device *phy;
67         u8 chip_port;
68
69         u8 vlan_aware;
70
71         phy_interface_t phy_mode;
72         struct phy *serdes;
73
74         struct ocelot_port_tc tc;
75 };
76
77 u32 ocelot_port_readl(struct ocelot_port *port, u32 reg);
78 void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg);
79
80 #define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val))
81 #define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val))
82
83 int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops);
84 int ocelot_probe_port(struct ocelot *ocelot, u8 port,
85                       void __iomem *regs,
86                       struct phy_device *phy);
87
88 void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu,
89                          enum ocelot_tag_prefix injection,
90                          enum ocelot_tag_prefix extraction);
91
92 extern struct notifier_block ocelot_netdevice_nb;
93 extern struct notifier_block ocelot_switchdev_nb;
94 extern struct notifier_block ocelot_switchdev_blocking_nb;
95
96 #define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val))
97 #define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val))
98
99 #endif