Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Copyright 2019 NXP
3 */
4#ifndef _MSCC_FELIX_H
5#define _MSCC_FELIX_H
6
7#define ocelot_to_felix(o) container_of((o), struct felix, ocelot)
8#define FELIX_MAC_QUIRKS OCELOT_QUIRK_PCS_PERFORMS_RATE_ADAPTATION
9
10#define OCELOT_PORT_MODE_INTERNAL BIT(0)
11#define OCELOT_PORT_MODE_SGMII BIT(1)
12#define OCELOT_PORT_MODE_QSGMII BIT(2)
13#define OCELOT_PORT_MODE_2500BASEX BIT(3)
14#define OCELOT_PORT_MODE_USXGMII BIT(4)
15#define OCELOT_PORT_MODE_1000BASEX BIT(5)
16
17/* Platform-specific information */
18struct felix_info {
19 /* Hardcoded resources provided by the hardware instantiation. */
20 const struct resource *resources;
21 size_t num_resources;
22 /* Names of the mandatory resources that will be requested during
23 * probe. Must have TARGET_MAX elements, since it is indexed by target.
24 */
25 const char *const *resource_names;
26 const struct reg_field *regfields;
27 const u32 *const *map;
28 const struct ocelot_ops *ops;
29 const u32 *port_modes;
30 int num_mact_rows;
31 const struct ocelot_stat_layout *stats_layout;
32 int num_ports;
33 int num_tx_queues;
34 struct vcap_props *vcap;
35 u16 vcap_pol_base;
36 u16 vcap_pol_max;
37 u16 vcap_pol_base2;
38 u16 vcap_pol_max2;
39 const struct ptp_clock_info *ptp_caps;
40
41 /* Some Ocelot switches are integrated into the SoC without the
42 * extraction IRQ line connected to the ARM GIC. By enabling this
43 * workaround, the few packets that are delivered to the CPU port
44 * module (currently only PTP) are copied not only to the hardware CPU
45 * port module, but also to the 802.1Q Ethernet CPU port, and polling
46 * the extraction registers is triggered once the DSA tagger sees a PTP
47 * frame. The Ethernet frame is only used as a notification: it is
48 * dropped, and the original frame is extracted over MMIO and annotated
49 * with the RX timestamp.
50 */
51 bool quirk_no_xtr_irq;
52
53 int (*mdio_bus_alloc)(struct ocelot *ocelot);
54 void (*mdio_bus_free)(struct ocelot *ocelot);
55 void (*phylink_validate)(struct ocelot *ocelot, int port,
56 unsigned long *supported,
57 struct phylink_link_state *state);
58 int (*port_setup_tc)(struct dsa_switch *ds, int port,
59 enum tc_setup_type type, void *type_data);
60 void (*tas_guard_bands_update)(struct ocelot *ocelot, int port);
61 void (*port_sched_speed_set)(struct ocelot *ocelot, int port,
62 u32 speed);
63};
64
65/* Methods for initializing the hardware resources specific to a tagging
66 * protocol (like the NPI port, for "ocelot" or "seville", or the VCAP TCAMs,
67 * for "ocelot-8021q").
68 * It is important that the resources configured here do not have side effects
69 * for the other tagging protocols. If that is the case, their configuration
70 * needs to go to felix_tag_proto_setup_shared().
71 */
72struct felix_tag_proto_ops {
73 int (*setup)(struct dsa_switch *ds);
74 void (*teardown)(struct dsa_switch *ds);
75 unsigned long (*get_host_fwd_mask)(struct dsa_switch *ds);
76 int (*change_master)(struct dsa_switch *ds, int port,
77 struct net_device *master,
78 struct netlink_ext_ack *extack);
79};
80
81extern const struct dsa_switch_ops felix_switch_ops;
82
83/* DSA glue / front-end for struct ocelot */
84struct felix {
85 struct dsa_switch *ds;
86 const struct felix_info *info;
87 struct ocelot ocelot;
88 struct mii_bus *imdio;
89 struct phylink_pcs **pcs;
90 resource_size_t switch_base;
91 enum dsa_tag_protocol tag_proto;
92 const struct felix_tag_proto_ops *tag_proto_ops;
93 struct kthread_worker *xmit_worker;
94 unsigned long host_flood_uc_mask;
95 unsigned long host_flood_mc_mask;
96};
97
98struct net_device *felix_port_to_netdev(struct ocelot *ocelot, int port);
99int felix_netdev_to_port(struct net_device *dev);
100
101#endif