162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 262306a36Sopenharmony_ci/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _NFP_APP_H 562306a36Sopenharmony_ci#define _NFP_APP_H 1 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <net/devlink.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <trace/events/devlink.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "nfp_net_repr.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define NFP_APP_CTRL_MTU_MAX U32_MAX 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistruct bpf_prog; 1662306a36Sopenharmony_cistruct net_device; 1762306a36Sopenharmony_cistruct netdev_bpf; 1862306a36Sopenharmony_cistruct netlink_ext_ack; 1962306a36Sopenharmony_cistruct pci_dev; 2062306a36Sopenharmony_cistruct sk_buff; 2162306a36Sopenharmony_cistruct nfp_app; 2262306a36Sopenharmony_cistruct nfp_cpp; 2362306a36Sopenharmony_cistruct nfp_pf; 2462306a36Sopenharmony_cistruct nfp_repr; 2562306a36Sopenharmony_cistruct nfp_net; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum nfp_app_id { 2862306a36Sopenharmony_ci NFP_APP_CORE_NIC = 0x1, 2962306a36Sopenharmony_ci NFP_APP_BPF_NIC = 0x2, 3062306a36Sopenharmony_ci NFP_APP_FLOWER_NIC = 0x3, 3162306a36Sopenharmony_ci NFP_APP_ACTIVE_BUFFER_MGMT_NIC = 0x4, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciextern const struct nfp_app_type app_nic; 3562306a36Sopenharmony_ciextern const struct nfp_app_type app_bpf; 3662306a36Sopenharmony_ciextern const struct nfp_app_type app_flower; 3762306a36Sopenharmony_ciextern const struct nfp_app_type app_abm; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/** 4062306a36Sopenharmony_ci * struct nfp_app_type - application definition 4162306a36Sopenharmony_ci * @id: application ID 4262306a36Sopenharmony_ci * @name: application name 4362306a36Sopenharmony_ci * @ctrl_cap_mask: ctrl vNIC capability mask, allows disabling features like 4462306a36Sopenharmony_ci * IRQMOD which are on by default but counter-productive for 4562306a36Sopenharmony_ci * control messages which are often latency-sensitive 4662306a36Sopenharmony_ci * @ctrl_has_meta: control messages have prepend of type:5/port:CTRL 4762306a36Sopenharmony_ci * 4862306a36Sopenharmony_ci * Callbacks 4962306a36Sopenharmony_ci * @init: perform basic app checks and init 5062306a36Sopenharmony_ci * @clean: clean app state 5162306a36Sopenharmony_ci * @extra_cap: extra capabilities string 5262306a36Sopenharmony_ci * @ndo_init: vNIC and repr netdev .ndo_init 5362306a36Sopenharmony_ci * @ndo_uninit: vNIC and repr netdev .ndo_unint 5462306a36Sopenharmony_ci * @vnic_alloc: allocate vNICs (assign port types, etc.) 5562306a36Sopenharmony_ci * @vnic_free: free up app's vNIC state 5662306a36Sopenharmony_ci * @vnic_init: vNIC netdev was registered 5762306a36Sopenharmony_ci * @vnic_clean: vNIC netdev about to be unregistered 5862306a36Sopenharmony_ci * @repr_init: representor about to be registered 5962306a36Sopenharmony_ci * @repr_preclean: representor about to unregistered, executed before app 6062306a36Sopenharmony_ci * reference to the it is removed 6162306a36Sopenharmony_ci * @repr_clean: representor about to be unregistered 6262306a36Sopenharmony_ci * @repr_open: representor netdev open callback 6362306a36Sopenharmony_ci * @repr_stop: representor netdev stop callback 6462306a36Sopenharmony_ci * @check_mtu: MTU change request on a netdev (verify it is valid) 6562306a36Sopenharmony_ci * @repr_change_mtu: MTU change request on repr (make and verify change) 6662306a36Sopenharmony_ci * @port_get_stats: get extra ethtool statistics for a port 6762306a36Sopenharmony_ci * @port_get_stats_count: get count of extra statistics for a port 6862306a36Sopenharmony_ci * @port_get_stats_strings: get strings for extra statistics 6962306a36Sopenharmony_ci * @start: start application logic 7062306a36Sopenharmony_ci * @stop: stop application logic 7162306a36Sopenharmony_ci * @netdev_event: Netdevice notifier event 7262306a36Sopenharmony_ci * @ctrl_msg_rx: control message handler 7362306a36Sopenharmony_ci * @ctrl_msg_rx_raw: handler for control messages from data queues 7462306a36Sopenharmony_ci * @setup_tc: setup TC ndo 7562306a36Sopenharmony_ci * @bpf: BPF ndo offload-related calls 7662306a36Sopenharmony_ci * @xdp_offload: offload an XDP program 7762306a36Sopenharmony_ci * @eswitch_mode_get: get SR-IOV eswitch mode 7862306a36Sopenharmony_ci * @eswitch_mode_set: set SR-IOV eswitch mode 7962306a36Sopenharmony_ci * @sriov_enable: app-specific sriov initialisation 8062306a36Sopenharmony_ci * @sriov_disable: app-specific sriov clean-up 8162306a36Sopenharmony_ci * @dev_get: get representor or internal port representing netdev 8262306a36Sopenharmony_ci */ 8362306a36Sopenharmony_cistruct nfp_app_type { 8462306a36Sopenharmony_ci enum nfp_app_id id; 8562306a36Sopenharmony_ci const char *name; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci u32 ctrl_cap_mask; 8862306a36Sopenharmony_ci bool ctrl_has_meta; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci int (*init)(struct nfp_app *app); 9162306a36Sopenharmony_ci void (*clean)(struct nfp_app *app); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci const char *(*extra_cap)(struct nfp_app *app, struct nfp_net *nn); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci int (*ndo_init)(struct nfp_app *app, struct net_device *netdev); 9662306a36Sopenharmony_ci void (*ndo_uninit)(struct nfp_app *app, struct net_device *netdev); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci int (*vnic_alloc)(struct nfp_app *app, struct nfp_net *nn, 9962306a36Sopenharmony_ci unsigned int id); 10062306a36Sopenharmony_ci void (*vnic_free)(struct nfp_app *app, struct nfp_net *nn); 10162306a36Sopenharmony_ci int (*vnic_init)(struct nfp_app *app, struct nfp_net *nn); 10262306a36Sopenharmony_ci void (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci int (*repr_init)(struct nfp_app *app, struct net_device *netdev); 10562306a36Sopenharmony_ci void (*repr_preclean)(struct nfp_app *app, struct net_device *netdev); 10662306a36Sopenharmony_ci void (*repr_clean)(struct nfp_app *app, struct net_device *netdev); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr); 10962306a36Sopenharmony_ci int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci int (*check_mtu)(struct nfp_app *app, struct net_device *netdev, 11262306a36Sopenharmony_ci int new_mtu); 11362306a36Sopenharmony_ci int (*repr_change_mtu)(struct nfp_app *app, struct net_device *netdev, 11462306a36Sopenharmony_ci int new_mtu); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci u64 *(*port_get_stats)(struct nfp_app *app, 11762306a36Sopenharmony_ci struct nfp_port *port, u64 *data); 11862306a36Sopenharmony_ci int (*port_get_stats_count)(struct nfp_app *app, struct nfp_port *port); 11962306a36Sopenharmony_ci u8 *(*port_get_stats_strings)(struct nfp_app *app, 12062306a36Sopenharmony_ci struct nfp_port *port, u8 *data); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci int (*start)(struct nfp_app *app); 12362306a36Sopenharmony_ci void (*stop)(struct nfp_app *app); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci int (*netdev_event)(struct nfp_app *app, struct net_device *netdev, 12662306a36Sopenharmony_ci unsigned long event, void *ptr); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci void (*ctrl_msg_rx)(struct nfp_app *app, struct sk_buff *skb); 12962306a36Sopenharmony_ci void (*ctrl_msg_rx_raw)(struct nfp_app *app, const void *data, 13062306a36Sopenharmony_ci unsigned int len); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci int (*setup_tc)(struct nfp_app *app, struct net_device *netdev, 13362306a36Sopenharmony_ci enum tc_setup_type type, void *type_data); 13462306a36Sopenharmony_ci int (*bpf)(struct nfp_app *app, struct nfp_net *nn, 13562306a36Sopenharmony_ci struct netdev_bpf *xdp); 13662306a36Sopenharmony_ci int (*xdp_offload)(struct nfp_app *app, struct nfp_net *nn, 13762306a36Sopenharmony_ci struct bpf_prog *prog, 13862306a36Sopenharmony_ci struct netlink_ext_ack *extack); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci int (*sriov_enable)(struct nfp_app *app, int num_vfs); 14162306a36Sopenharmony_ci void (*sriov_disable)(struct nfp_app *app); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci enum devlink_eswitch_mode (*eswitch_mode_get)(struct nfp_app *app); 14462306a36Sopenharmony_ci int (*eswitch_mode_set)(struct nfp_app *app, u16 mode); 14562306a36Sopenharmony_ci struct net_device *(*dev_get)(struct nfp_app *app, u32 id, 14662306a36Sopenharmony_ci bool *redir_egress); 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/** 15062306a36Sopenharmony_ci * struct nfp_app - NFP application container 15162306a36Sopenharmony_ci * @pdev: backpointer to PCI device 15262306a36Sopenharmony_ci * @pf: backpointer to NFP PF structure 15362306a36Sopenharmony_ci * @cpp: pointer to the CPP handle 15462306a36Sopenharmony_ci * @ctrl: pointer to ctrl vNIC struct 15562306a36Sopenharmony_ci * @reprs: array of pointers to representors 15662306a36Sopenharmony_ci * @type: pointer to const application ops and info 15762306a36Sopenharmony_ci * @ctrl_mtu: MTU to set on the control vNIC (set in .init()) 15862306a36Sopenharmony_ci * @netdev_nb: Netdevice notifier block 15962306a36Sopenharmony_ci * @priv: app-specific priv data 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_cistruct nfp_app { 16262306a36Sopenharmony_ci struct pci_dev *pdev; 16362306a36Sopenharmony_ci struct nfp_pf *pf; 16462306a36Sopenharmony_ci struct nfp_cpp *cpp; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci struct nfp_net *ctrl; 16762306a36Sopenharmony_ci struct nfp_reprs __rcu *reprs[NFP_REPR_TYPE_MAX + 1]; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci const struct nfp_app_type *type; 17062306a36Sopenharmony_ci unsigned int ctrl_mtu; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci struct notifier_block netdev_nb; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci void *priv; 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistatic inline void assert_nfp_app_locked(struct nfp_app *app) 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci devl_assert_locked(priv_to_devlink(app->pf)); 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic inline bool nfp_app_is_locked(struct nfp_app *app) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci return devl_lock_is_held(priv_to_devlink(app->pf)); 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_civoid nfp_check_rhashtable_empty(void *ptr, void *arg); 18862306a36Sopenharmony_cibool __nfp_ctrl_tx(struct nfp_net *nn, struct sk_buff *skb); 18962306a36Sopenharmony_cibool nfp_ctrl_tx(struct nfp_net *nn, struct sk_buff *skb); 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic inline int nfp_app_init(struct nfp_app *app) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci if (!app->type->init) 19462306a36Sopenharmony_ci return 0; 19562306a36Sopenharmony_ci return app->type->init(app); 19662306a36Sopenharmony_ci} 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistatic inline void nfp_app_clean(struct nfp_app *app) 19962306a36Sopenharmony_ci{ 20062306a36Sopenharmony_ci if (app->type->clean) 20162306a36Sopenharmony_ci app->type->clean(app); 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ciint nfp_app_ndo_init(struct net_device *netdev); 20562306a36Sopenharmony_civoid nfp_app_ndo_uninit(struct net_device *netdev); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistatic inline int nfp_app_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, 20862306a36Sopenharmony_ci unsigned int id) 20962306a36Sopenharmony_ci{ 21062306a36Sopenharmony_ci return app->type->vnic_alloc(app, nn, id); 21162306a36Sopenharmony_ci} 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistatic inline void nfp_app_vnic_free(struct nfp_app *app, struct nfp_net *nn) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci if (app->type->vnic_free) 21662306a36Sopenharmony_ci app->type->vnic_free(app, nn); 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistatic inline int nfp_app_vnic_init(struct nfp_app *app, struct nfp_net *nn) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci if (!app->type->vnic_init) 22262306a36Sopenharmony_ci return 0; 22362306a36Sopenharmony_ci return app->type->vnic_init(app, nn); 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic inline void nfp_app_vnic_clean(struct nfp_app *app, struct nfp_net *nn) 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci if (app->type->vnic_clean) 22962306a36Sopenharmony_ci app->type->vnic_clean(app, nn); 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic inline int nfp_app_repr_open(struct nfp_app *app, struct nfp_repr *repr) 23362306a36Sopenharmony_ci{ 23462306a36Sopenharmony_ci if (!app->type->repr_open) 23562306a36Sopenharmony_ci return -EINVAL; 23662306a36Sopenharmony_ci return app->type->repr_open(app, repr); 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistatic inline int nfp_app_repr_stop(struct nfp_app *app, struct nfp_repr *repr) 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci if (!app->type->repr_stop) 24262306a36Sopenharmony_ci return -EINVAL; 24362306a36Sopenharmony_ci return app->type->repr_stop(app, repr); 24462306a36Sopenharmony_ci} 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistatic inline int 24762306a36Sopenharmony_cinfp_app_repr_init(struct nfp_app *app, struct net_device *netdev) 24862306a36Sopenharmony_ci{ 24962306a36Sopenharmony_ci if (!app->type->repr_init) 25062306a36Sopenharmony_ci return 0; 25162306a36Sopenharmony_ci return app->type->repr_init(app, netdev); 25262306a36Sopenharmony_ci} 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cistatic inline void 25562306a36Sopenharmony_cinfp_app_repr_preclean(struct nfp_app *app, struct net_device *netdev) 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci if (app->type->repr_preclean) 25862306a36Sopenharmony_ci app->type->repr_preclean(app, netdev); 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic inline void 26262306a36Sopenharmony_cinfp_app_repr_clean(struct nfp_app *app, struct net_device *netdev) 26362306a36Sopenharmony_ci{ 26462306a36Sopenharmony_ci if (app->type->repr_clean) 26562306a36Sopenharmony_ci app->type->repr_clean(app, netdev); 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic inline int 26962306a36Sopenharmony_cinfp_app_check_mtu(struct nfp_app *app, struct net_device *netdev, int new_mtu) 27062306a36Sopenharmony_ci{ 27162306a36Sopenharmony_ci if (!app || !app->type->check_mtu) 27262306a36Sopenharmony_ci return 0; 27362306a36Sopenharmony_ci return app->type->check_mtu(app, netdev, new_mtu); 27462306a36Sopenharmony_ci} 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistatic inline int 27762306a36Sopenharmony_cinfp_app_repr_change_mtu(struct nfp_app *app, struct net_device *netdev, 27862306a36Sopenharmony_ci int new_mtu) 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci if (!app || !app->type->repr_change_mtu) 28162306a36Sopenharmony_ci return 0; 28262306a36Sopenharmony_ci return app->type->repr_change_mtu(app, netdev, new_mtu); 28362306a36Sopenharmony_ci} 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic inline const char *nfp_app_name(struct nfp_app *app) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci if (!app) 28862306a36Sopenharmony_ci return ""; 28962306a36Sopenharmony_ci return app->type->name; 29062306a36Sopenharmony_ci} 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic inline bool nfp_app_needs_ctrl_vnic(struct nfp_app *app) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci return app && app->type->ctrl_msg_rx; 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistatic inline bool nfp_app_ctrl_has_meta(struct nfp_app *app) 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci return app->type->ctrl_has_meta; 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic inline bool nfp_app_ctrl_uses_data_vnics(struct nfp_app *app) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci return app && app->type->ctrl_msg_rx_raw; 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cistatic inline const char *nfp_app_extra_cap(struct nfp_app *app, 30862306a36Sopenharmony_ci struct nfp_net *nn) 30962306a36Sopenharmony_ci{ 31062306a36Sopenharmony_ci if (!app || !app->type->extra_cap) 31162306a36Sopenharmony_ci return ""; 31262306a36Sopenharmony_ci return app->type->extra_cap(app, nn); 31362306a36Sopenharmony_ci} 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistatic inline bool nfp_app_has_tc(struct nfp_app *app) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci return app && app->type->setup_tc; 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic inline int nfp_app_setup_tc(struct nfp_app *app, 32162306a36Sopenharmony_ci struct net_device *netdev, 32262306a36Sopenharmony_ci enum tc_setup_type type, void *type_data) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci if (!app || !app->type->setup_tc) 32562306a36Sopenharmony_ci return -EOPNOTSUPP; 32662306a36Sopenharmony_ci return app->type->setup_tc(app, netdev, type, type_data); 32762306a36Sopenharmony_ci} 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic inline int nfp_app_bpf(struct nfp_app *app, struct nfp_net *nn, 33062306a36Sopenharmony_ci struct netdev_bpf *bpf) 33162306a36Sopenharmony_ci{ 33262306a36Sopenharmony_ci if (!app || !app->type->bpf) 33362306a36Sopenharmony_ci return -EINVAL; 33462306a36Sopenharmony_ci return app->type->bpf(app, nn, bpf); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic inline int nfp_app_xdp_offload(struct nfp_app *app, struct nfp_net *nn, 33862306a36Sopenharmony_ci struct bpf_prog *prog, 33962306a36Sopenharmony_ci struct netlink_ext_ack *extack) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci if (!app || !app->type->xdp_offload) 34262306a36Sopenharmony_ci return -EOPNOTSUPP; 34362306a36Sopenharmony_ci return app->type->xdp_offload(app, nn, prog, extack); 34462306a36Sopenharmony_ci} 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic inline bool __nfp_app_ctrl_tx(struct nfp_app *app, struct sk_buff *skb) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci trace_devlink_hwmsg(priv_to_devlink(app->pf), false, 0, 34962306a36Sopenharmony_ci skb->data, skb->len); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci return __nfp_ctrl_tx(app->ctrl, skb); 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic inline bool nfp_app_ctrl_tx(struct nfp_app *app, struct sk_buff *skb) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci trace_devlink_hwmsg(priv_to_devlink(app->pf), false, 0, 35762306a36Sopenharmony_ci skb->data, skb->len); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci return nfp_ctrl_tx(app->ctrl, skb); 36062306a36Sopenharmony_ci} 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic inline void nfp_app_ctrl_rx(struct nfp_app *app, struct sk_buff *skb) 36362306a36Sopenharmony_ci{ 36462306a36Sopenharmony_ci trace_devlink_hwmsg(priv_to_devlink(app->pf), true, 0, 36562306a36Sopenharmony_ci skb->data, skb->len); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci app->type->ctrl_msg_rx(app, skb); 36862306a36Sopenharmony_ci} 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_cistatic inline void 37162306a36Sopenharmony_cinfp_app_ctrl_rx_raw(struct nfp_app *app, const void *data, unsigned int len) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci if (!app || !app->type->ctrl_msg_rx_raw) 37462306a36Sopenharmony_ci return; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci trace_devlink_hwmsg(priv_to_devlink(app->pf), true, 0, data, len); 37762306a36Sopenharmony_ci app->type->ctrl_msg_rx_raw(app, data, len); 37862306a36Sopenharmony_ci} 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cistatic inline int nfp_app_eswitch_mode_get(struct nfp_app *app, u16 *mode) 38162306a36Sopenharmony_ci{ 38262306a36Sopenharmony_ci if (!app->type->eswitch_mode_get) 38362306a36Sopenharmony_ci return -EOPNOTSUPP; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci *mode = app->type->eswitch_mode_get(app); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci return 0; 38862306a36Sopenharmony_ci} 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cistatic inline int nfp_app_eswitch_mode_set(struct nfp_app *app, u16 mode) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci if (!app->type->eswitch_mode_set) 39362306a36Sopenharmony_ci return -EOPNOTSUPP; 39462306a36Sopenharmony_ci return app->type->eswitch_mode_set(app, mode); 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic inline int nfp_app_sriov_enable(struct nfp_app *app, int num_vfs) 39862306a36Sopenharmony_ci{ 39962306a36Sopenharmony_ci if (!app || !app->type->sriov_enable) 40062306a36Sopenharmony_ci return -EOPNOTSUPP; 40162306a36Sopenharmony_ci return app->type->sriov_enable(app, num_vfs); 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistatic inline void nfp_app_sriov_disable(struct nfp_app *app) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci if (app && app->type->sriov_disable) 40762306a36Sopenharmony_ci app->type->sriov_disable(app); 40862306a36Sopenharmony_ci} 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cistatic inline 41162306a36Sopenharmony_cistruct net_device *nfp_app_dev_get(struct nfp_app *app, u32 id, 41262306a36Sopenharmony_ci bool *redir_egress) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci if (unlikely(!app || !app->type->dev_get)) 41562306a36Sopenharmony_ci return NULL; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci return app->type->dev_get(app, id, redir_egress); 41862306a36Sopenharmony_ci} 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistruct nfp_app *nfp_app_from_netdev(struct net_device *netdev); 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ciu64 *nfp_app_port_get_stats(struct nfp_port *port, u64 *data); 42362306a36Sopenharmony_ciint nfp_app_port_get_stats_count(struct nfp_port *port); 42462306a36Sopenharmony_ciu8 *nfp_app_port_get_stats_strings(struct nfp_port *port, u8 *data); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistruct nfp_reprs * 42762306a36Sopenharmony_cinfp_reprs_get_locked(struct nfp_app *app, enum nfp_repr_type type); 42862306a36Sopenharmony_cistruct nfp_reprs * 42962306a36Sopenharmony_cinfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type, 43062306a36Sopenharmony_ci struct nfp_reprs *reprs); 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ciconst char *nfp_app_mip_name(struct nfp_app *app); 43362306a36Sopenharmony_cistruct sk_buff * 43462306a36Sopenharmony_cinfp_app_ctrl_msg_alloc(struct nfp_app *app, unsigned int size, gfp_t priority); 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_cistruct nfp_app *nfp_app_alloc(struct nfp_pf *pf, enum nfp_app_id id); 43762306a36Sopenharmony_civoid nfp_app_free(struct nfp_app *app); 43862306a36Sopenharmony_ciint nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl); 43962306a36Sopenharmony_civoid nfp_app_stop(struct nfp_app *app); 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci/* Callbacks shared between apps */ 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ciint nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, 44462306a36Sopenharmony_ci unsigned int id); 44562306a36Sopenharmony_ciint nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app, 44662306a36Sopenharmony_ci struct nfp_net *nn, unsigned int id); 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci#endif 449