OSDN Git Service

net: mscc: ocelot: add ops for decoding watermark threshold and occupancy
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 15 Jan 2021 02:11:12 +0000 (04:11 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 16 Jan 2021 04:02:34 +0000 (20:02 -0800)
We'll need to read back the watermark thresholds and occupancy from
hardware (for devlink-sb integration), not only to write them as we did
so far in ocelot_port_set_maxlen. So introduce 2 new functions in struct
ocelot_ops, similar to wm_enc, and implement them for the 3 supported
mscc_ocelot switches.

Remove the INUSE and MAXUSE unpacking helpers for the QSYS_RES_STAT
register, because that doesn't scale with the number of switches that
mscc_ocelot supports now. They have different bit widths for the
watermarks, and we need function pointers to abstract that difference
away.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/ocelot/felix_vsc9959.c
drivers/net/dsa/ocelot/seville_vsc9953.c
drivers/net/ethernet/mscc/ocelot_vsc7514.c
include/soc/mscc/ocelot.h
include/soc/mscc/ocelot_qsys.h

index b68df85..21dacb8 100644 (file)
@@ -1006,9 +1006,27 @@ static u16 vsc9959_wm_enc(u16 value)
        return value;
 }
 
+static u16 vsc9959_wm_dec(u16 wm)
+{
+       WARN_ON(wm & ~GENMASK(8, 0));
+
+       if (wm & BIT(8))
+               return (wm & GENMASK(7, 0)) * 16;
+
+       return wm;
+}
+
+static void vsc9959_wm_stat(u32 val, u32 *inuse, u32 *maxuse)
+{
+       *inuse = (val & GENMASK(23, 12)) >> 12;
+       *maxuse = val & GENMASK(11, 0);
+}
+
 static const struct ocelot_ops vsc9959_ops = {
        .reset                  = vsc9959_reset,
        .wm_enc                 = vsc9959_wm_enc,
+       .wm_dec                 = vsc9959_wm_dec,
+       .wm_stat                = vsc9959_wm_stat,
        .port_to_netdev         = felix_port_to_netdev,
        .netdev_to_port         = felix_netdev_to_port,
 };
index b72813d..8dad0c8 100644 (file)
@@ -1057,9 +1057,27 @@ static u16 vsc9953_wm_enc(u16 value)
        return value;
 }
 
+static u16 vsc9953_wm_dec(u16 wm)
+{
+       WARN_ON(wm & ~GENMASK(9, 0));
+
+       if (wm & BIT(9))
+               return (wm & GENMASK(8, 0)) * 16;
+
+       return wm;
+}
+
+static void vsc9953_wm_stat(u32 val, u32 *inuse, u32 *maxuse)
+{
+       *inuse = (val & GENMASK(25, 13)) >> 13;
+       *maxuse = val & GENMASK(12, 0);
+}
+
 static const struct ocelot_ops vsc9953_ops = {
        .reset                  = vsc9953_reset,
        .wm_enc                 = vsc9953_wm_enc,
+       .wm_dec                 = vsc9953_wm_dec,
+       .wm_stat                = vsc9953_wm_stat,
        .port_to_netdev         = felix_port_to_netdev,
        .netdev_to_port         = felix_netdev_to_port,
 };
index 7135ad1..ecd4744 100644 (file)
@@ -763,9 +763,25 @@ static u16 ocelot_wm_enc(u16 value)
        return value;
 }
 
+static u16 ocelot_wm_dec(u16 wm)
+{
+       if (wm & BIT(8))
+               return (wm & GENMASK(7, 0)) * 16;
+
+       return wm;
+}
+
+static void ocelot_wm_stat(u32 val, u32 *inuse, u32 *maxuse)
+{
+       *inuse = (val & GENMASK(23, 12)) >> 12;
+       *maxuse = val & GENMASK(11, 0);
+}
+
 static const struct ocelot_ops ocelot_ops = {
        .reset                  = ocelot_reset,
        .wm_enc                 = ocelot_wm_enc,
+       .wm_dec                 = ocelot_wm_dec,
+       .wm_stat                = ocelot_wm_stat,
        .port_to_netdev         = ocelot_port_to_netdev,
        .netdev_to_port         = ocelot_netdev_to_port,
 };
index c17a372..e548b0f 100644 (file)
@@ -563,6 +563,8 @@ struct ocelot_ops {
        int (*netdev_to_port)(struct net_device *dev);
        int (*reset)(struct ocelot *ocelot);
        u16 (*wm_enc)(u16 value);
+       u16 (*wm_dec)(u16 value);
+       void (*wm_stat)(u32 val, u32 *inuse, u32 *maxuse);
 };
 
 struct ocelot_vcap_block {
index b7b263a..9731895 100644 (file)
 
 #define QSYS_RES_STAT_GSZ                                 0x8
 
-#define QSYS_RES_STAT_INUSE(x)                            (((x) << 12) & GENMASK(23, 12))
-#define QSYS_RES_STAT_INUSE_M                             GENMASK(23, 12)
-#define QSYS_RES_STAT_INUSE_X(x)                          (((x) & GENMASK(23, 12)) >> 12)
-#define QSYS_RES_STAT_MAXUSE(x)                           ((x) & GENMASK(11, 0))
-#define QSYS_RES_STAT_MAXUSE_M                            GENMASK(11, 0)
-
 #define QSYS_MMGT_EQ_CTRL_FP_FREE_CNT(x)                  ((x) & GENMASK(15, 0))
 #define QSYS_MMGT_EQ_CTRL_FP_FREE_CNT_M                   GENMASK(15, 0)