/** * nfp_reset_soft() - Perform a soft reset of the NFP * @nfp: NFP Device handle * * Return: 0, or -ERRNO */ int nfp_reset_soft(struct nfp_device *nfp) { struct nfp_cpp *cpp = nfp_device_cpp(nfp); struct nfp_cpp_area *area; struct nfp_resource *res; u32 model; int i, err; model = nfp_cpp_model(cpp); /* Claim the nfp.nffw resource page */ res = nfp_resource_acquire(nfp, NFP_RESOURCE_NFP_NFFW); if (IS_ERR(res)) { nfp_err(nfp, "Can't aquire %s resource\n", NFP_RESOURCE_NFP_NFFW); return -EBUSY; } if (NFP_CPP_MODEL_IS_3200(model)) err = nfp3200_reset_soft(nfp); else if (NFP_CPP_MODEL_IS_6000(model)) err = nfp6000_reset_soft(nfp); else err = -EINVAL; if (err < 0) goto exit; /* Clear all NFP NFFW page */ area = nfp_cpp_area_alloc_acquire(cpp, nfp_resource_cpp_id(res), nfp_resource_address(res), nfp_resource_size(res)); if (!area) { nfp_err(nfp, "Can't acquire area for %s resource\n", NFP_RESOURCE_NFP_NFFW); err = -ENOMEM; goto exit; } for (i = 0; i < nfp_resource_size(res); i += 8) { err = nfp_cpp_area_writeq(area, i, 0); if (err < 0) break; } nfp_cpp_area_release_free(area); if (err < 0) { nfp_err(nfp, "Can't erase area of %s resource\n", NFP_RESOURCE_NFP_NFFW); goto exit; } err = 0; exit: nfp_resource_release(res); return err; }
static int bpe_lookup(struct nfp_device *nfp, int nbi, u32 *bpe, int bpe_max) { int err, i; const struct nfp_rtsym *sym; u32 id, tmp; u32 __iomem *ptr; struct nfp_cpp_area *area; char buff[] = "nbi0_dma_bpe_credits"; buff[3] += nbi; sym = nfp_rtsym_lookup(nfp, buff); if (!sym) { nfp_info(nfp, "%s: Symbol not present\n", buff); return 0; } id = NFP_CPP_ISLAND_ID(sym->target, NFP_CPP_ACTION_RW, 0, sym->domain); area = nfp_cpp_area_alloc_acquire(nfp_device_cpp(nfp), id, sym->addr, sym->size); if (IS_ERR_OR_NULL(area)) { nfp_err(nfp, "%s: Can't acquire area\n", buff); return area ? PTR_ERR(area) : -ENOMEM; } ptr = nfp_cpp_area_iomem(area); if (IS_ERR_OR_NULL(ptr)) { nfp_err(nfp, "%s: Can't map area\n", buff); err = ptr ? PTR_ERR(ptr) : -ENOMEM; goto exit; } tmp = readl(ptr++); if (!BPECFG_MAGIC_CHECK(tmp)) { nfp_err(nfp, "%s: Magic value (0x%08x) unrecognized\n", buff, tmp); err = -EINVAL; goto exit; } if (BPECFG_MAGIC_COUNT(tmp) > bpe_max) { nfp_err(nfp, "%s: Magic count (%d) too large (> %d)\n", buff, BPECFG_MAGIC_COUNT(tmp), bpe_max); err = -EINVAL; goto exit; } for (i = 0; i < bpe_max; i++) bpe[i] = readl(ptr++); err = BPECFG_MAGIC_COUNT(tmp); exit: nfp_cpp_area_release_free(area); return err; }
static int nfp_bpf_parse_capabilities(struct nfp_app *app) { struct nfp_cpp *cpp = app->pf->cpp; struct nfp_cpp_area *area; u8 __iomem *mem, *start; mem = nfp_rtsym_map(app->pf->rtbl, "_abi_bpf_capabilities", "bpf.cap", 8, &area); if (IS_ERR(mem)) return PTR_ERR(mem) == -ENOENT ? 0 : PTR_ERR(mem); start = mem; while (mem - start + 8 <= nfp_cpp_area_size(area)) { u8 __iomem *value; u32 type, length; type = readl(mem); length = readl(mem + 4); value = mem + 8; mem += 8 + length; if (mem - start > nfp_cpp_area_size(area)) goto err_release_free; switch (type) { case NFP_BPF_CAP_TYPE_FUNC: if (nfp_bpf_parse_cap_func(app->priv, value, length)) goto err_release_free; break; case NFP_BPF_CAP_TYPE_ADJUST_HEAD: if (nfp_bpf_parse_cap_adjust_head(app->priv, value, length)) goto err_release_free; break; case NFP_BPF_CAP_TYPE_MAPS: if (nfp_bpf_parse_cap_maps(app->priv, value, length)) goto err_release_free; break; case NFP_BPF_CAP_TYPE_RANDOM: if (nfp_bpf_parse_cap_random(app->priv, value, length)) goto err_release_free; break; case NFP_BPF_CAP_TYPE_QUEUE_SELECT: if (nfp_bpf_parse_cap_qsel(app->priv, value, length)) goto err_release_free; break; case NFP_BPF_CAP_TYPE_ADJUST_TAIL: if (nfp_bpf_parse_cap_adjust_tail(app->priv, value, length)) goto err_release_free; break; case NFP_BPF_CAP_TYPE_ABI_VERSION: if (nfp_bpf_parse_cap_abi_version(app->priv, value, length)) goto err_release_free; break; default: nfp_dbg(cpp, "unknown BPF capability: %d\n", type); break; } } if (mem - start != nfp_cpp_area_size(area)) { nfp_err(cpp, "BPF capabilities left after parsing, parsed:%zd total length:%zu\n", mem - start, nfp_cpp_area_size(area)); goto err_release_free; } nfp_cpp_area_release_free(area); return 0; err_release_free: nfp_err(cpp, "invalid BPF capabilities at offset:%zd\n", mem - start); nfp_cpp_area_release_free(area); return -EINVAL; }