#define NFP_PL_DEVICE_ID 0x00000004
#define NFP_PL_DEVICE_ID_MASK 0xff
-
-#define NFP6000_ARM_GCSR_SOFTMODEL0 0x00400144
+#define NFP_PL_DEVICE_PART_MASK 0xffff0000
+#define NFP_PL_DEVICE_MODEL_MASK (NFP_PL_DEVICE_PART_MASK | \
+ NFP_PL_DEVICE_ID_MASK)
void
nfp_cpp_priv_set(struct nfp_cpp *cpp, void *priv)
uint32_t
nfp_cpp_model(struct nfp_cpp *cpp)
{
+ int err;
+ uint32_t model;
+
if (!cpp)
return NFP_CPP_MODEL_INVALID;
- if (cpp->model == 0)
- cpp->model = __nfp_cpp_model_autodetect(cpp);
+ err = __nfp_cpp_model_autodetect(cpp, &model);
- return cpp->model;
+ if (err < 0)
+ return err;
+
+ return model;
}
void
uint32_t xpb;
int island;
- if (!NFP_CPP_MODEL_IS_6000(cpp->model))
- return 0;
-
xpb = NFP_CPP_ID(14, NFP_CPP_ACTION_RW, 0);
/*
* as those are model-specific
*/
uint32_t
-__nfp_cpp_model_autodetect(struct nfp_cpp *cpp)
+__nfp_cpp_model_autodetect(struct nfp_cpp *cpp, uint32_t *model)
{
- uint32_t arm_id = NFP_CPP_ID(NFP_CPP_TARGET_ARM, 0, 0);
- uint32_t model = 0;
-
- if (nfp_cpp_readl(cpp, arm_id, NFP6000_ARM_GCSR_SOFTMODEL0, &model))
- return 0;
-
- if (NFP_CPP_MODEL_IS_6000(model)) {
- uint32_t tmp;
-
- nfp_cpp_model_set(cpp, model);
+ uint32_t reg;
+ int err;
- /* The PL's PluDeviceID revision code is authoratative */
- model &= ~0xff;
- if (nfp_xpb_readl(cpp, NFP_XPB_DEVICE(1, 1, 16) +
- NFP_PL_DEVICE_ID, &tmp))
- return 0;
+ err = nfp_xpb_readl(cpp, NFP_XPB_DEVICE(1, 1, 16) + NFP_PL_DEVICE_ID,
+ ®);
+ if (err < 0)
+ return err;
- model |= (NFP_PL_DEVICE_ID_MASK & tmp) - 0x10;
- }
+ *model = reg & NFP_PL_DEVICE_MODEL_MASK;
+ if (*model & NFP_PL_DEVICE_ID_MASK)
+ *model -= 0x10;
- return model;
+ return 0;
}
/*