xref: /openbmc/linux/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
251ba902aSAviad Krawczyk /*
351ba902aSAviad Krawczyk  * Huawei HiNIC PCI Express Linux driver
451ba902aSAviad Krawczyk  * Copyright(c) 2017 Huawei Technologies Co., Ltd
551ba902aSAviad Krawczyk  */
651ba902aSAviad Krawczyk 
751ba902aSAviad Krawczyk #ifndef HINIC_HW_DEV_H
851ba902aSAviad Krawczyk #define HINIC_HW_DEV_H
951ba902aSAviad Krawczyk 
1051ba902aSAviad Krawczyk #include <linux/pci.h>
11a5564e7eSAviad Krawczyk #include <linux/types.h>
12c4d06d2dSAviad Krawczyk #include <linux/bitops.h>
13c15850c7SLuo bin #include <net/devlink.h>
1451ba902aSAviad Krawczyk 
1551ba902aSAviad Krawczyk #include "hinic_hw_if.h"
16a5564e7eSAviad Krawczyk #include "hinic_hw_eqs.h"
17a5564e7eSAviad Krawczyk #include "hinic_hw_mgmt.h"
18c3e79bafSAviad Krawczyk #include "hinic_hw_qp.h"
19c3e79bafSAviad Krawczyk #include "hinic_hw_io.h"
20a425b6e1SLuo bin #include "hinic_hw_mbox.h"
2151ba902aSAviad Krawczyk 
2251ba902aSAviad Krawczyk #define HINIC_MAX_QPS   32
2351ba902aSAviad Krawczyk 
24c4d06d2dSAviad Krawczyk #define HINIC_MGMT_NUM_MSG_CMD  (HINIC_MGMT_MSG_CMD_MAX - \
25c4d06d2dSAviad Krawczyk 				 HINIC_MGMT_MSG_CMD_BASE)
26c4d06d2dSAviad Krawczyk 
277dd29ee1SLuo bin #define HINIC_PF_SET_VF_ALREADY				0x4
287dd29ee1SLuo bin #define HINIC_MGMT_STATUS_EXIST				0x6
2972ef908bSLuo bin #define HINIC_MGMT_CMD_UNSUPPORTED			0xFF
307dd29ee1SLuo bin 
31088c5f0dSLuo bin #define HINIC_CMD_VER_FUNC_ID				2
32088c5f0dSLuo bin 
33a5564e7eSAviad Krawczyk struct hinic_cap {
34a5564e7eSAviad Krawczyk 	u16     max_qps;
35a5564e7eSAviad Krawczyk 	u16     num_qps;
367dd29ee1SLuo bin 	u8		max_vf;
377dd29ee1SLuo bin 	u16     max_vf_qps;
38a5564e7eSAviad Krawczyk };
39a5564e7eSAviad Krawczyk 
4072ef908bSLuo bin enum hw_ioctxt_set_cmdq_depth {
4172ef908bSLuo bin 	HW_IOCTXT_SET_CMDQ_DEPTH_DEFAULT,
4272ef908bSLuo bin 	HW_IOCTXT_SET_CMDQ_DEPTH_ENABLE,
4372ef908bSLuo bin };
4472ef908bSLuo bin 
4525a3ba61SAviad Krawczyk enum hinic_port_cmd {
467dd29ee1SLuo bin 	HINIC_PORT_CMD_VF_REGISTER = 0x0,
477dd29ee1SLuo bin 	HINIC_PORT_CMD_VF_UNREGISTER = 0x1,
487dd29ee1SLuo bin 
49ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_CHANGE_MTU = 0x2,
5025a3ba61SAviad Krawczyk 
51ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_ADD_VLAN = 0x3,
52ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_DEL_VLAN = 0x4,
5325a3ba61SAviad Krawczyk 
54*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_ETS = 0x7,
55*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_ETS = 0x8,
56*13265568SCai Huoqing 
57ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_PFC = 0x5,
58ea256222SLuo bin 
59ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_MAC = 0x9,
60ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_MAC = 0xA,
61ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_DEL_MAC = 0xB,
6225a3ba61SAviad Krawczyk 
63ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RX_MODE = 0xC,
6425a3ba61SAviad Krawczyk 
65*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_ANTI_ATTACK_RATE = 0xD,
66*13265568SCai Huoqing 
67ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_PAUSE_INFO = 0x14,
68ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_PAUSE_INFO = 0x15,
6901f2b3daSLuo bin 
70ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_LINK_STATE = 0x18,
7125a3ba61SAviad Krawczyk 
72ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_LRO = 0x19,
731e007181SXue Chaojing 
74ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RX_CSUM = 0x1A,
754a61abb1SXue Chaojing 
76ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RX_VLAN_OFFLOAD = 0x1B,
77aebd17b7SXue Chaojing 
78ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_PORT_STATISTICS = 0x1C,
79e54fbbdfSXue Chaojing 
80ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_CLEAR_PORT_STATISTICS = 0x1D,
81e54fbbdfSXue Chaojing 
82ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_VPORT_STAT = 0x1E,
83e54fbbdfSXue Chaojing 
84ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_CLEAN_VPORT_STAT	= 0x1F,
85e54fbbdfSXue Chaojing 
86ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_RSS_TEMPLATE_INDIR_TBL = 0x25,
874fdc51bbSXue Chaojing 
88ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_PORT_STATE = 0x29,
89*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_PORT_STATE = 0x30,
9025a3ba61SAviad Krawczyk 
91ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RSS_TEMPLATE_TBL = 0x2B,
92421e9526SXue Chaojing 
93ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_RSS_TEMPLATE_TBL = 0x2C,
944fdc51bbSXue Chaojing 
95ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RSS_HASH_ENGINE = 0x2D,
96421e9526SXue Chaojing 
97ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_RSS_HASH_ENGINE = 0x2E,
984fdc51bbSXue Chaojing 
99ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_RSS_CTX_TBL = 0x2F,
1004fdc51bbSXue Chaojing 
101ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RSS_CTX_TBL = 0x30,
1024fdc51bbSXue Chaojing 
103ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_RSS_TEMP_MGR	= 0x31,
104421e9526SXue Chaojing 
105ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_RD_LINE_TBL = 0x39,
1065215e162SLuo bin 
107ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_RSS_CFG = 0x42,
108421e9526SXue Chaojing 
109*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_PHY_TYPE = 0x44,
110*13265568SCai Huoqing 
111ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_FWCTXT_INIT = 0x45,
11225a3ba61SAviad Krawczyk 
113ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_LOOPBACK_MODE = 0x48,
114ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_LOOPBACK_MODE = 0x49,
1154aa218a4SLuo bin 
116*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_JUMBO_FRAME_SIZE = 0x4A,
117*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_JUMBO_FRAME_SIZE = 0x4B,
118*13265568SCai Huoqing 
119ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_ENABLE_SPOOFCHK = 0x4E,
12072ef908bSLuo bin 
121ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_MGMT_VERSION = 0x58,
12261a582beSXue Chaojing 
123*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_PORT_TYPE = 0x5B,
124*13265568SCai Huoqing 
125ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_FUNC_STATE = 0x5D,
12625a3ba61SAviad Krawczyk 
127*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_PORT_ID_BY_FUNC_ID = 0x5E,
128*13265568SCai Huoqing 
129*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_DMA_CS = 0x64,
130*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_DMA_CS = 0x65,
131*13265568SCai Huoqing 
132ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_GLOBAL_QPN = 0x66,
13325a3ba61SAviad Krawczyk 
134ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_VF_RATE = 0x69,
13572ef908bSLuo bin 
136ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_VF_VLAN = 0x6A,
1377dd29ee1SLuo bin 
138ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_CLR_VF_VLAN = 0x6B,
1397dd29ee1SLuo bin 
140ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_TSO = 0x70,
141cc18a754SZhao Chen 
142ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_UPDATE_FW = 0x72,
1435e126e7cSLuo bin 
144ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_RQ_IQ_MAP = 0x73,
1451e007181SXue Chaojing 
146*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_PFC_THD = 0x75,
147*13265568SCai Huoqing 
148ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_LINK_STATUS_REPORT = 0xA0,
1497dd29ee1SLuo bin 
150*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_LOSSLESS_ETH	= 0xA3,
151*13265568SCai Huoqing 
152ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_UPDATE_MAC = 0xA4,
1537dd29ee1SLuo bin 
154ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_CAP = 0xAA,
1551e007181SXue Chaojing 
156*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_ADD_FLOW = 0xAF,
157*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_DEL_FLOW = 0xB0,
158*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_GET_FLOW = 0xB1,
159*13265568SCai Huoqing 
160*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_FLUSH_TCAM = 0xB2,
161*13265568SCai Huoqing 
162*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_CTRL_TCAM_BLOCK = 0xB3,
163*13265568SCai Huoqing 
164*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_ENABLE = 0xB4,
165*13265568SCai Huoqing 
166*13265568SCai Huoqing 	HINIC_PORT_CMD_UP_TC_GET_TCAM_BLOCK = 0xB5,
167*13265568SCai Huoqing 
168*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_IPSU_MAC = 0xCB,
169*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_IPSU_MAC = 0xCC,
170*13265568SCai Huoqing 
171*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_XSFP_STATUS = 0xD4,
172*13265568SCai Huoqing 
173ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_LINK_MODE = 0xD9,
17401f2b3daSLuo bin 
175ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_SPEED = 0xDA,
17601f2b3daSLuo bin 
177ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_AUTONEG = 0xDB,
17801f2b3daSLuo bin 
179*13265568SCai Huoqing 	HINIC_PORT_CMD_CLEAR_QP_RES = 0xDD,
180*13265568SCai Huoqing 
181*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_SUPER_CQE = 0xDE,
182*13265568SCai Huoqing 
183*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_VF_COS = 0xDF,
184*13265568SCai Huoqing 	HINIC_PORT_CMD_GET_VF_COS = 0xE1,
185*13265568SCai Huoqing 
186*13265568SCai Huoqing 	HINIC_PORT_CMD_CABLE_PLUG_EVENT	= 0xE5,
187*13265568SCai Huoqing 
188*13265568SCai Huoqing 	HINIC_PORT_CMD_LINK_ERR_EVENT = 0xE6,
189*13265568SCai Huoqing 
190*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_COS_UP_MAP = 0xE8,
191*13265568SCai Huoqing 
192*13265568SCai Huoqing 	HINIC_PORT_CMD_RESET_LINK_CFG = 0xEB,
193*13265568SCai Huoqing 
194ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_STD_SFP_INFO = 0xF0,
1952ac84cd1SLuo bin 
196*13265568SCai Huoqing 	HINIC_PORT_CMD_FORCE_PKT_DROP = 0xF3,
197*13265568SCai Huoqing 
198ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_LRO_TIMER = 0xF4,
19972ef908bSLuo bin 
200*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_VHD_CFG = 0xF7,
201*13265568SCai Huoqing 
202*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_LINK_FOLLOW = 0xF8,
203*13265568SCai Huoqing 
204ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_SET_VF_MAX_MIN_RATE = 0xF9,
2052ac84cd1SLuo bin 
206ac33d7aeSCai Huoqing 	HINIC_PORT_CMD_GET_SFP_ABS = 0xFB,
207*13265568SCai Huoqing 
208*13265568SCai Huoqing 	HINIC_PORT_CMD_Q_FILTER	= 0xFC,
209*13265568SCai Huoqing 
210*13265568SCai Huoqing 	HINIC_PORT_CMD_TCAM_FILTER = 0xFE,
211*13265568SCai Huoqing 
212*13265568SCai Huoqing 	HINIC_PORT_CMD_SET_VLAN_FILTER = 0xFF,
21325a3ba61SAviad Krawczyk };
21425a3ba61SAviad Krawczyk 
21501f2b3daSLuo bin /* cmd of mgmt CPU message for HILINK module */
21601f2b3daSLuo bin enum hinic_hilink_cmd {
21701f2b3daSLuo bin 	HINIC_HILINK_CMD_GET_LINK_INFO		= 0x3,
21801f2b3daSLuo bin 	HINIC_HILINK_CMD_SET_LINK_SETTINGS	= 0x8,
21901f2b3daSLuo bin };
22001f2b3daSLuo bin 
221421e9526SXue Chaojing enum hinic_ucode_cmd {
222421e9526SXue Chaojing 	HINIC_UCODE_CMD_MODIFY_QUEUE_CONTEXT    = 0,
223421e9526SXue Chaojing 	HINIC_UCODE_CMD_CLEAN_QUEUE_CONTEXT,
224421e9526SXue Chaojing 	HINIC_UCODE_CMD_ARM_SQ,
225421e9526SXue Chaojing 	HINIC_UCODE_CMD_ARM_RQ,
226421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RSS_INDIR_TABLE,
227421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RSS_CONTEXT_TABLE,
228421e9526SXue Chaojing 	HINIC_UCODE_CMD_GET_RSS_INDIR_TABLE,
229421e9526SXue Chaojing 	HINIC_UCODE_CMD_GET_RSS_CONTEXT_TABLE,
230421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_IQ_ENABLE,
231421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RQ_FLUSH            = 10
232421e9526SXue Chaojing };
233421e9526SXue Chaojing 
234421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_ALLOC  0x01
235421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_FREE   0x02
236421e9526SXue Chaojing 
237c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd {
238c15850c7SLuo bin 	HINIC_MGMT_MSG_CMD_BASE         = 0xA0,
239c4d06d2dSAviad Krawczyk 
240c15850c7SLuo bin 	HINIC_MGMT_MSG_CMD_LINK_STATUS  = 0xA0,
241c15850c7SLuo bin 
242c15850c7SLuo bin 	HINIC_MGMT_MSG_CMD_CABLE_PLUG_EVENT	= 0xE5,
243c15850c7SLuo bin 	HINIC_MGMT_MSG_CMD_LINK_ERR_EVENT	= 0xE6,
244c4d06d2dSAviad Krawczyk 
245c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_MAX,
246c4d06d2dSAviad Krawczyk };
247c4d06d2dSAviad Krawczyk 
248c4d06d2dSAviad Krawczyk enum hinic_cb_state {
249c4d06d2dSAviad Krawczyk 	HINIC_CB_ENABLED = BIT(0),
250c4d06d2dSAviad Krawczyk 	HINIC_CB_RUNNING = BIT(1),
251c4d06d2dSAviad Krawczyk };
252c4d06d2dSAviad Krawczyk 
253e2585ea7SAviad Krawczyk enum hinic_res_state {
254e2585ea7SAviad Krawczyk 	HINIC_RES_CLEAN         = 0,
255e2585ea7SAviad Krawczyk 	HINIC_RES_ACTIVE        = 1,
256e2585ea7SAviad Krawczyk };
257e2585ea7SAviad Krawczyk 
258e2585ea7SAviad Krawczyk struct hinic_cmd_fw_ctxt {
259e2585ea7SAviad Krawczyk 	u8      status;
260e2585ea7SAviad Krawczyk 	u8      version;
261e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
262e2585ea7SAviad Krawczyk 
263e2585ea7SAviad Krawczyk 	u16     func_idx;
264e2585ea7SAviad Krawczyk 	u16     rx_buf_sz;
265e2585ea7SAviad Krawczyk 
266e2585ea7SAviad Krawczyk 	u32     rsvd1;
267e2585ea7SAviad Krawczyk };
268e2585ea7SAviad Krawczyk 
269e2585ea7SAviad Krawczyk struct hinic_cmd_hw_ioctxt {
270e2585ea7SAviad Krawczyk 	u8      status;
271e2585ea7SAviad Krawczyk 	u8      version;
272e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
273e2585ea7SAviad Krawczyk 
274e2585ea7SAviad Krawczyk 	u16     func_idx;
275e2585ea7SAviad Krawczyk 
276e2585ea7SAviad Krawczyk 	u16     rsvd1;
277e2585ea7SAviad Krawczyk 
278e2585ea7SAviad Krawczyk 	u8      set_cmdq_depth;
279e2585ea7SAviad Krawczyk 	u8      cmdq_depth;
280e2585ea7SAviad Krawczyk 
2811e007181SXue Chaojing 	u8      lro_en;
282e2585ea7SAviad Krawczyk 	u8      rsvd3;
283d2ed69ceSLuo bin 	u8      ppf_idx;
284e2585ea7SAviad Krawczyk 	u8      rsvd4;
285e2585ea7SAviad Krawczyk 
286e2585ea7SAviad Krawczyk 	u16     rq_depth;
287e2585ea7SAviad Krawczyk 	u16     rx_buf_sz_idx;
288e2585ea7SAviad Krawczyk 	u16     sq_depth;
289e2585ea7SAviad Krawczyk };
290e2585ea7SAviad Krawczyk 
291e2585ea7SAviad Krawczyk struct hinic_cmd_io_status {
292e2585ea7SAviad Krawczyk 	u8      status;
293e2585ea7SAviad Krawczyk 	u8      version;
294e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
295e2585ea7SAviad Krawczyk 
296e2585ea7SAviad Krawczyk 	u16     func_idx;
297e2585ea7SAviad Krawczyk 	u8      rsvd1;
298e2585ea7SAviad Krawczyk 	u8      rsvd2;
299e2585ea7SAviad Krawczyk 	u32     io_status;
300e2585ea7SAviad Krawczyk };
301e2585ea7SAviad Krawczyk 
302e2585ea7SAviad Krawczyk struct hinic_cmd_clear_io_res {
303e2585ea7SAviad Krawczyk 	u8      status;
304e2585ea7SAviad Krawczyk 	u8      version;
305e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
306e2585ea7SAviad Krawczyk 
307e2585ea7SAviad Krawczyk 	u16     func_idx;
308e2585ea7SAviad Krawczyk 	u8      rsvd1;
309e2585ea7SAviad Krawczyk 	u8      rsvd2;
310e2585ea7SAviad Krawczyk };
311e2585ea7SAviad Krawczyk 
312e2585ea7SAviad Krawczyk struct hinic_cmd_set_res_state {
313e2585ea7SAviad Krawczyk 	u8      status;
314e2585ea7SAviad Krawczyk 	u8      version;
315e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
316e2585ea7SAviad Krawczyk 
317e2585ea7SAviad Krawczyk 	u16     func_idx;
318e2585ea7SAviad Krawczyk 	u8      state;
319e2585ea7SAviad Krawczyk 	u8      rsvd1;
320e2585ea7SAviad Krawczyk 	u32     rsvd2;
321e2585ea7SAviad Krawczyk };
322e2585ea7SAviad Krawczyk 
3237dd29ee1SLuo bin struct hinic_ceq_ctrl_reg {
3247dd29ee1SLuo bin 	u8 status;
3257dd29ee1SLuo bin 	u8 version;
3267dd29ee1SLuo bin 	u8 rsvd0[6];
3277dd29ee1SLuo bin 
3287dd29ee1SLuo bin 	u16 func_id;
3297dd29ee1SLuo bin 	u16 q_id;
3307dd29ee1SLuo bin 	u32 ctrl0;
3317dd29ee1SLuo bin 	u32 ctrl1;
3327dd29ee1SLuo bin };
3337dd29ee1SLuo bin 
334c3e79bafSAviad Krawczyk struct hinic_cmd_base_qpn {
335c3e79bafSAviad Krawczyk 	u8      status;
336c3e79bafSAviad Krawczyk 	u8      version;
337c3e79bafSAviad Krawczyk 	u8      rsvd0[6];
338c3e79bafSAviad Krawczyk 
339c3e79bafSAviad Krawczyk 	u16     func_idx;
340c3e79bafSAviad Krawczyk 	u16     qpn;
341c3e79bafSAviad Krawczyk };
342c3e79bafSAviad Krawczyk 
34300e57a6dSAviad Krawczyk struct hinic_cmd_hw_ci {
34400e57a6dSAviad Krawczyk 	u8      status;
34500e57a6dSAviad Krawczyk 	u8      version;
34600e57a6dSAviad Krawczyk 	u8      rsvd0[6];
34700e57a6dSAviad Krawczyk 
34800e57a6dSAviad Krawczyk 	u16     func_idx;
34900e57a6dSAviad Krawczyk 
35000e57a6dSAviad Krawczyk 	u8      dma_attr_off;
35100e57a6dSAviad Krawczyk 	u8      pending_limit;
35200e57a6dSAviad Krawczyk 	u8      coalesc_timer;
35300e57a6dSAviad Krawczyk 
35400e57a6dSAviad Krawczyk 	u8      msix_en;
35500e57a6dSAviad Krawczyk 	u16     msix_entry_idx;
35600e57a6dSAviad Krawczyk 
35700e57a6dSAviad Krawczyk 	u32     sq_id;
35800e57a6dSAviad Krawczyk 	u32     rsvd1;
35900e57a6dSAviad Krawczyk 	u64     ci_addr;
36000e57a6dSAviad Krawczyk };
36100e57a6dSAviad Krawczyk 
36272ef908bSLuo bin struct hinic_cmd_l2nic_reset {
36372ef908bSLuo bin 	u8	status;
36472ef908bSLuo bin 	u8	version;
36572ef908bSLuo bin 	u8	rsvd0[6];
36672ef908bSLuo bin 
36772ef908bSLuo bin 	u16	func_id;
36872ef908bSLuo bin 	u16	reset_flag;
36972ef908bSLuo bin };
37072ef908bSLuo bin 
371a0337c0dSLuo bin struct hinic_msix_config {
372a0337c0dSLuo bin 	u8	status;
373a0337c0dSLuo bin 	u8	version;
374a0337c0dSLuo bin 	u8	rsvd0[6];
375a0337c0dSLuo bin 
376a0337c0dSLuo bin 	u16	func_id;
377a0337c0dSLuo bin 	u16	msix_index;
378a0337c0dSLuo bin 	u8	pending_cnt;
379a0337c0dSLuo bin 	u8	coalesce_timer_cnt;
380a0337c0dSLuo bin 	u8	lli_timer_cnt;
381a0337c0dSLuo bin 	u8	lli_credit_cnt;
382a0337c0dSLuo bin 	u8	resend_timer_cnt;
383a0337c0dSLuo bin 	u8	rsvd1[3];
384a0337c0dSLuo bin };
385a0337c0dSLuo bin 
386088c5f0dSLuo bin struct hinic_set_random_id {
387088c5f0dSLuo bin 	u8    status;
388088c5f0dSLuo bin 	u8    version;
389088c5f0dSLuo bin 	u8    rsvd0[6];
390088c5f0dSLuo bin 
391088c5f0dSLuo bin 	u8    vf_in_pf;
392088c5f0dSLuo bin 	u8    rsvd1;
393088c5f0dSLuo bin 	u16   func_idx;
394088c5f0dSLuo bin 	u32   random_id;
395088c5f0dSLuo bin };
396088c5f0dSLuo bin 
3975e126e7cSLuo bin struct hinic_board_info {
3985e126e7cSLuo bin 	u32	board_type;
3995e126e7cSLuo bin 	u32	port_num;
4005e126e7cSLuo bin 	u32	port_speed;
4015e126e7cSLuo bin 	u32	pcie_width;
4025e126e7cSLuo bin 	u32	host_num;
4035e126e7cSLuo bin 	u32	pf_num;
4045e126e7cSLuo bin 	u32	vf_total_num;
4055e126e7cSLuo bin 	u32	tile_num;
4065e126e7cSLuo bin 	u32	qcm_num;
4075e126e7cSLuo bin 	u32	core_num;
4085e126e7cSLuo bin 	u32	work_mode;
4095e126e7cSLuo bin 	u32	service_mode;
4105e126e7cSLuo bin 	u32	pcie_mode;
4115e126e7cSLuo bin 	u32	cfg_addr;
4125e126e7cSLuo bin 	u32	boot_sel;
4135e126e7cSLuo bin 	u32	board_id;
4145e126e7cSLuo bin };
4155e126e7cSLuo bin 
4165e126e7cSLuo bin struct hinic_comm_board_info {
4175e126e7cSLuo bin 	u8	status;
4185e126e7cSLuo bin 	u8	version;
4195e126e7cSLuo bin 	u8	rsvd0[6];
4205e126e7cSLuo bin 
4215e126e7cSLuo bin 	struct hinic_board_info info;
4225e126e7cSLuo bin 
4235e126e7cSLuo bin 	u32	rsvd1[4];
4245e126e7cSLuo bin };
4255e126e7cSLuo bin 
42651ba902aSAviad Krawczyk struct hinic_hwdev {
42751ba902aSAviad Krawczyk 	struct hinic_hwif               *hwif;
42851ba902aSAviad Krawczyk 	struct msix_entry               *msix_entries;
429a5564e7eSAviad Krawczyk 
430a5564e7eSAviad Krawczyk 	struct hinic_aeqs               aeqs;
431c3e79bafSAviad Krawczyk 	struct hinic_func_to_io         func_to_io;
432a425b6e1SLuo bin 	struct hinic_mbox_func_to_func  *func_to_func;
433a5564e7eSAviad Krawczyk 
434a5564e7eSAviad Krawczyk 	struct hinic_cap                nic_cap;
43507afcc7aSLuo bin 	u8				port_id;
436c15850c7SLuo bin 	struct hinic_devlink_priv	*devlink_dev;
43751ba902aSAviad Krawczyk };
43851ba902aSAviad Krawczyk 
439c4d06d2dSAviad Krawczyk struct hinic_nic_cb {
440c4d06d2dSAviad Krawczyk 	void    (*handler)(void *handle, void *buf_in,
441c4d06d2dSAviad Krawczyk 			   u16 in_size, void *buf_out,
442c4d06d2dSAviad Krawczyk 			   u16 *out_size);
443c4d06d2dSAviad Krawczyk 
444c4d06d2dSAviad Krawczyk 	void            *handle;
445c4d06d2dSAviad Krawczyk 	unsigned long   cb_state;
446c4d06d2dSAviad Krawczyk };
447c4d06d2dSAviad Krawczyk 
448c15850c7SLuo bin #define HINIC_COMM_SELF_CMD_MAX 4
449c15850c7SLuo bin 
450c15850c7SLuo bin typedef void (*comm_mgmt_self_msg_proc)(void *handle, void *buf_in, u16 in_size,
451c15850c7SLuo bin 					void *buf_out, u16 *out_size);
452c15850c7SLuo bin 
453c15850c7SLuo bin struct comm_mgmt_self_msg_sub_info {
454c15850c7SLuo bin 	u8 cmd;
455c15850c7SLuo bin 	comm_mgmt_self_msg_proc proc;
456c15850c7SLuo bin };
457c15850c7SLuo bin 
458c15850c7SLuo bin struct comm_mgmt_self_msg_info {
459c15850c7SLuo bin 	u8 cmd_num;
460c15850c7SLuo bin 	struct comm_mgmt_self_msg_sub_info info[HINIC_COMM_SELF_CMD_MAX];
461c15850c7SLuo bin };
462c15850c7SLuo bin 
46351ba902aSAviad Krawczyk struct hinic_pfhwdev {
46451ba902aSAviad Krawczyk 	struct hinic_hwdev              hwdev;
46551ba902aSAviad Krawczyk 
466a5564e7eSAviad Krawczyk 	struct hinic_pf_to_mgmt         pf_to_mgmt;
467c4d06d2dSAviad Krawczyk 
468c4d06d2dSAviad Krawczyk 	struct hinic_nic_cb             nic_cb[HINIC_MGMT_NUM_MSG_CMD];
469c15850c7SLuo bin 
470c15850c7SLuo bin 	struct comm_mgmt_self_msg_info	proc;
47151ba902aSAviad Krawczyk };
47251ba902aSAviad Krawczyk 
4737dd29ee1SLuo bin struct hinic_dev_cap {
4747dd29ee1SLuo bin 	u8      status;
4757dd29ee1SLuo bin 	u8      version;
4767dd29ee1SLuo bin 	u8      rsvd0[6];
4777dd29ee1SLuo bin 
4787dd29ee1SLuo bin 	u8      rsvd1[5];
4797dd29ee1SLuo bin 	u8      intr_type;
4807dd29ee1SLuo bin 	u8	max_cos_id;
4817dd29ee1SLuo bin 	u8	er_id;
4827dd29ee1SLuo bin 	u8	port_id;
4837dd29ee1SLuo bin 	u8      max_vf;
4847dd29ee1SLuo bin 	u8      rsvd2[62];
4857dd29ee1SLuo bin 	u16     max_sqs;
4867dd29ee1SLuo bin 	u16	max_rqs;
4877dd29ee1SLuo bin 	u16	max_vf_sqs;
4887dd29ee1SLuo bin 	u16     max_vf_rqs;
4897dd29ee1SLuo bin 	u8      rsvd3[204];
4907dd29ee1SLuo bin };
4917dd29ee1SLuo bin 
492c15850c7SLuo bin union hinic_fault_hw_mgmt {
493c15850c7SLuo bin 	u32 val[4];
494c15850c7SLuo bin 	/* valid only type == FAULT_TYPE_CHIP */
495c15850c7SLuo bin 	struct {
496c15850c7SLuo bin 		u8 node_id;
497c15850c7SLuo bin 		u8 err_level;
498c15850c7SLuo bin 		u16 err_type;
499c15850c7SLuo bin 		u32 err_csr_addr;
500c15850c7SLuo bin 		u32 err_csr_value;
501c15850c7SLuo bin 		/* func_id valid only if err_level == FAULT_LEVEL_SERIOUS_FLR */
502c15850c7SLuo bin 		u16 func_id;
503c15850c7SLuo bin 		u16 rsvd2;
504c15850c7SLuo bin 	} chip;
505c15850c7SLuo bin 
506c15850c7SLuo bin 	/* valid only if type == FAULT_TYPE_UCODE */
507c15850c7SLuo bin 	struct {
508c15850c7SLuo bin 		u8 cause_id;
509c15850c7SLuo bin 		u8 core_id;
510c15850c7SLuo bin 		u8 c_id;
511c15850c7SLuo bin 		u8 rsvd3;
512c15850c7SLuo bin 		u32 epc;
513c15850c7SLuo bin 		u32 rsvd4;
514c15850c7SLuo bin 		u32 rsvd5;
515c15850c7SLuo bin 	} ucode;
516c15850c7SLuo bin 
517c15850c7SLuo bin 	/* valid only if type == FAULT_TYPE_MEM_RD_TIMEOUT ||
518c15850c7SLuo bin 	 * FAULT_TYPE_MEM_WR_TIMEOUT
519c15850c7SLuo bin 	 */
520c15850c7SLuo bin 	struct {
521c15850c7SLuo bin 		u32 err_csr_ctrl;
522c15850c7SLuo bin 		u32 err_csr_data;
523c15850c7SLuo bin 		u32 ctrl_tab;
524c15850c7SLuo bin 		u32 mem_index;
525c15850c7SLuo bin 	} mem_timeout;
526c15850c7SLuo bin 
527c15850c7SLuo bin 	/* valid only if type == FAULT_TYPE_REG_RD_TIMEOUT ||
528c15850c7SLuo bin 	 * FAULT_TYPE_REG_WR_TIMEOUT
529c15850c7SLuo bin 	 */
530c15850c7SLuo bin 	struct {
531c15850c7SLuo bin 		u32 err_csr;
532c15850c7SLuo bin 		u32 rsvd6;
533c15850c7SLuo bin 		u32 rsvd7;
534c15850c7SLuo bin 		u32 rsvd8;
535c15850c7SLuo bin 	} reg_timeout;
536c15850c7SLuo bin 
537c15850c7SLuo bin 	struct {
538c15850c7SLuo bin 		/* 0: read; 1: write */
539c15850c7SLuo bin 		u8 op_type;
540c15850c7SLuo bin 		u8 port_id;
541c15850c7SLuo bin 		u8 dev_ad;
542c15850c7SLuo bin 		u8 rsvd9;
543c15850c7SLuo bin 		u32 csr_addr;
544c15850c7SLuo bin 		u32 op_data;
545c15850c7SLuo bin 		u32 rsvd10;
546c15850c7SLuo bin 	} phy_fault;
547c15850c7SLuo bin };
548c15850c7SLuo bin 
549c15850c7SLuo bin struct hinic_fault_event {
550c15850c7SLuo bin 	u8 type;
551c15850c7SLuo bin 	u8 fault_level;
552c15850c7SLuo bin 	u8 rsvd0[2];
553c15850c7SLuo bin 	union hinic_fault_hw_mgmt event;
554c15850c7SLuo bin };
555c15850c7SLuo bin 
556c15850c7SLuo bin struct hinic_cmd_fault_event {
557c15850c7SLuo bin 	u8	status;
558c15850c7SLuo bin 	u8	version;
559c15850c7SLuo bin 	u8	rsvd0[6];
560c15850c7SLuo bin 
561c15850c7SLuo bin 	struct hinic_fault_event event;
562c15850c7SLuo bin };
563c15850c7SLuo bin 
564c15850c7SLuo bin enum hinic_fault_type {
565c15850c7SLuo bin 	FAULT_TYPE_CHIP,
566c15850c7SLuo bin 	FAULT_TYPE_UCODE,
567c15850c7SLuo bin 	FAULT_TYPE_MEM_RD_TIMEOUT,
568c15850c7SLuo bin 	FAULT_TYPE_MEM_WR_TIMEOUT,
569c15850c7SLuo bin 	FAULT_TYPE_REG_RD_TIMEOUT,
570c15850c7SLuo bin 	FAULT_TYPE_REG_WR_TIMEOUT,
571c15850c7SLuo bin 	FAULT_TYPE_PHY_FAULT,
572c15850c7SLuo bin 	FAULT_TYPE_MAX,
573c15850c7SLuo bin };
574c15850c7SLuo bin 
575c15850c7SLuo bin enum hinic_fault_err_level {
576c15850c7SLuo bin 	FAULT_LEVEL_FATAL,
577c15850c7SLuo bin 	FAULT_LEVEL_SERIOUS_RESET,
578c15850c7SLuo bin 	FAULT_LEVEL_SERIOUS_FLR,
579c15850c7SLuo bin 	FAULT_LEVEL_GENERAL,
580c15850c7SLuo bin 	FAULT_LEVEL_SUGGESTION,
581c15850c7SLuo bin 	FAULT_LEVEL_MAX
582c15850c7SLuo bin };
583c15850c7SLuo bin 
584c15850c7SLuo bin struct hinic_mgmt_watchdog_info {
585c15850c7SLuo bin 	u8 status;
586c15850c7SLuo bin 	u8 version;
587c15850c7SLuo bin 	u8 rsvd0[6];
588c15850c7SLuo bin 
589c15850c7SLuo bin 	u32 curr_time_h;
590c15850c7SLuo bin 	u32 curr_time_l;
591c15850c7SLuo bin 	u32 task_id;
592c15850c7SLuo bin 	u32 rsv;
593c15850c7SLuo bin 
594c15850c7SLuo bin 	u32 reg[13];
595c15850c7SLuo bin 	u32 pc;
596c15850c7SLuo bin 	u32 lr;
597c15850c7SLuo bin 	u32 cpsr;
598c15850c7SLuo bin 
599c15850c7SLuo bin 	u32 stack_top;
600c15850c7SLuo bin 	u32 stack_bottom;
601c15850c7SLuo bin 	u32 sp;
602c15850c7SLuo bin 	u32 curr_used;
603c15850c7SLuo bin 	u32 peak_used;
604c15850c7SLuo bin 	u32 is_overflow;
605c15850c7SLuo bin 
606c15850c7SLuo bin 	u32 stack_actlen;
607c15850c7SLuo bin 	u8 data[1024];
608c15850c7SLuo bin };
609c15850c7SLuo bin 
610c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_register(struct hinic_hwdev *hwdev,
611c4d06d2dSAviad Krawczyk 			     enum hinic_mgmt_msg_cmd cmd, void *handle,
612c4d06d2dSAviad Krawczyk 			     void (*handler)(void *handle, void *buf_in,
613c4d06d2dSAviad Krawczyk 					     u16 in_size, void *buf_out,
614c4d06d2dSAviad Krawczyk 					     u16 *out_size));
615c4d06d2dSAviad Krawczyk 
616c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_unregister(struct hinic_hwdev *hwdev,
617c4d06d2dSAviad Krawczyk 			       enum hinic_mgmt_msg_cmd cmd);
618c4d06d2dSAviad Krawczyk 
61925a3ba61SAviad Krawczyk int hinic_port_msg_cmd(struct hinic_hwdev *hwdev, enum hinic_port_cmd cmd,
62025a3ba61SAviad Krawczyk 		       void *buf_in, u16 in_size, void *buf_out,
62125a3ba61SAviad Krawczyk 		       u16 *out_size);
62225a3ba61SAviad Krawczyk 
62301f2b3daSLuo bin int hinic_hilink_msg_cmd(struct hinic_hwdev *hwdev, enum hinic_hilink_cmd cmd,
62401f2b3daSLuo bin 			 void *buf_in, u16 in_size, void *buf_out,
62501f2b3daSLuo bin 			 u16 *out_size);
62601f2b3daSLuo bin 
627bcab6782SLuo bin int hinic_hwdev_ifup(struct hinic_hwdev *hwdev, u16 sq_depth, u16 rq_depth);
628c3e79bafSAviad Krawczyk 
629c3e79bafSAviad Krawczyk void hinic_hwdev_ifdown(struct hinic_hwdev *hwdev);
630c3e79bafSAviad Krawczyk 
631c15850c7SLuo bin struct hinic_hwdev *hinic_init_hwdev(struct pci_dev *pdev, struct devlink *devlink);
63251ba902aSAviad Krawczyk 
63351ba902aSAviad Krawczyk void hinic_free_hwdev(struct hinic_hwdev *hwdev);
63451ba902aSAviad Krawczyk 
63551ba902aSAviad Krawczyk int hinic_hwdev_num_qps(struct hinic_hwdev *hwdev);
63651ba902aSAviad Krawczyk 
637c3e79bafSAviad Krawczyk struct hinic_sq *hinic_hwdev_get_sq(struct hinic_hwdev *hwdev, int i);
638c3e79bafSAviad Krawczyk 
639c3e79bafSAviad Krawczyk struct hinic_rq *hinic_hwdev_get_rq(struct hinic_hwdev *hwdev, int i);
640c3e79bafSAviad Krawczyk 
641e2585ea7SAviad Krawczyk int hinic_hwdev_msix_cnt_set(struct hinic_hwdev *hwdev, u16 msix_index);
642e2585ea7SAviad Krawczyk 
643e2585ea7SAviad Krawczyk int hinic_hwdev_msix_set(struct hinic_hwdev *hwdev, u16 msix_index,
644e2585ea7SAviad Krawczyk 			 u8 pending_limit, u8 coalesc_timer,
645e2585ea7SAviad Krawczyk 			 u8 lli_timer_cfg, u8 lli_credit_limit,
646e2585ea7SAviad Krawczyk 			 u8 resend_timer);
647e2585ea7SAviad Krawczyk 
64800e57a6dSAviad Krawczyk int hinic_hwdev_hw_ci_addr_set(struct hinic_hwdev *hwdev, struct hinic_sq *sq,
64900e57a6dSAviad Krawczyk 			       u8 pending_limit, u8 coalesc_timer);
65000e57a6dSAviad Krawczyk 
651905b464aSXue Chaojing void hinic_hwdev_set_msix_state(struct hinic_hwdev *hwdev, u16 msix_index,
652905b464aSXue Chaojing 				enum hinic_msix_state flag);
653905b464aSXue Chaojing 
654a0337c0dSLuo bin int hinic_set_interrupt_cfg(struct hinic_hwdev *hwdev,
655a0337c0dSLuo bin 			    struct hinic_msix_config *interrupt_info);
656a0337c0dSLuo bin 
6575e126e7cSLuo bin int hinic_get_board_info(struct hinic_hwdev *hwdev,
6585e126e7cSLuo bin 			 struct hinic_comm_board_info *board_info);
6595e126e7cSLuo bin 
66051ba902aSAviad Krawczyk #endif
661