162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright(c) 2013 - 2018 Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _IAVF_CLIENT_H_
562306a36Sopenharmony_ci#define _IAVF_CLIENT_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define IAVF_CLIENT_STR_LENGTH 10
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* Client interface version should be updated anytime there is a change in the
1062306a36Sopenharmony_ci * existing APIs or data structures.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci#define IAVF_CLIENT_VERSION_MAJOR 0
1362306a36Sopenharmony_ci#define IAVF_CLIENT_VERSION_MINOR 01
1462306a36Sopenharmony_ci#define IAVF_CLIENT_VERSION_BUILD 00
1562306a36Sopenharmony_ci#define IAVF_CLIENT_VERSION_STR     \
1662306a36Sopenharmony_ci	__stringify(IAVF_CLIENT_VERSION_MAJOR) "." \
1762306a36Sopenharmony_ci	__stringify(IAVF_CLIENT_VERSION_MINOR) "." \
1862306a36Sopenharmony_ci	__stringify(IAVF_CLIENT_VERSION_BUILD)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct iavf_client_version {
2162306a36Sopenharmony_ci	u8 major;
2262306a36Sopenharmony_ci	u8 minor;
2362306a36Sopenharmony_ci	u8 build;
2462306a36Sopenharmony_ci	u8 rsvd;
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cienum iavf_client_state {
2862306a36Sopenharmony_ci	__IAVF_CLIENT_NULL,
2962306a36Sopenharmony_ci	__IAVF_CLIENT_REGISTERED
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cienum iavf_client_instance_state {
3362306a36Sopenharmony_ci	__IAVF_CLIENT_INSTANCE_NONE,
3462306a36Sopenharmony_ci	__IAVF_CLIENT_INSTANCE_OPENED,
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct iavf_ops;
3862306a36Sopenharmony_cistruct iavf_client;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* HW does not define a type value for AEQ; only for RX/TX and CEQ.
4162306a36Sopenharmony_ci * In order for us to keep the interface simple, SW will define a
4262306a36Sopenharmony_ci * unique type value for AEQ.
4362306a36Sopenharmony_ci */
4462306a36Sopenharmony_ci#define IAVF_QUEUE_TYPE_PE_AEQ	0x80
4562306a36Sopenharmony_ci#define IAVF_QUEUE_INVALID_IDX	0xFFFF
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct iavf_qv_info {
4862306a36Sopenharmony_ci	u32 v_idx; /* msix_vector */
4962306a36Sopenharmony_ci	u16 ceq_idx;
5062306a36Sopenharmony_ci	u16 aeq_idx;
5162306a36Sopenharmony_ci	u8 itr_idx;
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct iavf_qvlist_info {
5562306a36Sopenharmony_ci	u32 num_vectors;
5662306a36Sopenharmony_ci	struct iavf_qv_info qv_info[];
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define IAVF_CLIENT_MSIX_ALL 0xFFFFFFFF
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* set of LAN parameters useful for clients managed by LAN */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* Struct to hold per priority info */
6462306a36Sopenharmony_cistruct iavf_prio_qos_params {
6562306a36Sopenharmony_ci	u16 qs_handle; /* qs handle for prio */
6662306a36Sopenharmony_ci	u8 tc; /* TC mapped to prio */
6762306a36Sopenharmony_ci	u8 reserved;
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define IAVF_CLIENT_MAX_USER_PRIORITY	8
7162306a36Sopenharmony_ci/* Struct to hold Client QoS */
7262306a36Sopenharmony_cistruct iavf_qos_params {
7362306a36Sopenharmony_ci	struct iavf_prio_qos_params prio_qos[IAVF_CLIENT_MAX_USER_PRIORITY];
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistruct iavf_params {
7762306a36Sopenharmony_ci	struct iavf_qos_params qos;
7862306a36Sopenharmony_ci	u16 mtu;
7962306a36Sopenharmony_ci	u16 link_up; /* boolean */
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/* Structure to hold LAN device info for a client device */
8362306a36Sopenharmony_cistruct iavf_info {
8462306a36Sopenharmony_ci	struct iavf_client_version version;
8562306a36Sopenharmony_ci	u8 lanmac[6];
8662306a36Sopenharmony_ci	struct net_device *netdev;
8762306a36Sopenharmony_ci	struct pci_dev *pcidev;
8862306a36Sopenharmony_ci	u8 __iomem *hw_addr;
8962306a36Sopenharmony_ci	u8 fid;	/* function id, PF id or VF id */
9062306a36Sopenharmony_ci#define IAVF_CLIENT_FTYPE_PF 0
9162306a36Sopenharmony_ci#define IAVF_CLIENT_FTYPE_VF 1
9262306a36Sopenharmony_ci	u8 ftype; /* function type, PF or VF */
9362306a36Sopenharmony_ci	void *vf; /* cast to iavf_adapter */
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	/* All L2 params that could change during the life span of the device
9662306a36Sopenharmony_ci	 * and needs to be communicated to the client when they change
9762306a36Sopenharmony_ci	 */
9862306a36Sopenharmony_ci	struct iavf_params params;
9962306a36Sopenharmony_ci	struct iavf_ops *ops;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	u16 msix_count;	 /* number of msix vectors*/
10262306a36Sopenharmony_ci	/* Array down below will be dynamically allocated based on msix_count */
10362306a36Sopenharmony_ci	struct msix_entry *msix_entries;
10462306a36Sopenharmony_ci	u16 itr_index; /* Which ITR index the PE driver is suppose to use */
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistruct iavf_ops {
10862306a36Sopenharmony_ci	/* setup_q_vector_list enables queues with a particular vector */
10962306a36Sopenharmony_ci	int (*setup_qvlist)(struct iavf_info *ldev, struct iavf_client *client,
11062306a36Sopenharmony_ci			    struct iavf_qvlist_info *qv_info);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	u32 (*virtchnl_send)(struct iavf_info *ldev, struct iavf_client *client,
11362306a36Sopenharmony_ci			     u8 *msg, u16 len);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	/* If the PE Engine is unresponsive, RDMA driver can request a reset.*/
11662306a36Sopenharmony_ci	void (*request_reset)(struct iavf_info *ldev,
11762306a36Sopenharmony_ci			      struct iavf_client *client);
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct iavf_client_ops {
12162306a36Sopenharmony_ci	/* Should be called from register_client() or whenever the driver is
12262306a36Sopenharmony_ci	 * ready to create a specific client instance.
12362306a36Sopenharmony_ci	 */
12462306a36Sopenharmony_ci	int (*open)(struct iavf_info *ldev, struct iavf_client *client);
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	/* Should be closed when netdev is unavailable or when unregister
12762306a36Sopenharmony_ci	 * call comes in. If the close happens due to a reset, set the reset
12862306a36Sopenharmony_ci	 * bit to true.
12962306a36Sopenharmony_ci	 */
13062306a36Sopenharmony_ci	void (*close)(struct iavf_info *ldev, struct iavf_client *client,
13162306a36Sopenharmony_ci		      bool reset);
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	/* called when some l2 managed parameters changes - mss */
13462306a36Sopenharmony_ci	void (*l2_param_change)(struct iavf_info *ldev,
13562306a36Sopenharmony_ci				struct iavf_client *client,
13662306a36Sopenharmony_ci				struct iavf_params *params);
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	/* called when a message is received from the PF */
13962306a36Sopenharmony_ci	int (*virtchnl_receive)(struct iavf_info *ldev,
14062306a36Sopenharmony_ci				struct iavf_client *client,
14162306a36Sopenharmony_ci				u8 *msg, u16 len);
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/* Client device */
14562306a36Sopenharmony_cistruct iavf_client_instance {
14662306a36Sopenharmony_ci	struct list_head list;
14762306a36Sopenharmony_ci	struct iavf_info lan_info;
14862306a36Sopenharmony_ci	struct iavf_client *client;
14962306a36Sopenharmony_ci	unsigned long  state;
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cistruct iavf_client {
15362306a36Sopenharmony_ci	struct list_head list;		/* list of registered clients */
15462306a36Sopenharmony_ci	char name[IAVF_CLIENT_STR_LENGTH];
15562306a36Sopenharmony_ci	struct iavf_client_version version;
15662306a36Sopenharmony_ci	unsigned long state;		/* client state */
15762306a36Sopenharmony_ci	atomic_t ref_cnt;  /* Count of all the client devices of this kind */
15862306a36Sopenharmony_ci	u32 flags;
15962306a36Sopenharmony_ci#define IAVF_CLIENT_FLAGS_LAUNCH_ON_PROBE	BIT(0)
16062306a36Sopenharmony_ci#define IAVF_TX_FLAGS_NOTIFY_OTHER_EVENTS	BIT(2)
16162306a36Sopenharmony_ci	u8 type;
16262306a36Sopenharmony_ci#define IAVF_CLIENT_RDMA 0
16362306a36Sopenharmony_ci	struct iavf_client_ops *ops;	/* client ops provided by the client */
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci/* used by clients */
16762306a36Sopenharmony_ciint iavf_register_client(struct iavf_client *client);
16862306a36Sopenharmony_ciint iavf_unregister_client(struct iavf_client *client);
16962306a36Sopenharmony_ci#endif /* _IAVF_CLIENT_H_ */
170