162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/* Copyright (c) 2016-2017 Hisilicon Limited. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __HCLGE_MBX_H
562306a36Sopenharmony_ci#define __HCLGE_MBX_H
662306a36Sopenharmony_ci#include <linux/init.h>
762306a36Sopenharmony_ci#include <linux/mutex.h>
862306a36Sopenharmony_ci#include <linux/types.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cienum HCLGE_MBX_OPCODE {
1162306a36Sopenharmony_ci	HCLGE_MBX_RESET = 0x01,		/* (VF -> PF) assert reset */
1262306a36Sopenharmony_ci	HCLGE_MBX_ASSERTING_RESET,	/* (PF -> VF) PF is asserting reset */
1362306a36Sopenharmony_ci	HCLGE_MBX_SET_UNICAST,		/* (VF -> PF) set UC addr */
1462306a36Sopenharmony_ci	HCLGE_MBX_SET_MULTICAST,	/* (VF -> PF) set MC addr */
1562306a36Sopenharmony_ci	HCLGE_MBX_SET_VLAN,		/* (VF -> PF) set VLAN */
1662306a36Sopenharmony_ci	HCLGE_MBX_MAP_RING_TO_VECTOR,	/* (VF -> PF) map ring-to-vector */
1762306a36Sopenharmony_ci	HCLGE_MBX_UNMAP_RING_TO_VECTOR,	/* (VF -> PF) unamp ring-to-vector */
1862306a36Sopenharmony_ci	HCLGE_MBX_SET_PROMISC_MODE,	/* (VF -> PF) set promiscuous mode */
1962306a36Sopenharmony_ci	HCLGE_MBX_SET_MACVLAN,		/* (VF -> PF) set unicast filter */
2062306a36Sopenharmony_ci	HCLGE_MBX_API_NEGOTIATE,	/* (VF -> PF) negotiate API version */
2162306a36Sopenharmony_ci	HCLGE_MBX_GET_QINFO,		/* (VF -> PF) get queue config */
2262306a36Sopenharmony_ci	HCLGE_MBX_GET_QDEPTH,		/* (VF -> PF) get queue depth */
2362306a36Sopenharmony_ci	HCLGE_MBX_GET_BASIC_INFO,	/* (VF -> PF) get basic info */
2462306a36Sopenharmony_ci	HCLGE_MBX_GET_RETA,		/* (VF -> PF) get RETA */
2562306a36Sopenharmony_ci	HCLGE_MBX_GET_RSS_KEY,		/* (VF -> PF) get RSS key */
2662306a36Sopenharmony_ci	HCLGE_MBX_GET_MAC_ADDR,		/* (VF -> PF) get MAC addr */
2762306a36Sopenharmony_ci	HCLGE_MBX_PF_VF_RESP,		/* (PF -> VF) generate response to VF */
2862306a36Sopenharmony_ci	HCLGE_MBX_GET_BDNUM,		/* (VF -> PF) get BD num */
2962306a36Sopenharmony_ci	HCLGE_MBX_GET_BUFSIZE,		/* (VF -> PF) get buffer size */
3062306a36Sopenharmony_ci	HCLGE_MBX_GET_STREAMID,		/* (VF -> PF) get stream id */
3162306a36Sopenharmony_ci	HCLGE_MBX_SET_AESTART,		/* (VF -> PF) start ae */
3262306a36Sopenharmony_ci	HCLGE_MBX_SET_TSOSTATS,		/* (VF -> PF) get tso stats */
3362306a36Sopenharmony_ci	HCLGE_MBX_LINK_STAT_CHANGE,	/* (PF -> VF) link status has changed */
3462306a36Sopenharmony_ci	HCLGE_MBX_GET_BASE_CONFIG,	/* (VF -> PF) get config */
3562306a36Sopenharmony_ci	HCLGE_MBX_BIND_FUNC_QUEUE,	/* (VF -> PF) bind function and queue */
3662306a36Sopenharmony_ci	HCLGE_MBX_GET_LINK_STATUS,	/* (VF -> PF) get link status */
3762306a36Sopenharmony_ci	HCLGE_MBX_QUEUE_RESET,		/* (VF -> PF) reset queue */
3862306a36Sopenharmony_ci	HCLGE_MBX_KEEP_ALIVE,		/* (VF -> PF) send keep alive cmd */
3962306a36Sopenharmony_ci	HCLGE_MBX_SET_ALIVE,		/* (VF -> PF) set alive state */
4062306a36Sopenharmony_ci	HCLGE_MBX_SET_MTU,		/* (VF -> PF) set mtu */
4162306a36Sopenharmony_ci	HCLGE_MBX_GET_QID_IN_PF,	/* (VF -> PF) get queue id in pf */
4262306a36Sopenharmony_ci	HCLGE_MBX_LINK_STAT_MODE,	/* (PF -> VF) link mode has changed */
4362306a36Sopenharmony_ci	HCLGE_MBX_GET_LINK_MODE,	/* (VF -> PF) get the link mode of pf */
4462306a36Sopenharmony_ci	HCLGE_MBX_PUSH_VLAN_INFO,	/* (PF -> VF) push port base vlan */
4562306a36Sopenharmony_ci	HCLGE_MBX_GET_MEDIA_TYPE,       /* (VF -> PF) get media type */
4662306a36Sopenharmony_ci	HCLGE_MBX_PUSH_PROMISC_INFO,	/* (PF -> VF) push vf promisc info */
4762306a36Sopenharmony_ci	HCLGE_MBX_VF_UNINIT,            /* (VF -> PF) vf is unintializing */
4862306a36Sopenharmony_ci	HCLGE_MBX_HANDLE_VF_TBL,	/* (VF -> PF) store/clear hw table */
4962306a36Sopenharmony_ci	HCLGE_MBX_GET_RING_VECTOR_MAP,	/* (VF -> PF) get ring-to-vector map */
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf flr status */
5262306a36Sopenharmony_ci	HCLGE_MBX_PUSH_LINK_STATUS,	/* (M7 -> PF) get port link status */
5362306a36Sopenharmony_ci	HCLGE_MBX_NCSI_ERROR,		/* (M7 -> PF) receive a NCSI error */
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* below are per-VF mac-vlan subcodes */
5762306a36Sopenharmony_cienum hclge_mbx_mac_vlan_subcode {
5862306a36Sopenharmony_ci	HCLGE_MBX_MAC_VLAN_UC_MODIFY = 0,	/* modify UC mac addr */
5962306a36Sopenharmony_ci	HCLGE_MBX_MAC_VLAN_UC_ADD,		/* add a new UC mac addr */
6062306a36Sopenharmony_ci	HCLGE_MBX_MAC_VLAN_UC_REMOVE,		/* remove a new UC mac addr */
6162306a36Sopenharmony_ci	HCLGE_MBX_MAC_VLAN_MC_MODIFY,		/* modify MC mac addr */
6262306a36Sopenharmony_ci	HCLGE_MBX_MAC_VLAN_MC_ADD,		/* add new MC mac addr */
6362306a36Sopenharmony_ci	HCLGE_MBX_MAC_VLAN_MC_REMOVE,		/* remove MC mac addr */
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* below are per-VF vlan cfg subcodes */
6762306a36Sopenharmony_cienum hclge_mbx_vlan_cfg_subcode {
6862306a36Sopenharmony_ci	HCLGE_MBX_VLAN_FILTER = 0,	/* set vlan filter */
6962306a36Sopenharmony_ci	HCLGE_MBX_VLAN_TX_OFF_CFG,	/* set tx side vlan offload */
7062306a36Sopenharmony_ci	HCLGE_MBX_VLAN_RX_OFF_CFG,	/* set rx side vlan offload */
7162306a36Sopenharmony_ci	HCLGE_MBX_PORT_BASE_VLAN_CFG,	/* set port based vlan configuration */
7262306a36Sopenharmony_ci	HCLGE_MBX_GET_PORT_BASE_VLAN_STATE,	/* get port based vlan state */
7362306a36Sopenharmony_ci	HCLGE_MBX_ENABLE_VLAN_FILTER,
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cienum hclge_mbx_tbl_cfg_subcode {
7762306a36Sopenharmony_ci	HCLGE_MBX_VPORT_LIST_CLEAR,
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define HCLGE_MBX_MAX_MSG_SIZE	14
8162306a36Sopenharmony_ci#define HCLGE_MBX_MAX_RESP_DATA_SIZE	8U
8262306a36Sopenharmony_ci#define HCLGE_MBX_MAX_RING_CHAIN_PARAM_NUM	4
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define HCLGE_RESET_SCHED_TIMEOUT	(3 * HZ)
8562306a36Sopenharmony_ci#define HCLGE_MBX_SCHED_TIMEOUT	(HZ / 2)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistruct hclge_ring_chain_param {
8862306a36Sopenharmony_ci	u8 ring_type;
8962306a36Sopenharmony_ci	u8 tqp_index;
9062306a36Sopenharmony_ci	u8 int_gl_index;
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct hclge_basic_info {
9462306a36Sopenharmony_ci	u8 hw_tc_map;
9562306a36Sopenharmony_ci	u8 rsv;
9662306a36Sopenharmony_ci	__le16 mbx_api_version;
9762306a36Sopenharmony_ci	__le32 pf_caps;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistruct hclgevf_mbx_resp_status {
10162306a36Sopenharmony_ci	struct mutex mbx_mutex; /* protects against contending sync cmd resp */
10262306a36Sopenharmony_ci	u32 origin_mbx_msg;
10362306a36Sopenharmony_ci	bool received_resp;
10462306a36Sopenharmony_ci	int resp_status;
10562306a36Sopenharmony_ci	u16 match_id;
10662306a36Sopenharmony_ci	u8 additional_info[HCLGE_MBX_MAX_RESP_DATA_SIZE];
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistruct hclge_respond_to_vf_msg {
11062306a36Sopenharmony_ci	int status;
11162306a36Sopenharmony_ci	u8 data[HCLGE_MBX_MAX_RESP_DATA_SIZE];
11262306a36Sopenharmony_ci	u16 len;
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistruct hclge_vf_to_pf_msg {
11662306a36Sopenharmony_ci	u8 code;
11762306a36Sopenharmony_ci	union {
11862306a36Sopenharmony_ci		struct {
11962306a36Sopenharmony_ci			u8 subcode;
12062306a36Sopenharmony_ci			u8 data[HCLGE_MBX_MAX_MSG_SIZE];
12162306a36Sopenharmony_ci		};
12262306a36Sopenharmony_ci		struct {
12362306a36Sopenharmony_ci			u8 en_bc;
12462306a36Sopenharmony_ci			u8 en_uc;
12562306a36Sopenharmony_ci			u8 en_mc;
12662306a36Sopenharmony_ci			u8 en_limit_promisc;
12762306a36Sopenharmony_ci		};
12862306a36Sopenharmony_ci		struct {
12962306a36Sopenharmony_ci			u8 vector_id;
13062306a36Sopenharmony_ci			u8 ring_num;
13162306a36Sopenharmony_ci			struct hclge_ring_chain_param
13262306a36Sopenharmony_ci				param[HCLGE_MBX_MAX_RING_CHAIN_PARAM_NUM];
13362306a36Sopenharmony_ci		};
13462306a36Sopenharmony_ci	};
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistruct hclge_pf_to_vf_msg {
13862306a36Sopenharmony_ci	__le16 code;
13962306a36Sopenharmony_ci	union {
14062306a36Sopenharmony_ci		/* used for mbx response */
14162306a36Sopenharmony_ci		struct {
14262306a36Sopenharmony_ci			__le16 vf_mbx_msg_code;
14362306a36Sopenharmony_ci			__le16 vf_mbx_msg_subcode;
14462306a36Sopenharmony_ci			__le16 resp_status;
14562306a36Sopenharmony_ci			u8 resp_data[HCLGE_MBX_MAX_RESP_DATA_SIZE];
14662306a36Sopenharmony_ci		};
14762306a36Sopenharmony_ci		/* used for general mbx */
14862306a36Sopenharmony_ci		struct {
14962306a36Sopenharmony_ci			u8 msg_data[HCLGE_MBX_MAX_MSG_SIZE];
15062306a36Sopenharmony_ci		};
15162306a36Sopenharmony_ci	};
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistruct hclge_mbx_vf_to_pf_cmd {
15562306a36Sopenharmony_ci	u8 rsv;
15662306a36Sopenharmony_ci	u8 mbx_src_vfid; /* Auto filled by IMP */
15762306a36Sopenharmony_ci	u8 mbx_need_resp;
15862306a36Sopenharmony_ci	u8 rsv1[1];
15962306a36Sopenharmony_ci	u8 msg_len;
16062306a36Sopenharmony_ci	u8 rsv2;
16162306a36Sopenharmony_ci	__le16 match_id;
16262306a36Sopenharmony_ci	struct hclge_vf_to_pf_msg msg;
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#define HCLGE_MBX_NEED_RESP_B		0
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cistruct hclge_mbx_pf_to_vf_cmd {
16862306a36Sopenharmony_ci	u8 dest_vfid;
16962306a36Sopenharmony_ci	u8 rsv[3];
17062306a36Sopenharmony_ci	u8 msg_len;
17162306a36Sopenharmony_ci	u8 rsv1;
17262306a36Sopenharmony_ci	__le16 match_id;
17362306a36Sopenharmony_ci	struct hclge_pf_to_vf_msg msg;
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistruct hclge_vf_rst_cmd {
17762306a36Sopenharmony_ci	u8 dest_vfid;
17862306a36Sopenharmony_ci	u8 vf_rst;
17962306a36Sopenharmony_ci	u8 rsv[22];
18062306a36Sopenharmony_ci};
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci#pragma pack(1)
18362306a36Sopenharmony_cistruct hclge_mbx_link_status {
18462306a36Sopenharmony_ci	__le16 link_status;
18562306a36Sopenharmony_ci	__le32 speed;
18662306a36Sopenharmony_ci	__le16 duplex;
18762306a36Sopenharmony_ci	u8 flag;
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistruct hclge_mbx_link_mode {
19162306a36Sopenharmony_ci	__le16 idx;
19262306a36Sopenharmony_ci	__le64 link_mode;
19362306a36Sopenharmony_ci};
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_cistruct hclge_mbx_port_base_vlan {
19662306a36Sopenharmony_ci	__le16 state;
19762306a36Sopenharmony_ci	__le16 vlan_proto;
19862306a36Sopenharmony_ci	__le16 qos;
19962306a36Sopenharmony_ci	__le16 vlan_tag;
20062306a36Sopenharmony_ci};
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cistruct hclge_mbx_vf_queue_info {
20362306a36Sopenharmony_ci	__le16 num_tqps;
20462306a36Sopenharmony_ci	__le16 rss_size;
20562306a36Sopenharmony_ci	__le16 rx_buf_len;
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cistruct hclge_mbx_vf_queue_depth {
20962306a36Sopenharmony_ci	__le16 num_tx_desc;
21062306a36Sopenharmony_ci	__le16 num_rx_desc;
21162306a36Sopenharmony_ci};
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cistruct hclge_mbx_vlan_filter {
21462306a36Sopenharmony_ci	u8 is_kill;
21562306a36Sopenharmony_ci	__le16 vlan_id;
21662306a36Sopenharmony_ci	__le16 proto;
21762306a36Sopenharmony_ci};
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cistruct hclge_mbx_mtu_info {
22062306a36Sopenharmony_ci	__le32 mtu;
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci#pragma pack()
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci/* used by VF to store the received Async responses from PF */
22662306a36Sopenharmony_cistruct hclgevf_mbx_arq_ring {
22762306a36Sopenharmony_ci#define HCLGE_MBX_MAX_ARQ_MSG_SIZE	8
22862306a36Sopenharmony_ci#define HCLGE_MBX_MAX_ARQ_MSG_NUM	1024
22962306a36Sopenharmony_ci	struct hclgevf_dev *hdev;
23062306a36Sopenharmony_ci	u32 head;
23162306a36Sopenharmony_ci	u32 tail;
23262306a36Sopenharmony_ci	atomic_t count;
23362306a36Sopenharmony_ci	__le16 msg_q[HCLGE_MBX_MAX_ARQ_MSG_NUM][HCLGE_MBX_MAX_ARQ_MSG_SIZE];
23462306a36Sopenharmony_ci};
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_cistruct hclge_dev;
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci#define HCLGE_MBX_OPCODE_MAX 256
23962306a36Sopenharmony_cistruct hclge_mbx_ops_param {
24062306a36Sopenharmony_ci	struct hclge_vport *vport;
24162306a36Sopenharmony_ci	struct hclge_mbx_vf_to_pf_cmd *req;
24262306a36Sopenharmony_ci	struct hclge_respond_to_vf_msg *resp_msg;
24362306a36Sopenharmony_ci};
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_citypedef int (*hclge_mbx_ops_fn)(struct hclge_mbx_ops_param *param);
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci#define hclge_mbx_ring_ptr_move_crq(crq) \
24862306a36Sopenharmony_ci	(crq->next_to_use = (crq->next_to_use + 1) % crq->desc_num)
24962306a36Sopenharmony_ci#define hclge_mbx_tail_ptr_move_arq(arq) \
25062306a36Sopenharmony_ci		(arq.tail = (arq.tail + 1) % HCLGE_MBX_MAX_ARQ_MSG_NUM)
25162306a36Sopenharmony_ci#define hclge_mbx_head_ptr_move_arq(arq) \
25262306a36Sopenharmony_ci		(arq.head = (arq.head + 1) % HCLGE_MBX_MAX_ARQ_MSG_NUM)
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci/* PF immediately push link status to VFs when link status changed */
25562306a36Sopenharmony_ci#define HCLGE_MBX_PUSH_LINK_STATUS_EN			BIT(0)
25662306a36Sopenharmony_ci#endif
257