b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | From 417b5a156ca8ab4c986c9deacf58309ce4e09410 Mon Sep 17 00:00:00 2001 |
| 2 | From: Vladimir Oltean <vladimir.oltean@nxp.com> |
| 3 | Date: Thu, 14 Nov 2019 17:03:27 +0200 |
| 4 | Subject: [PATCH] net: mscc: ocelot: publish structure definitions to |
| 5 | include/soc/mscc/ocelot.h |
| 6 | |
| 7 | We will be registering another switch driver based on ocelot, which |
| 8 | lives under drivers/net/dsa. |
| 9 | |
| 10 | Make sure the Felix DSA front-end has the necessary abstractions to |
| 11 | implement a new Ocelot driver instantiation. This includes the function |
| 12 | prototypes for implementing DSA callbacks. |
| 13 | |
| 14 | Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| 15 | Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> |
| 16 | Signed-off-by: David S. Miller <davem@davemloft.net> |
| 17 | --- |
| 18 | drivers/net/ethernet/mscc/ocelot.c | 78 +++--- |
| 19 | drivers/net/ethernet/mscc/ocelot.h | 482 +-------------------------------- |
| 20 | include/soc/mscc/ocelot.h | 539 +++++++++++++++++++++++++++++++++++++ |
| 21 | 3 files changed, 588 insertions(+), 511 deletions(-) |
| 22 | create mode 100644 include/soc/mscc/ocelot.h |
| 23 | |
| 24 | --- a/drivers/net/ethernet/mscc/ocelot.c |
| 25 | +++ b/drivers/net/ethernet/mscc/ocelot.c |
| 26 | @@ -21,7 +21,6 @@ |
| 27 | #include <net/netevent.h> |
| 28 | #include <net/rtnetlink.h> |
| 29 | #include <net/switchdev.h> |
| 30 | -#include <net/dsa.h> |
| 31 | |
| 32 | #include "ocelot.h" |
| 33 | #include "ocelot_ace.h" |
| 34 | @@ -184,8 +183,8 @@ static void ocelot_vlan_mode(struct ocel |
| 35 | ocelot_write(ocelot, val, ANA_VLANMASK); |
| 36 | } |
| 37 | |
| 38 | -static void ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, |
| 39 | - bool vlan_aware) |
| 40 | +void ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, |
| 41 | + bool vlan_aware) |
| 42 | { |
| 43 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 44 | u32 val; |
| 45 | @@ -230,6 +229,7 @@ static void ocelot_port_vlan_filtering(s |
| 46 | REW_TAG_CFG_TAG_CFG_M, |
| 47 | REW_TAG_CFG, port); |
| 48 | } |
| 49 | +EXPORT_SYMBOL(ocelot_port_vlan_filtering); |
| 50 | |
| 51 | static int ocelot_port_set_native_vlan(struct ocelot *ocelot, int port, |
| 52 | u16 vid) |
| 53 | @@ -267,8 +267,8 @@ static void ocelot_port_set_pvid(struct |
| 54 | ocelot_port->pvid = pvid; |
| 55 | } |
| 56 | |
| 57 | -static int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, |
| 58 | - bool untagged) |
| 59 | +int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, |
| 60 | + bool untagged) |
| 61 | { |
| 62 | int ret; |
| 63 | |
| 64 | @@ -291,6 +291,7 @@ static int ocelot_vlan_add(struct ocelot |
| 65 | |
| 66 | return 0; |
| 67 | } |
| 68 | +EXPORT_SYMBOL(ocelot_vlan_add); |
| 69 | |
| 70 | static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid, |
| 71 | bool untagged) |
| 72 | @@ -312,7 +313,7 @@ static int ocelot_vlan_vid_add(struct ne |
| 73 | return 0; |
| 74 | } |
| 75 | |
| 76 | -static int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid) |
| 77 | +int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid) |
| 78 | { |
| 79 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 80 | int ret; |
| 81 | @@ -333,6 +334,7 @@ static int ocelot_vlan_del(struct ocelot |
| 82 | |
| 83 | return 0; |
| 84 | } |
| 85 | +EXPORT_SYMBOL(ocelot_vlan_del); |
| 86 | |
| 87 | static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid) |
| 88 | { |
| 89 | @@ -404,8 +406,8 @@ static u16 ocelot_wm_enc(u16 value) |
| 90 | return value; |
| 91 | } |
| 92 | |
| 93 | -static void ocelot_adjust_link(struct ocelot *ocelot, int port, |
| 94 | - struct phy_device *phydev) |
| 95 | +void ocelot_adjust_link(struct ocelot *ocelot, int port, |
| 96 | + struct phy_device *phydev) |
| 97 | { |
| 98 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 99 | int speed, mode = 0; |
| 100 | @@ -471,6 +473,7 @@ static void ocelot_adjust_link(struct oc |
| 101 | SYS_MAC_FC_CFG, port); |
| 102 | ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, port); |
| 103 | } |
| 104 | +EXPORT_SYMBOL(ocelot_adjust_link); |
| 105 | |
| 106 | static void ocelot_port_adjust_link(struct net_device *dev) |
| 107 | { |
| 108 | @@ -481,8 +484,8 @@ static void ocelot_port_adjust_link(stru |
| 109 | ocelot_adjust_link(ocelot, port, dev->phydev); |
| 110 | } |
| 111 | |
| 112 | -static void ocelot_port_enable(struct ocelot *ocelot, int port, |
| 113 | - struct phy_device *phy) |
| 114 | +void ocelot_port_enable(struct ocelot *ocelot, int port, |
| 115 | + struct phy_device *phy) |
| 116 | { |
| 117 | /* Enable receiving frames on the port, and activate auto-learning of |
| 118 | * MAC addresses. |
| 119 | @@ -492,6 +495,7 @@ static void ocelot_port_enable(struct oc |
| 120 | ANA_PORT_PORT_CFG_PORTID_VAL(port), |
| 121 | ANA_PORT_PORT_CFG, port); |
| 122 | } |
| 123 | +EXPORT_SYMBOL(ocelot_port_enable); |
| 124 | |
| 125 | static int ocelot_port_open(struct net_device *dev) |
| 126 | { |
| 127 | @@ -526,7 +530,7 @@ static int ocelot_port_open(struct net_d |
| 128 | return 0; |
| 129 | } |
| 130 | |
| 131 | -static void ocelot_port_disable(struct ocelot *ocelot, int port) |
| 132 | +void ocelot_port_disable(struct ocelot *ocelot, int port) |
| 133 | { |
| 134 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 135 | |
| 136 | @@ -534,6 +538,7 @@ static void ocelot_port_disable(struct o |
| 137 | ocelot_rmw_rix(ocelot, 0, QSYS_SWITCH_PORT_MODE_PORT_ENA, |
| 138 | QSYS_SWITCH_PORT_MODE, port); |
| 139 | } |
| 140 | +EXPORT_SYMBOL(ocelot_port_disable); |
| 141 | |
| 142 | static int ocelot_port_stop(struct net_device *dev) |
| 143 | { |
| 144 | @@ -790,9 +795,8 @@ static void ocelot_get_stats64(struct ne |
| 145 | stats->collisions = ocelot_read(ocelot, SYS_COUNT_TX_COLLISION); |
| 146 | } |
| 147 | |
| 148 | -static int ocelot_fdb_add(struct ocelot *ocelot, int port, |
| 149 | - const unsigned char *addr, u16 vid, |
| 150 | - bool vlan_aware) |
| 151 | +int ocelot_fdb_add(struct ocelot *ocelot, int port, |
| 152 | + const unsigned char *addr, u16 vid, bool vlan_aware) |
| 153 | { |
| 154 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 155 | |
| 156 | @@ -812,6 +816,7 @@ static int ocelot_fdb_add(struct ocelot |
| 157 | |
| 158 | return ocelot_mact_learn(ocelot, port, addr, vid, ENTRYTYPE_LOCKED); |
| 159 | } |
| 160 | +EXPORT_SYMBOL(ocelot_fdb_add); |
| 161 | |
| 162 | static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], |
| 163 | struct net_device *dev, |
| 164 | @@ -826,11 +831,12 @@ static int ocelot_port_fdb_add(struct nd |
| 165 | return ocelot_fdb_add(ocelot, port, addr, vid, priv->vlan_aware); |
| 166 | } |
| 167 | |
| 168 | -static int ocelot_fdb_del(struct ocelot *ocelot, int port, |
| 169 | - const unsigned char *addr, u16 vid) |
| 170 | +int ocelot_fdb_del(struct ocelot *ocelot, int port, |
| 171 | + const unsigned char *addr, u16 vid) |
| 172 | { |
| 173 | return ocelot_mact_forget(ocelot, addr, vid); |
| 174 | } |
| 175 | +EXPORT_SYMBOL(ocelot_fdb_del); |
| 176 | |
| 177 | static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], |
| 178 | struct net_device *dev, |
| 179 | @@ -940,8 +946,8 @@ static int ocelot_mact_read(struct ocelo |
| 180 | return 0; |
| 181 | } |
| 182 | |
| 183 | -static int ocelot_fdb_dump(struct ocelot *ocelot, int port, |
| 184 | - dsa_fdb_dump_cb_t *cb, void *data) |
| 185 | +int ocelot_fdb_dump(struct ocelot *ocelot, int port, |
| 186 | + dsa_fdb_dump_cb_t *cb, void *data) |
| 187 | { |
| 188 | int i, j; |
| 189 | |
| 190 | @@ -973,6 +979,7 @@ static int ocelot_fdb_dump(struct ocelot |
| 191 | |
| 192 | return 0; |
| 193 | } |
| 194 | +EXPORT_SYMBOL(ocelot_fdb_dump); |
| 195 | |
| 196 | static int ocelot_port_fdb_dump(struct sk_buff *skb, |
| 197 | struct netlink_callback *cb, |
| 198 | @@ -1147,8 +1154,7 @@ static const struct net_device_ops ocelo |
| 199 | .ndo_do_ioctl = ocelot_ioctl, |
| 200 | }; |
| 201 | |
| 202 | -static void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, |
| 203 | - u8 *data) |
| 204 | +void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data) |
| 205 | { |
| 206 | int i; |
| 207 | |
| 208 | @@ -1159,6 +1165,7 @@ static void ocelot_get_strings(struct oc |
| 209 | memcpy(data + i * ETH_GSTRING_LEN, ocelot->stats_layout[i].name, |
| 210 | ETH_GSTRING_LEN); |
| 211 | } |
| 212 | +EXPORT_SYMBOL(ocelot_get_strings); |
| 213 | |
| 214 | static void ocelot_port_get_strings(struct net_device *netdev, u32 sset, |
| 215 | u8 *data) |
| 216 | @@ -1210,7 +1217,7 @@ static void ocelot_check_stats_work(stru |
| 217 | OCELOT_STATS_CHECK_DELAY); |
| 218 | } |
| 219 | |
| 220 | -static void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data) |
| 221 | +void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data) |
| 222 | { |
| 223 | int i; |
| 224 | |
| 225 | @@ -1221,6 +1228,7 @@ static void ocelot_get_ethtool_stats(str |
| 226 | for (i = 0; i < ocelot->num_stats; i++) |
| 227 | *data++ = ocelot->stats[port * ocelot->num_stats + i]; |
| 228 | } |
| 229 | +EXPORT_SYMBOL(ocelot_get_ethtool_stats); |
| 230 | |
| 231 | static void ocelot_port_get_ethtool_stats(struct net_device *dev, |
| 232 | struct ethtool_stats *stats, |
| 233 | @@ -1233,13 +1241,14 @@ static void ocelot_port_get_ethtool_stat |
| 234 | ocelot_get_ethtool_stats(ocelot, port, data); |
| 235 | } |
| 236 | |
| 237 | -static int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset) |
| 238 | +int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset) |
| 239 | { |
| 240 | if (sset != ETH_SS_STATS) |
| 241 | return -EOPNOTSUPP; |
| 242 | |
| 243 | return ocelot->num_stats; |
| 244 | } |
| 245 | +EXPORT_SYMBOL(ocelot_get_sset_count); |
| 246 | |
| 247 | static int ocelot_port_get_sset_count(struct net_device *dev, int sset) |
| 248 | { |
| 249 | @@ -1250,8 +1259,8 @@ static int ocelot_port_get_sset_count(st |
| 250 | return ocelot_get_sset_count(ocelot, port, sset); |
| 251 | } |
| 252 | |
| 253 | -static int ocelot_get_ts_info(struct ocelot *ocelot, int port, |
| 254 | - struct ethtool_ts_info *info) |
| 255 | +int ocelot_get_ts_info(struct ocelot *ocelot, int port, |
| 256 | + struct ethtool_ts_info *info) |
| 257 | { |
| 258 | info->phc_index = ocelot->ptp_clock ? |
| 259 | ptp_clock_index(ocelot->ptp_clock) : -1; |
| 260 | @@ -1270,6 +1279,7 @@ static int ocelot_get_ts_info(struct oce |
| 261 | |
| 262 | return 0; |
| 263 | } |
| 264 | +EXPORT_SYMBOL(ocelot_get_ts_info); |
| 265 | |
| 266 | static int ocelot_port_get_ts_info(struct net_device *dev, |
| 267 | struct ethtool_ts_info *info) |
| 268 | @@ -1293,8 +1303,7 @@ static const struct ethtool_ops ocelot_e |
| 269 | .get_ts_info = ocelot_port_get_ts_info, |
| 270 | }; |
| 271 | |
| 272 | -static void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, |
| 273 | - u8 state) |
| 274 | +void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, u8 state) |
| 275 | { |
| 276 | u32 port_cfg; |
| 277 | int p, i; |
| 278 | @@ -1355,6 +1364,7 @@ static void ocelot_bridge_stp_state_set( |
| 279 | } |
| 280 | } |
| 281 | } |
| 282 | +EXPORT_SYMBOL(ocelot_bridge_stp_state_set); |
| 283 | |
| 284 | static void ocelot_port_attr_stp_state_set(struct ocelot *ocelot, int port, |
| 285 | struct switchdev_trans *trans, |
| 286 | @@ -1366,11 +1376,12 @@ static void ocelot_port_attr_stp_state_s |
| 287 | ocelot_bridge_stp_state_set(ocelot, port, state); |
| 288 | } |
| 289 | |
| 290 | -static void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs) |
| 291 | +void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs) |
| 292 | { |
| 293 | ocelot_write(ocelot, ANA_AUTOAGE_AGE_PERIOD(msecs / 2), |
| 294 | ANA_AUTOAGE); |
| 295 | } |
| 296 | +EXPORT_SYMBOL(ocelot_set_ageing_time); |
| 297 | |
| 298 | static void ocelot_port_attr_ageing_set(struct ocelot *ocelot, int port, |
| 299 | unsigned long ageing_clock_t) |
| 300 | @@ -1601,8 +1612,8 @@ static int ocelot_port_obj_del(struct ne |
| 301 | return ret; |
| 302 | } |
| 303 | |
| 304 | -static int ocelot_port_bridge_join(struct ocelot *ocelot, int port, |
| 305 | - struct net_device *bridge) |
| 306 | +int ocelot_port_bridge_join(struct ocelot *ocelot, int port, |
| 307 | + struct net_device *bridge) |
| 308 | { |
| 309 | if (!ocelot->bridge_mask) { |
| 310 | ocelot->hw_bridge_dev = bridge; |
| 311 | @@ -1617,9 +1628,10 @@ static int ocelot_port_bridge_join(struc |
| 312 | |
| 313 | return 0; |
| 314 | } |
| 315 | +EXPORT_SYMBOL(ocelot_port_bridge_join); |
| 316 | |
| 317 | -static int ocelot_port_bridge_leave(struct ocelot *ocelot, int port, |
| 318 | - struct net_device *bridge) |
| 319 | +int ocelot_port_bridge_leave(struct ocelot *ocelot, int port, |
| 320 | + struct net_device *bridge) |
| 321 | { |
| 322 | ocelot->bridge_mask &= ~BIT(port); |
| 323 | |
| 324 | @@ -1630,6 +1642,7 @@ static int ocelot_port_bridge_leave(stru |
| 325 | ocelot_port_set_pvid(ocelot, port, 0); |
| 326 | return ocelot_port_set_native_vlan(ocelot, port, 0); |
| 327 | } |
| 328 | +EXPORT_SYMBOL(ocelot_port_bridge_leave); |
| 329 | |
| 330 | static void ocelot_set_aggr_pgids(struct ocelot *ocelot) |
| 331 | { |
| 332 | @@ -2118,7 +2131,7 @@ static void ocelot_port_set_mtu(struct o |
| 333 | ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG); |
| 334 | } |
| 335 | |
| 336 | -static void ocelot_init_port(struct ocelot *ocelot, int port) |
| 337 | +void ocelot_init_port(struct ocelot *ocelot, int port) |
| 338 | { |
| 339 | struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| 340 | |
| 341 | @@ -2165,6 +2178,7 @@ static void ocelot_init_port(struct ocel |
| 342 | /* Enable vcap lookups */ |
| 343 | ocelot_vcap_enable(ocelot, port); |
| 344 | } |
| 345 | +EXPORT_SYMBOL(ocelot_init_port); |
| 346 | |
| 347 | int ocelot_probe_port(struct ocelot *ocelot, u8 port, |
| 348 | void __iomem *regs, |
| 349 | --- a/drivers/net/ethernet/mscc/ocelot.h |
| 350 | +++ b/drivers/net/ethernet/mscc/ocelot.h |
| 351 | @@ -18,6 +18,7 @@ |
| 352 | #include <linux/ptp_clock_kernel.h> |
| 353 | #include <linux/regmap.h> |
| 354 | |
| 355 | +#include <soc/mscc/ocelot.h> |
| 356 | #include "ocelot_ana.h" |
| 357 | #include "ocelot_dev.h" |
| 358 | #include "ocelot_qsys.h" |
| 359 | @@ -52,376 +53,6 @@ struct frame_info { |
| 360 | u32 timestamp; /* rew_val */ |
| 361 | }; |
| 362 | |
| 363 | -#define IFH_INJ_BYPASS BIT(31) |
| 364 | -#define IFH_INJ_POP_CNT_DISABLE (3 << 28) |
| 365 | - |
| 366 | -#define IFH_TAG_TYPE_C 0 |
| 367 | -#define IFH_TAG_TYPE_S 1 |
| 368 | - |
| 369 | -#define IFH_REW_OP_NOOP 0x0 |
| 370 | -#define IFH_REW_OP_DSCP 0x1 |
| 371 | -#define IFH_REW_OP_ONE_STEP_PTP 0x2 |
| 372 | -#define IFH_REW_OP_TWO_STEP_PTP 0x3 |
| 373 | -#define IFH_REW_OP_ORIGIN_PTP 0x5 |
| 374 | - |
| 375 | -#define OCELOT_TAG_LEN 16 |
| 376 | -#define OCELOT_SHORT_PREFIX_LEN 4 |
| 377 | -#define OCELOT_LONG_PREFIX_LEN 16 |
| 378 | - |
| 379 | -#define OCELOT_SPEED_2500 0 |
| 380 | -#define OCELOT_SPEED_1000 1 |
| 381 | -#define OCELOT_SPEED_100 2 |
| 382 | -#define OCELOT_SPEED_10 3 |
| 383 | - |
| 384 | -#define TARGET_OFFSET 24 |
| 385 | -#define REG_MASK GENMASK(TARGET_OFFSET - 1, 0) |
| 386 | -#define REG(reg, offset) [reg & REG_MASK] = offset |
| 387 | - |
| 388 | -enum ocelot_target { |
| 389 | - ANA = 1, |
| 390 | - QS, |
| 391 | - QSYS, |
| 392 | - REW, |
| 393 | - SYS, |
| 394 | - S2, |
| 395 | - HSIO, |
| 396 | - PTP, |
| 397 | - TARGET_MAX, |
| 398 | -}; |
| 399 | - |
| 400 | -enum ocelot_reg { |
| 401 | - ANA_ADVLEARN = ANA << TARGET_OFFSET, |
| 402 | - ANA_VLANMASK, |
| 403 | - ANA_PORT_B_DOMAIN, |
| 404 | - ANA_ANAGEFIL, |
| 405 | - ANA_ANEVENTS, |
| 406 | - ANA_STORMLIMIT_BURST, |
| 407 | - ANA_STORMLIMIT_CFG, |
| 408 | - ANA_ISOLATED_PORTS, |
| 409 | - ANA_COMMUNITY_PORTS, |
| 410 | - ANA_AUTOAGE, |
| 411 | - ANA_MACTOPTIONS, |
| 412 | - ANA_LEARNDISC, |
| 413 | - ANA_AGENCTRL, |
| 414 | - ANA_MIRRORPORTS, |
| 415 | - ANA_EMIRRORPORTS, |
| 416 | - ANA_FLOODING, |
| 417 | - ANA_FLOODING_IPMC, |
| 418 | - ANA_SFLOW_CFG, |
| 419 | - ANA_PORT_MODE, |
| 420 | - ANA_CUT_THRU_CFG, |
| 421 | - ANA_PGID_PGID, |
| 422 | - ANA_TABLES_ANMOVED, |
| 423 | - ANA_TABLES_MACHDATA, |
| 424 | - ANA_TABLES_MACLDATA, |
| 425 | - ANA_TABLES_STREAMDATA, |
| 426 | - ANA_TABLES_MACACCESS, |
| 427 | - ANA_TABLES_MACTINDX, |
| 428 | - ANA_TABLES_VLANACCESS, |
| 429 | - ANA_TABLES_VLANTIDX, |
| 430 | - ANA_TABLES_ISDXACCESS, |
| 431 | - ANA_TABLES_ISDXTIDX, |
| 432 | - ANA_TABLES_ENTRYLIM, |
| 433 | - ANA_TABLES_PTP_ID_HIGH, |
| 434 | - ANA_TABLES_PTP_ID_LOW, |
| 435 | - ANA_TABLES_STREAMACCESS, |
| 436 | - ANA_TABLES_STREAMTIDX, |
| 437 | - ANA_TABLES_SEQ_HISTORY, |
| 438 | - ANA_TABLES_SEQ_MASK, |
| 439 | - ANA_TABLES_SFID_MASK, |
| 440 | - ANA_TABLES_SFIDACCESS, |
| 441 | - ANA_TABLES_SFIDTIDX, |
| 442 | - ANA_MSTI_STATE, |
| 443 | - ANA_OAM_UPM_LM_CNT, |
| 444 | - ANA_SG_ACCESS_CTRL, |
| 445 | - ANA_SG_CONFIG_REG_1, |
| 446 | - ANA_SG_CONFIG_REG_2, |
| 447 | - ANA_SG_CONFIG_REG_3, |
| 448 | - ANA_SG_CONFIG_REG_4, |
| 449 | - ANA_SG_CONFIG_REG_5, |
| 450 | - ANA_SG_GCL_GS_CONFIG, |
| 451 | - ANA_SG_GCL_TI_CONFIG, |
| 452 | - ANA_SG_STATUS_REG_1, |
| 453 | - ANA_SG_STATUS_REG_2, |
| 454 | - ANA_SG_STATUS_REG_3, |
| 455 | - ANA_PORT_VLAN_CFG, |
| 456 | - ANA_PORT_DROP_CFG, |
| 457 | - ANA_PORT_QOS_CFG, |
| 458 | - ANA_PORT_VCAP_CFG, |
| 459 | - ANA_PORT_VCAP_S1_KEY_CFG, |
| 460 | - ANA_PORT_VCAP_S2_CFG, |
| 461 | - ANA_PORT_PCP_DEI_MAP, |
| 462 | - ANA_PORT_CPU_FWD_CFG, |
| 463 | - ANA_PORT_CPU_FWD_BPDU_CFG, |
| 464 | - ANA_PORT_CPU_FWD_GARP_CFG, |
| 465 | - ANA_PORT_CPU_FWD_CCM_CFG, |
| 466 | - ANA_PORT_PORT_CFG, |
| 467 | - ANA_PORT_POL_CFG, |
| 468 | - ANA_PORT_PTP_CFG, |
| 469 | - ANA_PORT_PTP_DLY1_CFG, |
| 470 | - ANA_PORT_PTP_DLY2_CFG, |
| 471 | - ANA_PORT_SFID_CFG, |
| 472 | - ANA_PFC_PFC_CFG, |
| 473 | - ANA_PFC_PFC_TIMER, |
| 474 | - ANA_IPT_OAM_MEP_CFG, |
| 475 | - ANA_IPT_IPT, |
| 476 | - ANA_PPT_PPT, |
| 477 | - ANA_FID_MAP_FID_MAP, |
| 478 | - ANA_AGGR_CFG, |
| 479 | - ANA_CPUQ_CFG, |
| 480 | - ANA_CPUQ_CFG2, |
| 481 | - ANA_CPUQ_8021_CFG, |
| 482 | - ANA_DSCP_CFG, |
| 483 | - ANA_DSCP_REWR_CFG, |
| 484 | - ANA_VCAP_RNG_TYPE_CFG, |
| 485 | - ANA_VCAP_RNG_VAL_CFG, |
| 486 | - ANA_VRAP_CFG, |
| 487 | - ANA_VRAP_HDR_DATA, |
| 488 | - ANA_VRAP_HDR_MASK, |
| 489 | - ANA_DISCARD_CFG, |
| 490 | - ANA_FID_CFG, |
| 491 | - ANA_POL_PIR_CFG, |
| 492 | - ANA_POL_CIR_CFG, |
| 493 | - ANA_POL_MODE_CFG, |
| 494 | - ANA_POL_PIR_STATE, |
| 495 | - ANA_POL_CIR_STATE, |
| 496 | - ANA_POL_STATE, |
| 497 | - ANA_POL_FLOWC, |
| 498 | - ANA_POL_HYST, |
| 499 | - ANA_POL_MISC_CFG, |
| 500 | - QS_XTR_GRP_CFG = QS << TARGET_OFFSET, |
| 501 | - QS_XTR_RD, |
| 502 | - QS_XTR_FRM_PRUNING, |
| 503 | - QS_XTR_FLUSH, |
| 504 | - QS_XTR_DATA_PRESENT, |
| 505 | - QS_XTR_CFG, |
| 506 | - QS_INJ_GRP_CFG, |
| 507 | - QS_INJ_WR, |
| 508 | - QS_INJ_CTRL, |
| 509 | - QS_INJ_STATUS, |
| 510 | - QS_INJ_ERR, |
| 511 | - QS_INH_DBG, |
| 512 | - QSYS_PORT_MODE = QSYS << TARGET_OFFSET, |
| 513 | - QSYS_SWITCH_PORT_MODE, |
| 514 | - QSYS_STAT_CNT_CFG, |
| 515 | - QSYS_EEE_CFG, |
| 516 | - QSYS_EEE_THRES, |
| 517 | - QSYS_IGR_NO_SHARING, |
| 518 | - QSYS_EGR_NO_SHARING, |
| 519 | - QSYS_SW_STATUS, |
| 520 | - QSYS_EXT_CPU_CFG, |
| 521 | - QSYS_PAD_CFG, |
| 522 | - QSYS_CPU_GROUP_MAP, |
| 523 | - QSYS_QMAP, |
| 524 | - QSYS_ISDX_SGRP, |
| 525 | - QSYS_TIMED_FRAME_ENTRY, |
| 526 | - QSYS_TFRM_MISC, |
| 527 | - QSYS_TFRM_PORT_DLY, |
| 528 | - QSYS_TFRM_TIMER_CFG_1, |
| 529 | - QSYS_TFRM_TIMER_CFG_2, |
| 530 | - QSYS_TFRM_TIMER_CFG_3, |
| 531 | - QSYS_TFRM_TIMER_CFG_4, |
| 532 | - QSYS_TFRM_TIMER_CFG_5, |
| 533 | - QSYS_TFRM_TIMER_CFG_6, |
| 534 | - QSYS_TFRM_TIMER_CFG_7, |
| 535 | - QSYS_TFRM_TIMER_CFG_8, |
| 536 | - QSYS_RED_PROFILE, |
| 537 | - QSYS_RES_QOS_MODE, |
| 538 | - QSYS_RES_CFG, |
| 539 | - QSYS_RES_STAT, |
| 540 | - QSYS_EGR_DROP_MODE, |
| 541 | - QSYS_EQ_CTRL, |
| 542 | - QSYS_EVENTS_CORE, |
| 543 | - QSYS_QMAXSDU_CFG_0, |
| 544 | - QSYS_QMAXSDU_CFG_1, |
| 545 | - QSYS_QMAXSDU_CFG_2, |
| 546 | - QSYS_QMAXSDU_CFG_3, |
| 547 | - QSYS_QMAXSDU_CFG_4, |
| 548 | - QSYS_QMAXSDU_CFG_5, |
| 549 | - QSYS_QMAXSDU_CFG_6, |
| 550 | - QSYS_QMAXSDU_CFG_7, |
| 551 | - QSYS_PREEMPTION_CFG, |
| 552 | - QSYS_CIR_CFG, |
| 553 | - QSYS_EIR_CFG, |
| 554 | - QSYS_SE_CFG, |
| 555 | - QSYS_SE_DWRR_CFG, |
| 556 | - QSYS_SE_CONNECT, |
| 557 | - QSYS_SE_DLB_SENSE, |
| 558 | - QSYS_CIR_STATE, |
| 559 | - QSYS_EIR_STATE, |
| 560 | - QSYS_SE_STATE, |
| 561 | - QSYS_HSCH_MISC_CFG, |
| 562 | - QSYS_TAG_CONFIG, |
| 563 | - QSYS_TAS_PARAM_CFG_CTRL, |
| 564 | - QSYS_PORT_MAX_SDU, |
| 565 | - QSYS_PARAM_CFG_REG_1, |
| 566 | - QSYS_PARAM_CFG_REG_2, |
| 567 | - QSYS_PARAM_CFG_REG_3, |
| 568 | - QSYS_PARAM_CFG_REG_4, |
| 569 | - QSYS_PARAM_CFG_REG_5, |
| 570 | - QSYS_GCL_CFG_REG_1, |
| 571 | - QSYS_GCL_CFG_REG_2, |
| 572 | - QSYS_PARAM_STATUS_REG_1, |
| 573 | - QSYS_PARAM_STATUS_REG_2, |
| 574 | - QSYS_PARAM_STATUS_REG_3, |
| 575 | - QSYS_PARAM_STATUS_REG_4, |
| 576 | - QSYS_PARAM_STATUS_REG_5, |
| 577 | - QSYS_PARAM_STATUS_REG_6, |
| 578 | - QSYS_PARAM_STATUS_REG_7, |
| 579 | - QSYS_PARAM_STATUS_REG_8, |
| 580 | - QSYS_PARAM_STATUS_REG_9, |
| 581 | - QSYS_GCL_STATUS_REG_1, |
| 582 | - QSYS_GCL_STATUS_REG_2, |
| 583 | - REW_PORT_VLAN_CFG = REW << TARGET_OFFSET, |
| 584 | - REW_TAG_CFG, |
| 585 | - REW_PORT_CFG, |
| 586 | - REW_DSCP_CFG, |
| 587 | - REW_PCP_DEI_QOS_MAP_CFG, |
| 588 | - REW_PTP_CFG, |
| 589 | - REW_PTP_DLY1_CFG, |
| 590 | - REW_RED_TAG_CFG, |
| 591 | - REW_DSCP_REMAP_DP1_CFG, |
| 592 | - REW_DSCP_REMAP_CFG, |
| 593 | - REW_STAT_CFG, |
| 594 | - REW_REW_STICKY, |
| 595 | - REW_PPT, |
| 596 | - SYS_COUNT_RX_OCTETS = SYS << TARGET_OFFSET, |
| 597 | - SYS_COUNT_RX_UNICAST, |
| 598 | - SYS_COUNT_RX_MULTICAST, |
| 599 | - SYS_COUNT_RX_BROADCAST, |
| 600 | - SYS_COUNT_RX_SHORTS, |
| 601 | - SYS_COUNT_RX_FRAGMENTS, |
| 602 | - SYS_COUNT_RX_JABBERS, |
| 603 | - SYS_COUNT_RX_CRC_ALIGN_ERRS, |
| 604 | - SYS_COUNT_RX_SYM_ERRS, |
| 605 | - SYS_COUNT_RX_64, |
| 606 | - SYS_COUNT_RX_65_127, |
| 607 | - SYS_COUNT_RX_128_255, |
| 608 | - SYS_COUNT_RX_256_1023, |
| 609 | - SYS_COUNT_RX_1024_1526, |
| 610 | - SYS_COUNT_RX_1527_MAX, |
| 611 | - SYS_COUNT_RX_PAUSE, |
| 612 | - SYS_COUNT_RX_CONTROL, |
| 613 | - SYS_COUNT_RX_LONGS, |
| 614 | - SYS_COUNT_RX_CLASSIFIED_DROPS, |
| 615 | - SYS_COUNT_TX_OCTETS, |
| 616 | - SYS_COUNT_TX_UNICAST, |
| 617 | - SYS_COUNT_TX_MULTICAST, |
| 618 | - SYS_COUNT_TX_BROADCAST, |
| 619 | - SYS_COUNT_TX_COLLISION, |
| 620 | - SYS_COUNT_TX_DROPS, |
| 621 | - SYS_COUNT_TX_PAUSE, |
| 622 | - SYS_COUNT_TX_64, |
| 623 | - SYS_COUNT_TX_65_127, |
| 624 | - SYS_COUNT_TX_128_511, |
| 625 | - SYS_COUNT_TX_512_1023, |
| 626 | - SYS_COUNT_TX_1024_1526, |
| 627 | - SYS_COUNT_TX_1527_MAX, |
| 628 | - SYS_COUNT_TX_AGING, |
| 629 | - SYS_RESET_CFG, |
| 630 | - SYS_SR_ETYPE_CFG, |
| 631 | - SYS_VLAN_ETYPE_CFG, |
| 632 | - SYS_PORT_MODE, |
| 633 | - SYS_FRONT_PORT_MODE, |
| 634 | - SYS_FRM_AGING, |
| 635 | - SYS_STAT_CFG, |
| 636 | - SYS_SW_STATUS, |
| 637 | - SYS_MISC_CFG, |
| 638 | - SYS_REW_MAC_HIGH_CFG, |
| 639 | - SYS_REW_MAC_LOW_CFG, |
| 640 | - SYS_TIMESTAMP_OFFSET, |
| 641 | - SYS_CMID, |
| 642 | - SYS_PAUSE_CFG, |
| 643 | - SYS_PAUSE_TOT_CFG, |
| 644 | - SYS_ATOP, |
| 645 | - SYS_ATOP_TOT_CFG, |
| 646 | - SYS_MAC_FC_CFG, |
| 647 | - SYS_MMGT, |
| 648 | - SYS_MMGT_FAST, |
| 649 | - SYS_EVENTS_DIF, |
| 650 | - SYS_EVENTS_CORE, |
| 651 | - SYS_CNT, |
| 652 | - SYS_PTP_STATUS, |
| 653 | - SYS_PTP_TXSTAMP, |
| 654 | - SYS_PTP_NXT, |
| 655 | - SYS_PTP_CFG, |
| 656 | - SYS_RAM_INIT, |
| 657 | - SYS_CM_ADDR, |
| 658 | - SYS_CM_DATA_WR, |
| 659 | - SYS_CM_DATA_RD, |
| 660 | - SYS_CM_OP, |
| 661 | - SYS_CM_DATA, |
| 662 | - S2_CORE_UPDATE_CTRL = S2 << TARGET_OFFSET, |
| 663 | - S2_CORE_MV_CFG, |
| 664 | - S2_CACHE_ENTRY_DAT, |
| 665 | - S2_CACHE_MASK_DAT, |
| 666 | - S2_CACHE_ACTION_DAT, |
| 667 | - S2_CACHE_CNT_DAT, |
| 668 | - S2_CACHE_TG_DAT, |
| 669 | - PTP_PIN_CFG = PTP << TARGET_OFFSET, |
| 670 | - PTP_PIN_TOD_SEC_MSB, |
| 671 | - PTP_PIN_TOD_SEC_LSB, |
| 672 | - PTP_PIN_TOD_NSEC, |
| 673 | - PTP_CFG_MISC, |
| 674 | - PTP_CLK_CFG_ADJ_CFG, |
| 675 | - PTP_CLK_CFG_ADJ_FREQ, |
| 676 | -}; |
| 677 | - |
| 678 | -enum ocelot_regfield { |
| 679 | - ANA_ADVLEARN_VLAN_CHK, |
| 680 | - ANA_ADVLEARN_LEARN_MIRROR, |
| 681 | - ANA_ANEVENTS_FLOOD_DISCARD, |
| 682 | - ANA_ANEVENTS_MSTI_DROP, |
| 683 | - ANA_ANEVENTS_ACLKILL, |
| 684 | - ANA_ANEVENTS_ACLUSED, |
| 685 | - ANA_ANEVENTS_AUTOAGE, |
| 686 | - ANA_ANEVENTS_VS2TTL1, |
| 687 | - ANA_ANEVENTS_STORM_DROP, |
| 688 | - ANA_ANEVENTS_LEARN_DROP, |
| 689 | - ANA_ANEVENTS_AGED_ENTRY, |
| 690 | - ANA_ANEVENTS_CPU_LEARN_FAILED, |
| 691 | - ANA_ANEVENTS_AUTO_LEARN_FAILED, |
| 692 | - ANA_ANEVENTS_LEARN_REMOVE, |
| 693 | - ANA_ANEVENTS_AUTO_LEARNED, |
| 694 | - ANA_ANEVENTS_AUTO_MOVED, |
| 695 | - ANA_ANEVENTS_DROPPED, |
| 696 | - ANA_ANEVENTS_CLASSIFIED_DROP, |
| 697 | - ANA_ANEVENTS_CLASSIFIED_COPY, |
| 698 | - ANA_ANEVENTS_VLAN_DISCARD, |
| 699 | - ANA_ANEVENTS_FWD_DISCARD, |
| 700 | - ANA_ANEVENTS_MULTICAST_FLOOD, |
| 701 | - ANA_ANEVENTS_UNICAST_FLOOD, |
| 702 | - ANA_ANEVENTS_DEST_KNOWN, |
| 703 | - ANA_ANEVENTS_BUCKET3_MATCH, |
| 704 | - ANA_ANEVENTS_BUCKET2_MATCH, |
| 705 | - ANA_ANEVENTS_BUCKET1_MATCH, |
| 706 | - ANA_ANEVENTS_BUCKET0_MATCH, |
| 707 | - ANA_ANEVENTS_CPU_OPERATION, |
| 708 | - ANA_ANEVENTS_DMAC_LOOKUP, |
| 709 | - ANA_ANEVENTS_SMAC_LOOKUP, |
| 710 | - ANA_ANEVENTS_SEQ_GEN_ERR_0, |
| 711 | - ANA_ANEVENTS_SEQ_GEN_ERR_1, |
| 712 | - ANA_TABLES_MACACCESS_B_DOM, |
| 713 | - ANA_TABLES_MACTINDX_BUCKET, |
| 714 | - ANA_TABLES_MACTINDX_M_INDEX, |
| 715 | - QSYS_TIMED_FRAME_ENTRY_TFRM_VLD, |
| 716 | - QSYS_TIMED_FRAME_ENTRY_TFRM_FP, |
| 717 | - QSYS_TIMED_FRAME_ENTRY_TFRM_PORTNO, |
| 718 | - QSYS_TIMED_FRAME_ENTRY_TFRM_TM_SEL, |
| 719 | - QSYS_TIMED_FRAME_ENTRY_TFRM_TM_T, |
| 720 | - SYS_RESET_CFG_CORE_ENA, |
| 721 | - SYS_RESET_CFG_MEM_ENA, |
| 722 | - SYS_RESET_CFG_MEM_INIT, |
| 723 | - REGFIELD_MAX |
| 724 | -}; |
| 725 | - |
| 726 | -enum ocelot_clk_pins { |
| 727 | - ALT_PPS_PIN = 1, |
| 728 | - EXT_CLK_PIN, |
| 729 | - ALT_LDST_PIN, |
| 730 | - TOD_ACC_PIN |
| 731 | -}; |
| 732 | - |
| 733 | struct ocelot_multicast { |
| 734 | struct list_head list; |
| 735 | unsigned char addr[ETH_ALEN]; |
| 736 | @@ -429,88 +60,6 @@ struct ocelot_multicast { |
| 737 | u16 ports; |
| 738 | }; |
| 739 | |
| 740 | -enum ocelot_tag_prefix { |
| 741 | - OCELOT_TAG_PREFIX_DISABLED = 0, |
| 742 | - OCELOT_TAG_PREFIX_NONE, |
| 743 | - OCELOT_TAG_PREFIX_SHORT, |
| 744 | - OCELOT_TAG_PREFIX_LONG, |
| 745 | -}; |
| 746 | - |
| 747 | -struct ocelot_port; |
| 748 | -struct ocelot; |
| 749 | - |
| 750 | -struct ocelot_stat_layout { |
| 751 | - u32 offset; |
| 752 | - char name[ETH_GSTRING_LEN]; |
| 753 | -}; |
| 754 | - |
| 755 | -struct ocelot_ops { |
| 756 | - void (*pcs_init)(struct ocelot *ocelot, int port); |
| 757 | - int (*reset)(struct ocelot *ocelot); |
| 758 | -}; |
| 759 | - |
| 760 | -struct ocelot { |
| 761 | - const struct ocelot_ops *ops; |
| 762 | - struct device *dev; |
| 763 | - |
| 764 | - struct regmap *targets[TARGET_MAX]; |
| 765 | - struct regmap_field *regfields[REGFIELD_MAX]; |
| 766 | - const u32 *const *map; |
| 767 | - const struct ocelot_stat_layout *stats_layout; |
| 768 | - unsigned int num_stats; |
| 769 | - |
| 770 | - u8 base_mac[ETH_ALEN]; |
| 771 | - |
| 772 | - struct net_device *hw_bridge_dev; |
| 773 | - u16 bridge_mask; |
| 774 | - u16 bridge_fwd_mask; |
| 775 | - |
| 776 | - struct workqueue_struct *ocelot_owq; |
| 777 | - |
| 778 | - int shared_queue_sz; |
| 779 | - |
| 780 | - u8 num_phys_ports; |
| 781 | - u8 num_cpu_ports; |
| 782 | - u8 cpu; |
| 783 | - struct ocelot_port **ports; |
| 784 | - |
| 785 | - u32 *lags; |
| 786 | - |
| 787 | - /* Keep track of the vlan port masks */ |
| 788 | - u32 vlan_mask[VLAN_N_VID]; |
| 789 | - |
| 790 | - struct list_head multicast; |
| 791 | - |
| 792 | - /* Workqueue to check statistics for overflow with its lock */ |
| 793 | - struct mutex stats_lock; |
| 794 | - u64 *stats; |
| 795 | - struct delayed_work stats_work; |
| 796 | - struct workqueue_struct *stats_queue; |
| 797 | - |
| 798 | - u8 ptp:1; |
| 799 | - struct ptp_clock *ptp_clock; |
| 800 | - struct ptp_clock_info ptp_info; |
| 801 | - struct hwtstamp_config hwtstamp_config; |
| 802 | - struct mutex ptp_lock; /* Protects the PTP interface state */ |
| 803 | - spinlock_t ptp_clock_lock; /* Protects the PTP clock */ |
| 804 | -}; |
| 805 | - |
| 806 | -struct ocelot_port { |
| 807 | - struct ocelot *ocelot; |
| 808 | - |
| 809 | - void __iomem *regs; |
| 810 | - |
| 811 | - /* Ingress default VLAN (pvid) */ |
| 812 | - u16 pvid; |
| 813 | - |
| 814 | - /* Egress default VLAN (vid) */ |
| 815 | - u16 vid; |
| 816 | - |
| 817 | - u8 ptp_cmd; |
| 818 | - struct list_head skbs; |
| 819 | - u8 ts_id; |
| 820 | -}; |
| 821 | - |
| 822 | struct ocelot_port_private { |
| 823 | struct ocelot_port port; |
| 824 | struct net_device *dev; |
| 825 | @@ -531,37 +80,12 @@ struct ocelot_skb { |
| 826 | u8 id; |
| 827 | }; |
| 828 | |
| 829 | -u32 __ocelot_read_ix(struct ocelot *ocelot, u32 reg, u32 offset); |
| 830 | -#define ocelot_read_ix(ocelot, reg, gi, ri) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) |
| 831 | -#define ocelot_read_gix(ocelot, reg, gi) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi)) |
| 832 | -#define ocelot_read_rix(ocelot, reg, ri) __ocelot_read_ix(ocelot, reg, reg##_RSZ * (ri)) |
| 833 | -#define ocelot_read(ocelot, reg) __ocelot_read_ix(ocelot, reg, 0) |
| 834 | - |
| 835 | -void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset); |
| 836 | -#define ocelot_write_ix(ocelot, val, reg, gi, ri) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) |
| 837 | -#define ocelot_write_gix(ocelot, val, reg, gi) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi)) |
| 838 | -#define ocelot_write_rix(ocelot, val, reg, ri) __ocelot_write_ix(ocelot, val, reg, reg##_RSZ * (ri)) |
| 839 | -#define ocelot_write(ocelot, val, reg) __ocelot_write_ix(ocelot, val, reg, 0) |
| 840 | - |
| 841 | -void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg, |
| 842 | - u32 offset); |
| 843 | -#define ocelot_rmw_ix(ocelot, val, m, reg, gi, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) |
| 844 | -#define ocelot_rmw_gix(ocelot, val, m, reg, gi) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi)) |
| 845 | -#define ocelot_rmw_rix(ocelot, val, m, reg, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_RSZ * (ri)) |
| 846 | -#define ocelot_rmw(ocelot, val, m, reg) __ocelot_rmw_ix(ocelot, val, m, reg, 0) |
| 847 | - |
| 848 | u32 ocelot_port_readl(struct ocelot_port *port, u32 reg); |
| 849 | void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg); |
| 850 | |
| 851 | -int ocelot_regfields_init(struct ocelot *ocelot, |
| 852 | - const struct reg_field *const regfields); |
| 853 | -struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res); |
| 854 | - |
| 855 | #define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val)) |
| 856 | #define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val)) |
| 857 | |
| 858 | -int ocelot_init(struct ocelot *ocelot); |
| 859 | -void ocelot_deinit(struct ocelot *ocelot); |
| 860 | int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops); |
| 861 | int ocelot_probe_port(struct ocelot *ocelot, u8 port, |
| 862 | void __iomem *regs, |
| 863 | @@ -575,7 +99,7 @@ extern struct notifier_block ocelot_netd |
| 864 | extern struct notifier_block ocelot_switchdev_nb; |
| 865 | extern struct notifier_block ocelot_switchdev_blocking_nb; |
| 866 | |
| 867 | -int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts); |
| 868 | -void ocelot_get_hwtimestamp(struct ocelot *ocelot, struct timespec64 *ts); |
| 869 | +#define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val)) |
| 870 | +#define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val)) |
| 871 | |
| 872 | #endif |
| 873 | --- /dev/null |
| 874 | +++ b/include/soc/mscc/ocelot.h |
| 875 | @@ -0,0 +1,539 @@ |
| 876 | +/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ |
| 877 | +/* Copyright (c) 2017 Microsemi Corporation |
| 878 | + */ |
| 879 | + |
| 880 | +#ifndef _SOC_MSCC_OCELOT_H |
| 881 | +#define _SOC_MSCC_OCELOT_H |
| 882 | + |
| 883 | +#include <linux/ptp_clock_kernel.h> |
| 884 | +#include <linux/net_tstamp.h> |
| 885 | +#include <linux/if_vlan.h> |
| 886 | +#include <linux/regmap.h> |
| 887 | +#include <net/dsa.h> |
| 888 | + |
| 889 | +#define IFH_INJ_BYPASS BIT(31) |
| 890 | +#define IFH_INJ_POP_CNT_DISABLE (3 << 28) |
| 891 | + |
| 892 | +#define IFH_TAG_TYPE_C 0 |
| 893 | +#define IFH_TAG_TYPE_S 1 |
| 894 | + |
| 895 | +#define IFH_REW_OP_NOOP 0x0 |
| 896 | +#define IFH_REW_OP_DSCP 0x1 |
| 897 | +#define IFH_REW_OP_ONE_STEP_PTP 0x2 |
| 898 | +#define IFH_REW_OP_TWO_STEP_PTP 0x3 |
| 899 | +#define IFH_REW_OP_ORIGIN_PTP 0x5 |
| 900 | + |
| 901 | +#define OCELOT_TAG_LEN 16 |
| 902 | +#define OCELOT_SHORT_PREFIX_LEN 4 |
| 903 | +#define OCELOT_LONG_PREFIX_LEN 16 |
| 904 | + |
| 905 | +#define OCELOT_SPEED_2500 0 |
| 906 | +#define OCELOT_SPEED_1000 1 |
| 907 | +#define OCELOT_SPEED_100 2 |
| 908 | +#define OCELOT_SPEED_10 3 |
| 909 | + |
| 910 | +#define TARGET_OFFSET 24 |
| 911 | +#define REG_MASK GENMASK(TARGET_OFFSET - 1, 0) |
| 912 | +#define REG(reg, offset) [reg & REG_MASK] = offset |
| 913 | + |
| 914 | +#define REG_RESERVED_ADDR 0xffffffff |
| 915 | +#define REG_RESERVED(reg) REG(reg, REG_RESERVED_ADDR) |
| 916 | + |
| 917 | +enum ocelot_target { |
| 918 | + ANA = 1, |
| 919 | + QS, |
| 920 | + QSYS, |
| 921 | + REW, |
| 922 | + SYS, |
| 923 | + S2, |
| 924 | + HSIO, |
| 925 | + PTP, |
| 926 | + GCB, |
| 927 | + TARGET_MAX, |
| 928 | +}; |
| 929 | + |
| 930 | +enum ocelot_reg { |
| 931 | + ANA_ADVLEARN = ANA << TARGET_OFFSET, |
| 932 | + ANA_VLANMASK, |
| 933 | + ANA_PORT_B_DOMAIN, |
| 934 | + ANA_ANAGEFIL, |
| 935 | + ANA_ANEVENTS, |
| 936 | + ANA_STORMLIMIT_BURST, |
| 937 | + ANA_STORMLIMIT_CFG, |
| 938 | + ANA_ISOLATED_PORTS, |
| 939 | + ANA_COMMUNITY_PORTS, |
| 940 | + ANA_AUTOAGE, |
| 941 | + ANA_MACTOPTIONS, |
| 942 | + ANA_LEARNDISC, |
| 943 | + ANA_AGENCTRL, |
| 944 | + ANA_MIRRORPORTS, |
| 945 | + ANA_EMIRRORPORTS, |
| 946 | + ANA_FLOODING, |
| 947 | + ANA_FLOODING_IPMC, |
| 948 | + ANA_SFLOW_CFG, |
| 949 | + ANA_PORT_MODE, |
| 950 | + ANA_CUT_THRU_CFG, |
| 951 | + ANA_PGID_PGID, |
| 952 | + ANA_TABLES_ANMOVED, |
| 953 | + ANA_TABLES_MACHDATA, |
| 954 | + ANA_TABLES_MACLDATA, |
| 955 | + ANA_TABLES_STREAMDATA, |
| 956 | + ANA_TABLES_MACACCESS, |
| 957 | + ANA_TABLES_MACTINDX, |
| 958 | + ANA_TABLES_VLANACCESS, |
| 959 | + ANA_TABLES_VLANTIDX, |
| 960 | + ANA_TABLES_ISDXACCESS, |
| 961 | + ANA_TABLES_ISDXTIDX, |
| 962 | + ANA_TABLES_ENTRYLIM, |
| 963 | + ANA_TABLES_PTP_ID_HIGH, |
| 964 | + ANA_TABLES_PTP_ID_LOW, |
| 965 | + ANA_TABLES_STREAMACCESS, |
| 966 | + ANA_TABLES_STREAMTIDX, |
| 967 | + ANA_TABLES_SEQ_HISTORY, |
| 968 | + ANA_TABLES_SEQ_MASK, |
| 969 | + ANA_TABLES_SFID_MASK, |
| 970 | + ANA_TABLES_SFIDACCESS, |
| 971 | + ANA_TABLES_SFIDTIDX, |
| 972 | + ANA_MSTI_STATE, |
| 973 | + ANA_OAM_UPM_LM_CNT, |
| 974 | + ANA_SG_ACCESS_CTRL, |
| 975 | + ANA_SG_CONFIG_REG_1, |
| 976 | + ANA_SG_CONFIG_REG_2, |
| 977 | + ANA_SG_CONFIG_REG_3, |
| 978 | + ANA_SG_CONFIG_REG_4, |
| 979 | + ANA_SG_CONFIG_REG_5, |
| 980 | + ANA_SG_GCL_GS_CONFIG, |
| 981 | + ANA_SG_GCL_TI_CONFIG, |
| 982 | + ANA_SG_STATUS_REG_1, |
| 983 | + ANA_SG_STATUS_REG_2, |
| 984 | + ANA_SG_STATUS_REG_3, |
| 985 | + ANA_PORT_VLAN_CFG, |
| 986 | + ANA_PORT_DROP_CFG, |
| 987 | + ANA_PORT_QOS_CFG, |
| 988 | + ANA_PORT_VCAP_CFG, |
| 989 | + ANA_PORT_VCAP_S1_KEY_CFG, |
| 990 | + ANA_PORT_VCAP_S2_CFG, |
| 991 | + ANA_PORT_PCP_DEI_MAP, |
| 992 | + ANA_PORT_CPU_FWD_CFG, |
| 993 | + ANA_PORT_CPU_FWD_BPDU_CFG, |
| 994 | + ANA_PORT_CPU_FWD_GARP_CFG, |
| 995 | + ANA_PORT_CPU_FWD_CCM_CFG, |
| 996 | + ANA_PORT_PORT_CFG, |
| 997 | + ANA_PORT_POL_CFG, |
| 998 | + ANA_PORT_PTP_CFG, |
| 999 | + ANA_PORT_PTP_DLY1_CFG, |
| 1000 | + ANA_PORT_PTP_DLY2_CFG, |
| 1001 | + ANA_PORT_SFID_CFG, |
| 1002 | + ANA_PFC_PFC_CFG, |
| 1003 | + ANA_PFC_PFC_TIMER, |
| 1004 | + ANA_IPT_OAM_MEP_CFG, |
| 1005 | + ANA_IPT_IPT, |
| 1006 | + ANA_PPT_PPT, |
| 1007 | + ANA_FID_MAP_FID_MAP, |
| 1008 | + ANA_AGGR_CFG, |
| 1009 | + ANA_CPUQ_CFG, |
| 1010 | + ANA_CPUQ_CFG2, |
| 1011 | + ANA_CPUQ_8021_CFG, |
| 1012 | + ANA_DSCP_CFG, |
| 1013 | + ANA_DSCP_REWR_CFG, |
| 1014 | + ANA_VCAP_RNG_TYPE_CFG, |
| 1015 | + ANA_VCAP_RNG_VAL_CFG, |
| 1016 | + ANA_VRAP_CFG, |
| 1017 | + ANA_VRAP_HDR_DATA, |
| 1018 | + ANA_VRAP_HDR_MASK, |
| 1019 | + ANA_DISCARD_CFG, |
| 1020 | + ANA_FID_CFG, |
| 1021 | + ANA_POL_PIR_CFG, |
| 1022 | + ANA_POL_CIR_CFG, |
| 1023 | + ANA_POL_MODE_CFG, |
| 1024 | + ANA_POL_PIR_STATE, |
| 1025 | + ANA_POL_CIR_STATE, |
| 1026 | + ANA_POL_STATE, |
| 1027 | + ANA_POL_FLOWC, |
| 1028 | + ANA_POL_HYST, |
| 1029 | + ANA_POL_MISC_CFG, |
| 1030 | + QS_XTR_GRP_CFG = QS << TARGET_OFFSET, |
| 1031 | + QS_XTR_RD, |
| 1032 | + QS_XTR_FRM_PRUNING, |
| 1033 | + QS_XTR_FLUSH, |
| 1034 | + QS_XTR_DATA_PRESENT, |
| 1035 | + QS_XTR_CFG, |
| 1036 | + QS_INJ_GRP_CFG, |
| 1037 | + QS_INJ_WR, |
| 1038 | + QS_INJ_CTRL, |
| 1039 | + QS_INJ_STATUS, |
| 1040 | + QS_INJ_ERR, |
| 1041 | + QS_INH_DBG, |
| 1042 | + QSYS_PORT_MODE = QSYS << TARGET_OFFSET, |
| 1043 | + QSYS_SWITCH_PORT_MODE, |
| 1044 | + QSYS_STAT_CNT_CFG, |
| 1045 | + QSYS_EEE_CFG, |
| 1046 | + QSYS_EEE_THRES, |
| 1047 | + QSYS_IGR_NO_SHARING, |
| 1048 | + QSYS_EGR_NO_SHARING, |
| 1049 | + QSYS_SW_STATUS, |
| 1050 | + QSYS_EXT_CPU_CFG, |
| 1051 | + QSYS_PAD_CFG, |
| 1052 | + QSYS_CPU_GROUP_MAP, |
| 1053 | + QSYS_QMAP, |
| 1054 | + QSYS_ISDX_SGRP, |
| 1055 | + QSYS_TIMED_FRAME_ENTRY, |
| 1056 | + QSYS_TFRM_MISC, |
| 1057 | + QSYS_TFRM_PORT_DLY, |
| 1058 | + QSYS_TFRM_TIMER_CFG_1, |
| 1059 | + QSYS_TFRM_TIMER_CFG_2, |
| 1060 | + QSYS_TFRM_TIMER_CFG_3, |
| 1061 | + QSYS_TFRM_TIMER_CFG_4, |
| 1062 | + QSYS_TFRM_TIMER_CFG_5, |
| 1063 | + QSYS_TFRM_TIMER_CFG_6, |
| 1064 | + QSYS_TFRM_TIMER_CFG_7, |
| 1065 | + QSYS_TFRM_TIMER_CFG_8, |
| 1066 | + QSYS_RED_PROFILE, |
| 1067 | + QSYS_RES_QOS_MODE, |
| 1068 | + QSYS_RES_CFG, |
| 1069 | + QSYS_RES_STAT, |
| 1070 | + QSYS_EGR_DROP_MODE, |
| 1071 | + QSYS_EQ_CTRL, |
| 1072 | + QSYS_EVENTS_CORE, |
| 1073 | + QSYS_QMAXSDU_CFG_0, |
| 1074 | + QSYS_QMAXSDU_CFG_1, |
| 1075 | + QSYS_QMAXSDU_CFG_2, |
| 1076 | + QSYS_QMAXSDU_CFG_3, |
| 1077 | + QSYS_QMAXSDU_CFG_4, |
| 1078 | + QSYS_QMAXSDU_CFG_5, |
| 1079 | + QSYS_QMAXSDU_CFG_6, |
| 1080 | + QSYS_QMAXSDU_CFG_7, |
| 1081 | + QSYS_PREEMPTION_CFG, |
| 1082 | + QSYS_CIR_CFG, |
| 1083 | + QSYS_EIR_CFG, |
| 1084 | + QSYS_SE_CFG, |
| 1085 | + QSYS_SE_DWRR_CFG, |
| 1086 | + QSYS_SE_CONNECT, |
| 1087 | + QSYS_SE_DLB_SENSE, |
| 1088 | + QSYS_CIR_STATE, |
| 1089 | + QSYS_EIR_STATE, |
| 1090 | + QSYS_SE_STATE, |
| 1091 | + QSYS_HSCH_MISC_CFG, |
| 1092 | + QSYS_TAG_CONFIG, |
| 1093 | + QSYS_TAS_PARAM_CFG_CTRL, |
| 1094 | + QSYS_PORT_MAX_SDU, |
| 1095 | + QSYS_PARAM_CFG_REG_1, |
| 1096 | + QSYS_PARAM_CFG_REG_2, |
| 1097 | + QSYS_PARAM_CFG_REG_3, |
| 1098 | + QSYS_PARAM_CFG_REG_4, |
| 1099 | + QSYS_PARAM_CFG_REG_5, |
| 1100 | + QSYS_GCL_CFG_REG_1, |
| 1101 | + QSYS_GCL_CFG_REG_2, |
| 1102 | + QSYS_PARAM_STATUS_REG_1, |
| 1103 | + QSYS_PARAM_STATUS_REG_2, |
| 1104 | + QSYS_PARAM_STATUS_REG_3, |
| 1105 | + QSYS_PARAM_STATUS_REG_4, |
| 1106 | + QSYS_PARAM_STATUS_REG_5, |
| 1107 | + QSYS_PARAM_STATUS_REG_6, |
| 1108 | + QSYS_PARAM_STATUS_REG_7, |
| 1109 | + QSYS_PARAM_STATUS_REG_8, |
| 1110 | + QSYS_PARAM_STATUS_REG_9, |
| 1111 | + QSYS_GCL_STATUS_REG_1, |
| 1112 | + QSYS_GCL_STATUS_REG_2, |
| 1113 | + REW_PORT_VLAN_CFG = REW << TARGET_OFFSET, |
| 1114 | + REW_TAG_CFG, |
| 1115 | + REW_PORT_CFG, |
| 1116 | + REW_DSCP_CFG, |
| 1117 | + REW_PCP_DEI_QOS_MAP_CFG, |
| 1118 | + REW_PTP_CFG, |
| 1119 | + REW_PTP_DLY1_CFG, |
| 1120 | + REW_RED_TAG_CFG, |
| 1121 | + REW_DSCP_REMAP_DP1_CFG, |
| 1122 | + REW_DSCP_REMAP_CFG, |
| 1123 | + REW_STAT_CFG, |
| 1124 | + REW_REW_STICKY, |
| 1125 | + REW_PPT, |
| 1126 | + SYS_COUNT_RX_OCTETS = SYS << TARGET_OFFSET, |
| 1127 | + SYS_COUNT_RX_UNICAST, |
| 1128 | + SYS_COUNT_RX_MULTICAST, |
| 1129 | + SYS_COUNT_RX_BROADCAST, |
| 1130 | + SYS_COUNT_RX_SHORTS, |
| 1131 | + SYS_COUNT_RX_FRAGMENTS, |
| 1132 | + SYS_COUNT_RX_JABBERS, |
| 1133 | + SYS_COUNT_RX_CRC_ALIGN_ERRS, |
| 1134 | + SYS_COUNT_RX_SYM_ERRS, |
| 1135 | + SYS_COUNT_RX_64, |
| 1136 | + SYS_COUNT_RX_65_127, |
| 1137 | + SYS_COUNT_RX_128_255, |
| 1138 | + SYS_COUNT_RX_256_1023, |
| 1139 | + SYS_COUNT_RX_1024_1526, |
| 1140 | + SYS_COUNT_RX_1527_MAX, |
| 1141 | + SYS_COUNT_RX_PAUSE, |
| 1142 | + SYS_COUNT_RX_CONTROL, |
| 1143 | + SYS_COUNT_RX_LONGS, |
| 1144 | + SYS_COUNT_RX_CLASSIFIED_DROPS, |
| 1145 | + SYS_COUNT_TX_OCTETS, |
| 1146 | + SYS_COUNT_TX_UNICAST, |
| 1147 | + SYS_COUNT_TX_MULTICAST, |
| 1148 | + SYS_COUNT_TX_BROADCAST, |
| 1149 | + SYS_COUNT_TX_COLLISION, |
| 1150 | + SYS_COUNT_TX_DROPS, |
| 1151 | + SYS_COUNT_TX_PAUSE, |
| 1152 | + SYS_COUNT_TX_64, |
| 1153 | + SYS_COUNT_TX_65_127, |
| 1154 | + SYS_COUNT_TX_128_511, |
| 1155 | + SYS_COUNT_TX_512_1023, |
| 1156 | + SYS_COUNT_TX_1024_1526, |
| 1157 | + SYS_COUNT_TX_1527_MAX, |
| 1158 | + SYS_COUNT_TX_AGING, |
| 1159 | + SYS_RESET_CFG, |
| 1160 | + SYS_SR_ETYPE_CFG, |
| 1161 | + SYS_VLAN_ETYPE_CFG, |
| 1162 | + SYS_PORT_MODE, |
| 1163 | + SYS_FRONT_PORT_MODE, |
| 1164 | + SYS_FRM_AGING, |
| 1165 | + SYS_STAT_CFG, |
| 1166 | + SYS_SW_STATUS, |
| 1167 | + SYS_MISC_CFG, |
| 1168 | + SYS_REW_MAC_HIGH_CFG, |
| 1169 | + SYS_REW_MAC_LOW_CFG, |
| 1170 | + SYS_TIMESTAMP_OFFSET, |
| 1171 | + SYS_CMID, |
| 1172 | + SYS_PAUSE_CFG, |
| 1173 | + SYS_PAUSE_TOT_CFG, |
| 1174 | + SYS_ATOP, |
| 1175 | + SYS_ATOP_TOT_CFG, |
| 1176 | + SYS_MAC_FC_CFG, |
| 1177 | + SYS_MMGT, |
| 1178 | + SYS_MMGT_FAST, |
| 1179 | + SYS_EVENTS_DIF, |
| 1180 | + SYS_EVENTS_CORE, |
| 1181 | + SYS_CNT, |
| 1182 | + SYS_PTP_STATUS, |
| 1183 | + SYS_PTP_TXSTAMP, |
| 1184 | + SYS_PTP_NXT, |
| 1185 | + SYS_PTP_CFG, |
| 1186 | + SYS_RAM_INIT, |
| 1187 | + SYS_CM_ADDR, |
| 1188 | + SYS_CM_DATA_WR, |
| 1189 | + SYS_CM_DATA_RD, |
| 1190 | + SYS_CM_OP, |
| 1191 | + SYS_CM_DATA, |
| 1192 | + S2_CORE_UPDATE_CTRL = S2 << TARGET_OFFSET, |
| 1193 | + S2_CORE_MV_CFG, |
| 1194 | + S2_CACHE_ENTRY_DAT, |
| 1195 | + S2_CACHE_MASK_DAT, |
| 1196 | + S2_CACHE_ACTION_DAT, |
| 1197 | + S2_CACHE_CNT_DAT, |
| 1198 | + S2_CACHE_TG_DAT, |
| 1199 | + PTP_PIN_CFG = PTP << TARGET_OFFSET, |
| 1200 | + PTP_PIN_TOD_SEC_MSB, |
| 1201 | + PTP_PIN_TOD_SEC_LSB, |
| 1202 | + PTP_PIN_TOD_NSEC, |
| 1203 | + PTP_CFG_MISC, |
| 1204 | + PTP_CLK_CFG_ADJ_CFG, |
| 1205 | + PTP_CLK_CFG_ADJ_FREQ, |
| 1206 | + GCB_SOFT_RST = GCB << TARGET_OFFSET, |
| 1207 | +}; |
| 1208 | + |
| 1209 | +enum ocelot_regfield { |
| 1210 | + ANA_ADVLEARN_VLAN_CHK, |
| 1211 | + ANA_ADVLEARN_LEARN_MIRROR, |
| 1212 | + ANA_ANEVENTS_FLOOD_DISCARD, |
| 1213 | + ANA_ANEVENTS_MSTI_DROP, |
| 1214 | + ANA_ANEVENTS_ACLKILL, |
| 1215 | + ANA_ANEVENTS_ACLUSED, |
| 1216 | + ANA_ANEVENTS_AUTOAGE, |
| 1217 | + ANA_ANEVENTS_VS2TTL1, |
| 1218 | + ANA_ANEVENTS_STORM_DROP, |
| 1219 | + ANA_ANEVENTS_LEARN_DROP, |
| 1220 | + ANA_ANEVENTS_AGED_ENTRY, |
| 1221 | + ANA_ANEVENTS_CPU_LEARN_FAILED, |
| 1222 | + ANA_ANEVENTS_AUTO_LEARN_FAILED, |
| 1223 | + ANA_ANEVENTS_LEARN_REMOVE, |
| 1224 | + ANA_ANEVENTS_AUTO_LEARNED, |
| 1225 | + ANA_ANEVENTS_AUTO_MOVED, |
| 1226 | + ANA_ANEVENTS_DROPPED, |
| 1227 | + ANA_ANEVENTS_CLASSIFIED_DROP, |
| 1228 | + ANA_ANEVENTS_CLASSIFIED_COPY, |
| 1229 | + ANA_ANEVENTS_VLAN_DISCARD, |
| 1230 | + ANA_ANEVENTS_FWD_DISCARD, |
| 1231 | + ANA_ANEVENTS_MULTICAST_FLOOD, |
| 1232 | + ANA_ANEVENTS_UNICAST_FLOOD, |
| 1233 | + ANA_ANEVENTS_DEST_KNOWN, |
| 1234 | + ANA_ANEVENTS_BUCKET3_MATCH, |
| 1235 | + ANA_ANEVENTS_BUCKET2_MATCH, |
| 1236 | + ANA_ANEVENTS_BUCKET1_MATCH, |
| 1237 | + ANA_ANEVENTS_BUCKET0_MATCH, |
| 1238 | + ANA_ANEVENTS_CPU_OPERATION, |
| 1239 | + ANA_ANEVENTS_DMAC_LOOKUP, |
| 1240 | + ANA_ANEVENTS_SMAC_LOOKUP, |
| 1241 | + ANA_ANEVENTS_SEQ_GEN_ERR_0, |
| 1242 | + ANA_ANEVENTS_SEQ_GEN_ERR_1, |
| 1243 | + ANA_TABLES_MACACCESS_B_DOM, |
| 1244 | + ANA_TABLES_MACTINDX_BUCKET, |
| 1245 | + ANA_TABLES_MACTINDX_M_INDEX, |
| 1246 | + QSYS_TIMED_FRAME_ENTRY_TFRM_VLD, |
| 1247 | + QSYS_TIMED_FRAME_ENTRY_TFRM_FP, |
| 1248 | + QSYS_TIMED_FRAME_ENTRY_TFRM_PORTNO, |
| 1249 | + QSYS_TIMED_FRAME_ENTRY_TFRM_TM_SEL, |
| 1250 | + QSYS_TIMED_FRAME_ENTRY_TFRM_TM_T, |
| 1251 | + SYS_RESET_CFG_CORE_ENA, |
| 1252 | + SYS_RESET_CFG_MEM_ENA, |
| 1253 | + SYS_RESET_CFG_MEM_INIT, |
| 1254 | + GCB_SOFT_RST_SWC_RST, |
| 1255 | + REGFIELD_MAX |
| 1256 | +}; |
| 1257 | + |
| 1258 | +enum ocelot_clk_pins { |
| 1259 | + ALT_PPS_PIN = 1, |
| 1260 | + EXT_CLK_PIN, |
| 1261 | + ALT_LDST_PIN, |
| 1262 | + TOD_ACC_PIN |
| 1263 | +}; |
| 1264 | + |
| 1265 | +struct ocelot_stat_layout { |
| 1266 | + u32 offset; |
| 1267 | + char name[ETH_GSTRING_LEN]; |
| 1268 | +}; |
| 1269 | + |
| 1270 | +enum ocelot_tag_prefix { |
| 1271 | + OCELOT_TAG_PREFIX_DISABLED = 0, |
| 1272 | + OCELOT_TAG_PREFIX_NONE, |
| 1273 | + OCELOT_TAG_PREFIX_SHORT, |
| 1274 | + OCELOT_TAG_PREFIX_LONG, |
| 1275 | +}; |
| 1276 | + |
| 1277 | +struct ocelot; |
| 1278 | + |
| 1279 | +struct ocelot_ops { |
| 1280 | + void (*pcs_init)(struct ocelot *ocelot, int port); |
| 1281 | + int (*reset)(struct ocelot *ocelot); |
| 1282 | +}; |
| 1283 | + |
| 1284 | +struct ocelot_port { |
| 1285 | + struct ocelot *ocelot; |
| 1286 | + |
| 1287 | + void __iomem *regs; |
| 1288 | + |
| 1289 | + /* Ingress default VLAN (pvid) */ |
| 1290 | + u16 pvid; |
| 1291 | + |
| 1292 | + /* Egress default VLAN (vid) */ |
| 1293 | + u16 vid; |
| 1294 | + |
| 1295 | + u8 ptp_cmd; |
| 1296 | + struct list_head skbs; |
| 1297 | + u8 ts_id; |
| 1298 | +}; |
| 1299 | + |
| 1300 | +struct ocelot { |
| 1301 | + struct device *dev; |
| 1302 | + |
| 1303 | + const struct ocelot_ops *ops; |
| 1304 | + struct regmap *targets[TARGET_MAX]; |
| 1305 | + struct regmap_field *regfields[REGFIELD_MAX]; |
| 1306 | + const u32 *const *map; |
| 1307 | + const struct ocelot_stat_layout *stats_layout; |
| 1308 | + unsigned int num_stats; |
| 1309 | + |
| 1310 | + int shared_queue_sz; |
| 1311 | + |
| 1312 | + struct net_device *hw_bridge_dev; |
| 1313 | + u16 bridge_mask; |
| 1314 | + u16 bridge_fwd_mask; |
| 1315 | + |
| 1316 | + struct ocelot_port **ports; |
| 1317 | + |
| 1318 | + u8 base_mac[ETH_ALEN]; |
| 1319 | + |
| 1320 | + /* Keep track of the vlan port masks */ |
| 1321 | + u32 vlan_mask[VLAN_N_VID]; |
| 1322 | + |
| 1323 | + u8 num_phys_ports; |
| 1324 | + u8 num_cpu_ports; |
| 1325 | + u8 cpu; |
| 1326 | + |
| 1327 | + u32 *lags; |
| 1328 | + |
| 1329 | + struct list_head multicast; |
| 1330 | + |
| 1331 | + /* Workqueue to check statistics for overflow with its lock */ |
| 1332 | + struct mutex stats_lock; |
| 1333 | + u64 *stats; |
| 1334 | + struct delayed_work stats_work; |
| 1335 | + struct workqueue_struct *stats_queue; |
| 1336 | + |
| 1337 | + u8 ptp:1; |
| 1338 | + struct ptp_clock *ptp_clock; |
| 1339 | + struct ptp_clock_info ptp_info; |
| 1340 | + struct hwtstamp_config hwtstamp_config; |
| 1341 | + /* Protects the PTP interface state */ |
| 1342 | + struct mutex ptp_lock; |
| 1343 | + /* Protects the PTP clock */ |
| 1344 | + spinlock_t ptp_clock_lock; |
| 1345 | + |
| 1346 | + void (*port_pcs_init)(struct ocelot_port *port); |
| 1347 | +}; |
| 1348 | + |
| 1349 | +#define ocelot_read_ix(ocelot, reg, gi, ri) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) |
| 1350 | +#define ocelot_read_gix(ocelot, reg, gi) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi)) |
| 1351 | +#define ocelot_read_rix(ocelot, reg, ri) __ocelot_read_ix(ocelot, reg, reg##_RSZ * (ri)) |
| 1352 | +#define ocelot_read(ocelot, reg) __ocelot_read_ix(ocelot, reg, 0) |
| 1353 | + |
| 1354 | +#define ocelot_write_ix(ocelot, val, reg, gi, ri) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) |
| 1355 | +#define ocelot_write_gix(ocelot, val, reg, gi) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi)) |
| 1356 | +#define ocelot_write_rix(ocelot, val, reg, ri) __ocelot_write_ix(ocelot, val, reg, reg##_RSZ * (ri)) |
| 1357 | +#define ocelot_write(ocelot, val, reg) __ocelot_write_ix(ocelot, val, reg, 0) |
| 1358 | + |
| 1359 | +#define ocelot_rmw_ix(ocelot, val, m, reg, gi, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) |
| 1360 | +#define ocelot_rmw_gix(ocelot, val, m, reg, gi) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi)) |
| 1361 | +#define ocelot_rmw_rix(ocelot, val, m, reg, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_RSZ * (ri)) |
| 1362 | +#define ocelot_rmw(ocelot, val, m, reg) __ocelot_rmw_ix(ocelot, val, m, reg, 0) |
| 1363 | + |
| 1364 | +/* I/O */ |
| 1365 | +u32 ocelot_port_readl(struct ocelot_port *port, u32 reg); |
| 1366 | +void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg); |
| 1367 | +u32 __ocelot_read_ix(struct ocelot *ocelot, u32 reg, u32 offset); |
| 1368 | +void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset); |
| 1369 | +void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg, |
| 1370 | + u32 offset); |
| 1371 | + |
| 1372 | +/* Hardware initialization */ |
| 1373 | +int ocelot_regfields_init(struct ocelot *ocelot, |
| 1374 | + const struct reg_field *const regfields); |
| 1375 | +struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res); |
| 1376 | +void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu, |
| 1377 | + enum ocelot_tag_prefix injection, |
| 1378 | + enum ocelot_tag_prefix extraction); |
| 1379 | +int ocelot_init(struct ocelot *ocelot); |
| 1380 | +void ocelot_deinit(struct ocelot *ocelot); |
| 1381 | +void ocelot_init_port(struct ocelot *ocelot, int port); |
| 1382 | + |
| 1383 | +/* DSA callbacks */ |
| 1384 | +void ocelot_port_enable(struct ocelot *ocelot, int port, |
| 1385 | + struct phy_device *phy); |
| 1386 | +void ocelot_port_disable(struct ocelot *ocelot, int port); |
| 1387 | +void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data); |
| 1388 | +void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data); |
| 1389 | +int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset); |
| 1390 | +int ocelot_get_ts_info(struct ocelot *ocelot, int port, |
| 1391 | + struct ethtool_ts_info *info); |
| 1392 | +void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs); |
| 1393 | +void ocelot_adjust_link(struct ocelot *ocelot, int port, |
| 1394 | + struct phy_device *phydev); |
| 1395 | +void ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, |
| 1396 | + bool vlan_aware); |
| 1397 | +void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, u8 state); |
| 1398 | +int ocelot_port_bridge_join(struct ocelot *ocelot, int port, |
| 1399 | + struct net_device *bridge); |
| 1400 | +int ocelot_port_bridge_leave(struct ocelot *ocelot, int port, |
| 1401 | + struct net_device *bridge); |
| 1402 | +int ocelot_fdb_dump(struct ocelot *ocelot, int port, |
| 1403 | + dsa_fdb_dump_cb_t *cb, void *data); |
| 1404 | +int ocelot_fdb_add(struct ocelot *ocelot, int port, |
| 1405 | + const unsigned char *addr, u16 vid, bool vlan_aware); |
| 1406 | +int ocelot_fdb_del(struct ocelot *ocelot, int port, |
| 1407 | + const unsigned char *addr, u16 vid); |
| 1408 | +int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, |
| 1409 | + bool untagged); |
| 1410 | +int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid); |
| 1411 | +int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts); |
| 1412 | +void ocelot_get_hwtimestamp(struct ocelot *ocelot, struct timespec64 *ts); |
| 1413 | + |
| 1414 | +#endif |