Lines Matching refs:bpf
27 struct nfp_app_bpf *bpf = nn->app->priv; in nfp_net_ebpf_capable() local
30 bpf->abi_version && in nfp_net_ebpf_capable()
31 nn_readb(nn, NFP_NET_CFG_BPF_ABI) == bpf->abi_version; in nfp_net_ebpf_capable()
206 nfp_bpf_parse_cap_adjust_head(struct nfp_app_bpf *bpf, void __iomem *value, in nfp_bpf_parse_cap_adjust_head() argument
210 struct nfp_cpp *cpp = bpf->app->pf->cpp; in nfp_bpf_parse_cap_adjust_head()
217 bpf->adjust_head.flags = readl(&cap->flags); in nfp_bpf_parse_cap_adjust_head()
218 bpf->adjust_head.off_min = readl(&cap->off_min); in nfp_bpf_parse_cap_adjust_head()
219 bpf->adjust_head.off_max = readl(&cap->off_max); in nfp_bpf_parse_cap_adjust_head()
220 bpf->adjust_head.guaranteed_sub = readl(&cap->guaranteed_sub); in nfp_bpf_parse_cap_adjust_head()
221 bpf->adjust_head.guaranteed_add = readl(&cap->guaranteed_add); in nfp_bpf_parse_cap_adjust_head()
223 if (bpf->adjust_head.off_min > bpf->adjust_head.off_max) { in nfp_bpf_parse_cap_adjust_head()
227 if (!FIELD_FIT(UR_REG_IMM_MAX, bpf->adjust_head.off_min) || in nfp_bpf_parse_cap_adjust_head()
228 !FIELD_FIT(UR_REG_IMM_MAX, bpf->adjust_head.off_max)) { in nfp_bpf_parse_cap_adjust_head()
230 memset(&bpf->adjust_head, 0, sizeof(bpf->adjust_head)); in nfp_bpf_parse_cap_adjust_head()
238 nfp_bpf_parse_cap_func(struct nfp_app_bpf *bpf, void __iomem *value, u32 length) in nfp_bpf_parse_cap_func() argument
243 nfp_err(bpf->app->cpp, "truncated function TLV: %d\n", length); in nfp_bpf_parse_cap_func()
249 bpf->helpers.map_lookup = readl(&cap->func_addr); in nfp_bpf_parse_cap_func()
252 bpf->helpers.map_update = readl(&cap->func_addr); in nfp_bpf_parse_cap_func()
255 bpf->helpers.map_delete = readl(&cap->func_addr); in nfp_bpf_parse_cap_func()
258 bpf->helpers.perf_event_output = readl(&cap->func_addr); in nfp_bpf_parse_cap_func()
266 nfp_bpf_parse_cap_maps(struct nfp_app_bpf *bpf, void __iomem *value, u32 length) in nfp_bpf_parse_cap_maps() argument
271 nfp_err(bpf->app->cpp, "truncated maps TLV: %d\n", length); in nfp_bpf_parse_cap_maps()
275 bpf->maps.types = readl(&cap->types); in nfp_bpf_parse_cap_maps()
276 bpf->maps.max_maps = readl(&cap->max_maps); in nfp_bpf_parse_cap_maps()
277 bpf->maps.max_elems = readl(&cap->max_elems); in nfp_bpf_parse_cap_maps()
278 bpf->maps.max_key_sz = readl(&cap->max_key_sz); in nfp_bpf_parse_cap_maps()
279 bpf->maps.max_val_sz = readl(&cap->max_val_sz); in nfp_bpf_parse_cap_maps()
280 bpf->maps.max_elem_sz = readl(&cap->max_elem_sz); in nfp_bpf_parse_cap_maps()
286 nfp_bpf_parse_cap_random(struct nfp_app_bpf *bpf, void __iomem *value, in nfp_bpf_parse_cap_random() argument
289 bpf->pseudo_random = true; in nfp_bpf_parse_cap_random()
294 nfp_bpf_parse_cap_qsel(struct nfp_app_bpf *bpf, void __iomem *value, u32 length) in nfp_bpf_parse_cap_qsel() argument
296 bpf->queue_select = true; in nfp_bpf_parse_cap_qsel()
301 nfp_bpf_parse_cap_adjust_tail(struct nfp_app_bpf *bpf, void __iomem *value, in nfp_bpf_parse_cap_adjust_tail() argument
304 bpf->adjust_tail = true; in nfp_bpf_parse_cap_adjust_tail()
309 nfp_bpf_parse_cap_cmsg_multi_ent(struct nfp_app_bpf *bpf, void __iomem *value, in nfp_bpf_parse_cap_cmsg_multi_ent() argument
312 bpf->cmsg_multi_ent = true; in nfp_bpf_parse_cap_cmsg_multi_ent()
317 nfp_bpf_parse_cap_abi_version(struct nfp_app_bpf *bpf, void __iomem *value, in nfp_bpf_parse_cap_abi_version() argument
321 nfp_err(bpf->app->cpp, "truncated ABI version TLV: %d\n", in nfp_bpf_parse_cap_abi_version()
326 bpf->abi_version = readl(value); in nfp_bpf_parse_cap_abi_version()
327 if (bpf->abi_version < 2 || bpf->abi_version > 3) { in nfp_bpf_parse_cap_abi_version()
328 nfp_warn(bpf->app->cpp, "unsupported BPF ABI version: %d\n", in nfp_bpf_parse_cap_abi_version()
329 bpf->abi_version); in nfp_bpf_parse_cap_abi_version()
330 bpf->abi_version = 0; in nfp_bpf_parse_cap_abi_version()
418 static void nfp_bpf_init_capabilities(struct nfp_app_bpf *bpf) in nfp_bpf_init_capabilities() argument
420 bpf->abi_version = 2; /* Original BPF ABI version */ in nfp_bpf_init_capabilities()
425 struct nfp_app_bpf *bpf = app->priv; in nfp_bpf_ndo_init() local
427 return bpf_offload_dev_netdev_register(bpf->bpf_dev, netdev); in nfp_bpf_ndo_init()
432 struct nfp_app_bpf *bpf = app->priv; in nfp_bpf_ndo_uninit() local
434 bpf_offload_dev_netdev_unregister(bpf->bpf_dev, netdev); in nfp_bpf_ndo_uninit()
439 struct nfp_app_bpf *bpf = app->priv; in nfp_bpf_start() local
441 if (app->ctrl->dp.mtu < nfp_bpf_ctrl_cmsg_min_mtu(bpf)) { in nfp_bpf_start()
442 nfp_err(bpf->app->cpp, in nfp_bpf_start()
444 app->ctrl->dp.mtu, nfp_bpf_ctrl_cmsg_min_mtu(bpf)); in nfp_bpf_start()
448 if (bpf->cmsg_multi_ent) in nfp_bpf_start()
449 bpf->cmsg_cache_cnt = nfp_bpf_ctrl_cmsg_cache_cnt(bpf); in nfp_bpf_start()
451 bpf->cmsg_cache_cnt = 1; in nfp_bpf_start()
458 struct nfp_app_bpf *bpf; in nfp_bpf_init() local
461 bpf = kzalloc(sizeof(*bpf), GFP_KERNEL); in nfp_bpf_init()
462 if (!bpf) in nfp_bpf_init()
464 bpf->app = app; in nfp_bpf_init()
465 app->priv = bpf; in nfp_bpf_init()
467 INIT_LIST_HEAD(&bpf->map_list); in nfp_bpf_init()
469 err = nfp_ccm_init(&bpf->ccm, app); in nfp_bpf_init()
473 err = rhashtable_init(&bpf->maps_neutral, &nfp_bpf_maps_neutral_params); in nfp_bpf_init()
477 nfp_bpf_init_capabilities(bpf); in nfp_bpf_init()
483 if (bpf->abi_version < 3) { in nfp_bpf_init()
484 bpf->cmsg_key_sz = CMSG_MAP_KEY_LW * 4; in nfp_bpf_init()
485 bpf->cmsg_val_sz = CMSG_MAP_VALUE_LW * 4; in nfp_bpf_init()
487 bpf->cmsg_key_sz = bpf->maps.max_key_sz; in nfp_bpf_init()
488 bpf->cmsg_val_sz = bpf->maps.max_val_sz; in nfp_bpf_init()
489 app->ctrl_mtu = nfp_bpf_ctrl_cmsg_mtu(bpf); in nfp_bpf_init()
492 bpf->bpf_dev = bpf_offload_dev_create(&nfp_bpf_dev_ops, bpf); in nfp_bpf_init()
493 err = PTR_ERR_OR_ZERO(bpf->bpf_dev); in nfp_bpf_init()
500 rhashtable_destroy(&bpf->maps_neutral); in nfp_bpf_init()
502 nfp_ccm_clean(&bpf->ccm); in nfp_bpf_init()
504 kfree(bpf); in nfp_bpf_init()
510 struct nfp_app_bpf *bpf = app->priv; in nfp_bpf_clean() local
512 bpf_offload_dev_destroy(bpf->bpf_dev); in nfp_bpf_clean()
513 nfp_ccm_clean(&bpf->ccm); in nfp_bpf_clean()
514 WARN_ON(!list_empty(&bpf->map_list)); in nfp_bpf_clean()
515 WARN_ON(bpf->maps_in_use || bpf->map_elems_in_use); in nfp_bpf_clean()
516 rhashtable_free_and_destroy(&bpf->maps_neutral, in nfp_bpf_clean()
518 kfree(bpf); in nfp_bpf_clean()
545 .bpf = nfp_ndo_bpf,