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