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