18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright(c) 2013 - 2018 Intel Corporation. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef _IAVF_CLIENT_H_
58c2ecf20Sopenharmony_ci#define _IAVF_CLIENT_H_
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#define IAVF_CLIENT_STR_LENGTH 10
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci/* Client interface version should be updated anytime there is a change in the
108c2ecf20Sopenharmony_ci * existing APIs or data structures.
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci#define IAVF_CLIENT_VERSION_MAJOR 0
138c2ecf20Sopenharmony_ci#define IAVF_CLIENT_VERSION_MINOR 01
148c2ecf20Sopenharmony_ci#define IAVF_CLIENT_VERSION_BUILD 00
158c2ecf20Sopenharmony_ci#define IAVF_CLIENT_VERSION_STR     \
168c2ecf20Sopenharmony_ci	__stringify(IAVF_CLIENT_VERSION_MAJOR) "." \
178c2ecf20Sopenharmony_ci	__stringify(IAVF_CLIENT_VERSION_MINOR) "." \
188c2ecf20Sopenharmony_ci	__stringify(IAVF_CLIENT_VERSION_BUILD)
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistruct iavf_client_version {
218c2ecf20Sopenharmony_ci	u8 major;
228c2ecf20Sopenharmony_ci	u8 minor;
238c2ecf20Sopenharmony_ci	u8 build;
248c2ecf20Sopenharmony_ci	u8 rsvd;
258c2ecf20Sopenharmony_ci};
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cienum iavf_client_state {
288c2ecf20Sopenharmony_ci	__IAVF_CLIENT_NULL,
298c2ecf20Sopenharmony_ci	__IAVF_CLIENT_REGISTERED
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cienum iavf_client_instance_state {
338c2ecf20Sopenharmony_ci	__IAVF_CLIENT_INSTANCE_NONE,
348c2ecf20Sopenharmony_ci	__IAVF_CLIENT_INSTANCE_OPENED,
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistruct iavf_ops;
388c2ecf20Sopenharmony_cistruct iavf_client;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/* HW does not define a type value for AEQ; only for RX/TX and CEQ.
418c2ecf20Sopenharmony_ci * In order for us to keep the interface simple, SW will define a
428c2ecf20Sopenharmony_ci * unique type value for AEQ.
438c2ecf20Sopenharmony_ci */
448c2ecf20Sopenharmony_ci#define IAVF_QUEUE_TYPE_PE_AEQ	0x80
458c2ecf20Sopenharmony_ci#define IAVF_QUEUE_INVALID_IDX	0xFFFF
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cistruct iavf_qv_info {
488c2ecf20Sopenharmony_ci	u32 v_idx; /* msix_vector */
498c2ecf20Sopenharmony_ci	u16 ceq_idx;
508c2ecf20Sopenharmony_ci	u16 aeq_idx;
518c2ecf20Sopenharmony_ci	u8 itr_idx;
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistruct iavf_qvlist_info {
558c2ecf20Sopenharmony_ci	u32 num_vectors;
568c2ecf20Sopenharmony_ci	struct iavf_qv_info qv_info[1];
578c2ecf20Sopenharmony_ci};
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci#define IAVF_CLIENT_MSIX_ALL 0xFFFFFFFF
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/* set of LAN parameters useful for clients managed by LAN */
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/* Struct to hold per priority info */
648c2ecf20Sopenharmony_cistruct iavf_prio_qos_params {
658c2ecf20Sopenharmony_ci	u16 qs_handle; /* qs handle for prio */
668c2ecf20Sopenharmony_ci	u8 tc; /* TC mapped to prio */
678c2ecf20Sopenharmony_ci	u8 reserved;
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#define IAVF_CLIENT_MAX_USER_PRIORITY	8
718c2ecf20Sopenharmony_ci/* Struct to hold Client QoS */
728c2ecf20Sopenharmony_cistruct iavf_qos_params {
738c2ecf20Sopenharmony_ci	struct iavf_prio_qos_params prio_qos[IAVF_CLIENT_MAX_USER_PRIORITY];
748c2ecf20Sopenharmony_ci};
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistruct iavf_params {
778c2ecf20Sopenharmony_ci	struct iavf_qos_params qos;
788c2ecf20Sopenharmony_ci	u16 mtu;
798c2ecf20Sopenharmony_ci	u16 link_up; /* boolean */
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci/* Structure to hold LAN device info for a client device */
838c2ecf20Sopenharmony_cistruct iavf_info {
848c2ecf20Sopenharmony_ci	struct iavf_client_version version;
858c2ecf20Sopenharmony_ci	u8 lanmac[6];
868c2ecf20Sopenharmony_ci	struct net_device *netdev;
878c2ecf20Sopenharmony_ci	struct pci_dev *pcidev;
888c2ecf20Sopenharmony_ci	u8 __iomem *hw_addr;
898c2ecf20Sopenharmony_ci	u8 fid;	/* function id, PF id or VF id */
908c2ecf20Sopenharmony_ci#define IAVF_CLIENT_FTYPE_PF 0
918c2ecf20Sopenharmony_ci#define IAVF_CLIENT_FTYPE_VF 1
928c2ecf20Sopenharmony_ci	u8 ftype; /* function type, PF or VF */
938c2ecf20Sopenharmony_ci	void *vf; /* cast to iavf_adapter */
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	/* All L2 params that could change during the life span of the device
968c2ecf20Sopenharmony_ci	 * and needs to be communicated to the client when they change
978c2ecf20Sopenharmony_ci	 */
988c2ecf20Sopenharmony_ci	struct iavf_params params;
998c2ecf20Sopenharmony_ci	struct iavf_ops *ops;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	u16 msix_count;	 /* number of msix vectors*/
1028c2ecf20Sopenharmony_ci	/* Array down below will be dynamically allocated based on msix_count */
1038c2ecf20Sopenharmony_ci	struct msix_entry *msix_entries;
1048c2ecf20Sopenharmony_ci	u16 itr_index; /* Which ITR index the PE driver is suppose to use */
1058c2ecf20Sopenharmony_ci};
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_cistruct iavf_ops {
1088c2ecf20Sopenharmony_ci	/* setup_q_vector_list enables queues with a particular vector */
1098c2ecf20Sopenharmony_ci	int (*setup_qvlist)(struct iavf_info *ldev, struct iavf_client *client,
1108c2ecf20Sopenharmony_ci			    struct iavf_qvlist_info *qv_info);
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	u32 (*virtchnl_send)(struct iavf_info *ldev, struct iavf_client *client,
1138c2ecf20Sopenharmony_ci			     u8 *msg, u16 len);
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	/* If the PE Engine is unresponsive, RDMA driver can request a reset.*/
1168c2ecf20Sopenharmony_ci	void (*request_reset)(struct iavf_info *ldev,
1178c2ecf20Sopenharmony_ci			      struct iavf_client *client);
1188c2ecf20Sopenharmony_ci};
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_cistruct iavf_client_ops {
1218c2ecf20Sopenharmony_ci	/* Should be called from register_client() or whenever the driver is
1228c2ecf20Sopenharmony_ci	 * ready to create a specific client instance.
1238c2ecf20Sopenharmony_ci	 */
1248c2ecf20Sopenharmony_ci	int (*open)(struct iavf_info *ldev, struct iavf_client *client);
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	/* Should be closed when netdev is unavailable or when unregister
1278c2ecf20Sopenharmony_ci	 * call comes in. If the close happens due to a reset, set the reset
1288c2ecf20Sopenharmony_ci	 * bit to true.
1298c2ecf20Sopenharmony_ci	 */
1308c2ecf20Sopenharmony_ci	void (*close)(struct iavf_info *ldev, struct iavf_client *client,
1318c2ecf20Sopenharmony_ci		      bool reset);
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci	/* called when some l2 managed parameters changes - mss */
1348c2ecf20Sopenharmony_ci	void (*l2_param_change)(struct iavf_info *ldev,
1358c2ecf20Sopenharmony_ci				struct iavf_client *client,
1368c2ecf20Sopenharmony_ci				struct iavf_params *params);
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	/* called when a message is received from the PF */
1398c2ecf20Sopenharmony_ci	int (*virtchnl_receive)(struct iavf_info *ldev,
1408c2ecf20Sopenharmony_ci				struct iavf_client *client,
1418c2ecf20Sopenharmony_ci				u8 *msg, u16 len);
1428c2ecf20Sopenharmony_ci};
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci/* Client device */
1458c2ecf20Sopenharmony_cistruct iavf_client_instance {
1468c2ecf20Sopenharmony_ci	struct list_head list;
1478c2ecf20Sopenharmony_ci	struct iavf_info lan_info;
1488c2ecf20Sopenharmony_ci	struct iavf_client *client;
1498c2ecf20Sopenharmony_ci	unsigned long  state;
1508c2ecf20Sopenharmony_ci};
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_cistruct iavf_client {
1538c2ecf20Sopenharmony_ci	struct list_head list;		/* list of registered clients */
1548c2ecf20Sopenharmony_ci	char name[IAVF_CLIENT_STR_LENGTH];
1558c2ecf20Sopenharmony_ci	struct iavf_client_version version;
1568c2ecf20Sopenharmony_ci	unsigned long state;		/* client state */
1578c2ecf20Sopenharmony_ci	atomic_t ref_cnt;  /* Count of all the client devices of this kind */
1588c2ecf20Sopenharmony_ci	u32 flags;
1598c2ecf20Sopenharmony_ci#define IAVF_CLIENT_FLAGS_LAUNCH_ON_PROBE	BIT(0)
1608c2ecf20Sopenharmony_ci#define IAVF_TX_FLAGS_NOTIFY_OTHER_EVENTS	BIT(2)
1618c2ecf20Sopenharmony_ci	u8 type;
1628c2ecf20Sopenharmony_ci#define IAVF_CLIENT_IWARP 0
1638c2ecf20Sopenharmony_ci	struct iavf_client_ops *ops;	/* client ops provided by the client */
1648c2ecf20Sopenharmony_ci};
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci/* used by clients */
1678c2ecf20Sopenharmony_ciint iavf_register_client(struct iavf_client *client);
1688c2ecf20Sopenharmony_ciint iavf_unregister_client(struct iavf_client *client);
1698c2ecf20Sopenharmony_ci#endif /* _IAVF_CLIENT_H_ */
170