nfp: read chip model from the PluDevice register
authorDirk van der Merwe <dirk.vandermerwe@netronome.com>
Wed, 11 Sep 2019 15:21:18 +0000 (16:21 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Sep 2019 23:01:00 +0000 (00:01 +0100)
The PluDevice register provides the authoritative chip model/revision.

Since the model number is purely used for reporting purposes, follow
the hardware team convention of subtracting 0x10 from the PluDevice
register to obtain the chip model/revision number.

Suggested-by: Francois H. Theron <francois.theron@netronome.com>
Signed-off-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpplib.c

index 3cfecf1..85734c6 100644 (file)
@@ -24,8 +24,9 @@
 /* NFP6000 PL */
 #define NFP_PL_DEVICE_ID                       0x00000004
 #define   NFP_PL_DEVICE_ID_MASK                        GENMASK(7, 0)
-
-#define NFP6000_ARM_GCSR_SOFTMODEL0            0x00400144
+#define   NFP_PL_DEVICE_PART_MASK              GENMASK(31, 16)
+#define NFP_PL_DEVICE_MODEL_MASK               (NFP_PL_DEVICE_PART_MASK | \
+                                                NFP_PL_DEVICE_ID_MASK)
 
 /**
  * nfp_cpp_readl() - Read a u32 word from a CPP location
@@ -120,22 +121,17 @@ int nfp_cpp_writeq(struct nfp_cpp *cpp, u32 cpp_id,
  */
 int nfp_cpp_model_autodetect(struct nfp_cpp *cpp, u32 *model)
 {
-       const u32 arm_id = NFP_CPP_ID(NFP_CPP_TARGET_ARM, 0, 0);
        u32 reg;
        int err;
 
-       err = nfp_cpp_readl(cpp, arm_id, NFP6000_ARM_GCSR_SOFTMODEL0, model);
-       if (err < 0)
-               return err;
-
-       /* The PL's PluDeviceID revision code is authoratative */
-       *model &= ~0xff;
        err = nfp_xpb_readl(cpp, NFP_XPB_DEVICE(1, 1, 16) + NFP_PL_DEVICE_ID,
                            &reg);
        if (err < 0)
                return err;
 
-       *model |= (NFP_PL_DEVICE_ID_MASK & reg) - 0x10;
+       *model = reg & NFP_PL_DEVICE_MODEL_MASK;
+       if (*model & NFP_PL_DEVICE_ID_MASK)
+               *model -= 0x10;
 
        return 0;
 }