xref: /linux/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h (revision e54fbbdf5a2944f084b170cd2b7ffdfa00bf3990)
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>
1351ba902aSAviad Krawczyk 
1451ba902aSAviad Krawczyk #include "hinic_hw_if.h"
15a5564e7eSAviad Krawczyk #include "hinic_hw_eqs.h"
16a5564e7eSAviad Krawczyk #include "hinic_hw_mgmt.h"
17c3e79bafSAviad Krawczyk #include "hinic_hw_qp.h"
18c3e79bafSAviad Krawczyk #include "hinic_hw_io.h"
1951ba902aSAviad Krawczyk 
2051ba902aSAviad Krawczyk #define HINIC_MAX_QPS   32
2151ba902aSAviad Krawczyk 
22c4d06d2dSAviad Krawczyk #define HINIC_MGMT_NUM_MSG_CMD  (HINIC_MGMT_MSG_CMD_MAX - \
23c4d06d2dSAviad Krawczyk 				 HINIC_MGMT_MSG_CMD_BASE)
24c4d06d2dSAviad Krawczyk 
25a5564e7eSAviad Krawczyk struct hinic_cap {
26a5564e7eSAviad Krawczyk 	u16     max_qps;
27a5564e7eSAviad Krawczyk 	u16     num_qps;
28a5564e7eSAviad Krawczyk };
29a5564e7eSAviad Krawczyk 
3025a3ba61SAviad Krawczyk enum hinic_port_cmd {
3125a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_CHANGE_MTU       = 2,
3225a3ba61SAviad Krawczyk 
3325a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_ADD_VLAN         = 3,
3425a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_DEL_VLAN         = 4,
3525a3ba61SAviad Krawczyk 
3625a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_MAC          = 9,
3725a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_MAC          = 10,
3825a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_DEL_MAC          = 11,
3925a3ba61SAviad Krawczyk 
4025a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_RX_MODE      = 12,
4125a3ba61SAviad Krawczyk 
4225a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_LINK_STATE   = 24,
4325a3ba61SAviad Krawczyk 
441e007181SXue Chaojing 	HINIC_PORT_CMD_SET_LRO		= 25,
451e007181SXue Chaojing 
464a61abb1SXue Chaojing 	HINIC_PORT_CMD_SET_RX_CSUM	= 26,
474a61abb1SXue Chaojing 
48*e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_GET_PORT_STATISTICS = 28,
49*e54fbbdfSXue Chaojing 
50*e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_CLEAR_PORT_STATISTICS = 29,
51*e54fbbdfSXue Chaojing 
52*e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_GET_VPORT_STAT	= 30,
53*e54fbbdfSXue Chaojing 
54*e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_CLEAN_VPORT_STAT	= 31,
55*e54fbbdfSXue Chaojing 
564fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_TEMPLATE_INDIR_TBL = 37,
574fdc51bbSXue Chaojing 
5825a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_PORT_STATE   = 41,
5925a3ba61SAviad Krawczyk 
60421e9526SXue Chaojing 	HINIC_PORT_CMD_SET_RSS_TEMPLATE_TBL = 43,
61421e9526SXue Chaojing 
624fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_TEMPLATE_TBL = 44,
634fdc51bbSXue Chaojing 
64421e9526SXue Chaojing 	HINIC_PORT_CMD_SET_RSS_HASH_ENGINE = 45,
65421e9526SXue Chaojing 
664fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_HASH_ENGINE = 46,
674fdc51bbSXue Chaojing 
684fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_CTX_TBL  = 47,
694fdc51bbSXue Chaojing 
704fdc51bbSXue Chaojing 	HINIC_PORT_CMD_SET_RSS_CTX_TBL  = 48,
714fdc51bbSXue Chaojing 
72421e9526SXue Chaojing 	HINIC_PORT_CMD_RSS_TEMP_MGR	= 49,
73421e9526SXue Chaojing 
74421e9526SXue Chaojing 	HINIC_PORT_CMD_RSS_CFG		= 66,
75421e9526SXue Chaojing 
7625a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_FWCTXT_INIT      = 69,
7725a3ba61SAviad Krawczyk 
7825a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_FUNC_STATE   = 93,
7925a3ba61SAviad Krawczyk 
8025a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_GLOBAL_QPN   = 102,
8125a3ba61SAviad Krawczyk 
82cc18a754SZhao Chen 	HINIC_PORT_CMD_SET_TSO          = 112,
83cc18a754SZhao Chen 
841e007181SXue Chaojing 	HINIC_PORT_CMD_SET_RQ_IQ_MAP	= 115,
851e007181SXue Chaojing 
8625a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_CAP          = 170,
871e007181SXue Chaojing 
881e007181SXue Chaojing 	HINIC_PORT_CMD_SET_LRO_TIMER	= 244,
8925a3ba61SAviad Krawczyk };
9025a3ba61SAviad Krawczyk 
91421e9526SXue Chaojing enum hinic_ucode_cmd {
92421e9526SXue Chaojing 	HINIC_UCODE_CMD_MODIFY_QUEUE_CONTEXT    = 0,
93421e9526SXue Chaojing 	HINIC_UCODE_CMD_CLEAN_QUEUE_CONTEXT,
94421e9526SXue Chaojing 	HINIC_UCODE_CMD_ARM_SQ,
95421e9526SXue Chaojing 	HINIC_UCODE_CMD_ARM_RQ,
96421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RSS_INDIR_TABLE,
97421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RSS_CONTEXT_TABLE,
98421e9526SXue Chaojing 	HINIC_UCODE_CMD_GET_RSS_INDIR_TABLE,
99421e9526SXue Chaojing 	HINIC_UCODE_CMD_GET_RSS_CONTEXT_TABLE,
100421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_IQ_ENABLE,
101421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RQ_FLUSH            = 10
102421e9526SXue Chaojing };
103421e9526SXue Chaojing 
104421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_ALLOC  0x01
105421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_FREE   0x02
106421e9526SXue Chaojing 
107c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd {
108c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_BASE         = 160,
109c4d06d2dSAviad Krawczyk 
110c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_LINK_STATUS  = 160,
111c4d06d2dSAviad Krawczyk 
112c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_MAX,
113c4d06d2dSAviad Krawczyk };
114c4d06d2dSAviad Krawczyk 
115c4d06d2dSAviad Krawczyk enum hinic_cb_state {
116c4d06d2dSAviad Krawczyk 	HINIC_CB_ENABLED = BIT(0),
117c4d06d2dSAviad Krawczyk 	HINIC_CB_RUNNING = BIT(1),
118c4d06d2dSAviad Krawczyk };
119c4d06d2dSAviad Krawczyk 
120e2585ea7SAviad Krawczyk enum hinic_res_state {
121e2585ea7SAviad Krawczyk 	HINIC_RES_CLEAN         = 0,
122e2585ea7SAviad Krawczyk 	HINIC_RES_ACTIVE        = 1,
123e2585ea7SAviad Krawczyk };
124e2585ea7SAviad Krawczyk 
125e2585ea7SAviad Krawczyk struct hinic_cmd_fw_ctxt {
126e2585ea7SAviad Krawczyk 	u8      status;
127e2585ea7SAviad Krawczyk 	u8      version;
128e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
129e2585ea7SAviad Krawczyk 
130e2585ea7SAviad Krawczyk 	u16     func_idx;
131e2585ea7SAviad Krawczyk 	u16     rx_buf_sz;
132e2585ea7SAviad Krawczyk 
133e2585ea7SAviad Krawczyk 	u32     rsvd1;
134e2585ea7SAviad Krawczyk };
135e2585ea7SAviad Krawczyk 
136e2585ea7SAviad Krawczyk struct hinic_cmd_hw_ioctxt {
137e2585ea7SAviad Krawczyk 	u8      status;
138e2585ea7SAviad Krawczyk 	u8      version;
139e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
140e2585ea7SAviad Krawczyk 
141e2585ea7SAviad Krawczyk 	u16     func_idx;
142e2585ea7SAviad Krawczyk 
143e2585ea7SAviad Krawczyk 	u16     rsvd1;
144e2585ea7SAviad Krawczyk 
145e2585ea7SAviad Krawczyk 	u8      set_cmdq_depth;
146e2585ea7SAviad Krawczyk 	u8      cmdq_depth;
147e2585ea7SAviad Krawczyk 
1481e007181SXue Chaojing 	u8      lro_en;
149e2585ea7SAviad Krawczyk 	u8      rsvd3;
150e2585ea7SAviad Krawczyk 	u8      rsvd4;
151e2585ea7SAviad Krawczyk 	u8      rsvd5;
152e2585ea7SAviad Krawczyk 
153e2585ea7SAviad Krawczyk 	u16     rq_depth;
154e2585ea7SAviad Krawczyk 	u16     rx_buf_sz_idx;
155e2585ea7SAviad Krawczyk 	u16     sq_depth;
156e2585ea7SAviad Krawczyk };
157e2585ea7SAviad Krawczyk 
158e2585ea7SAviad Krawczyk struct hinic_cmd_io_status {
159e2585ea7SAviad Krawczyk 	u8      status;
160e2585ea7SAviad Krawczyk 	u8      version;
161e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
162e2585ea7SAviad Krawczyk 
163e2585ea7SAviad Krawczyk 	u16     func_idx;
164e2585ea7SAviad Krawczyk 	u8      rsvd1;
165e2585ea7SAviad Krawczyk 	u8      rsvd2;
166e2585ea7SAviad Krawczyk 	u32     io_status;
167e2585ea7SAviad Krawczyk };
168e2585ea7SAviad Krawczyk 
169e2585ea7SAviad Krawczyk struct hinic_cmd_clear_io_res {
170e2585ea7SAviad Krawczyk 	u8      status;
171e2585ea7SAviad Krawczyk 	u8      version;
172e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
173e2585ea7SAviad Krawczyk 
174e2585ea7SAviad Krawczyk 	u16     func_idx;
175e2585ea7SAviad Krawczyk 	u8      rsvd1;
176e2585ea7SAviad Krawczyk 	u8      rsvd2;
177e2585ea7SAviad Krawczyk };
178e2585ea7SAviad Krawczyk 
179e2585ea7SAviad Krawczyk struct hinic_cmd_set_res_state {
180e2585ea7SAviad Krawczyk 	u8      status;
181e2585ea7SAviad Krawczyk 	u8      version;
182e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
183e2585ea7SAviad Krawczyk 
184e2585ea7SAviad Krawczyk 	u16     func_idx;
185e2585ea7SAviad Krawczyk 	u8      state;
186e2585ea7SAviad Krawczyk 	u8      rsvd1;
187e2585ea7SAviad Krawczyk 	u32     rsvd2;
188e2585ea7SAviad Krawczyk };
189e2585ea7SAviad Krawczyk 
190c3e79bafSAviad Krawczyk struct hinic_cmd_base_qpn {
191c3e79bafSAviad Krawczyk 	u8      status;
192c3e79bafSAviad Krawczyk 	u8      version;
193c3e79bafSAviad Krawczyk 	u8      rsvd0[6];
194c3e79bafSAviad Krawczyk 
195c3e79bafSAviad Krawczyk 	u16     func_idx;
196c3e79bafSAviad Krawczyk 	u16     qpn;
197c3e79bafSAviad Krawczyk };
198c3e79bafSAviad Krawczyk 
19900e57a6dSAviad Krawczyk struct hinic_cmd_hw_ci {
20000e57a6dSAviad Krawczyk 	u8      status;
20100e57a6dSAviad Krawczyk 	u8      version;
20200e57a6dSAviad Krawczyk 	u8      rsvd0[6];
20300e57a6dSAviad Krawczyk 
20400e57a6dSAviad Krawczyk 	u16     func_idx;
20500e57a6dSAviad Krawczyk 
20600e57a6dSAviad Krawczyk 	u8      dma_attr_off;
20700e57a6dSAviad Krawczyk 	u8      pending_limit;
20800e57a6dSAviad Krawczyk 	u8      coalesc_timer;
20900e57a6dSAviad Krawczyk 
21000e57a6dSAviad Krawczyk 	u8      msix_en;
21100e57a6dSAviad Krawczyk 	u16     msix_entry_idx;
21200e57a6dSAviad Krawczyk 
21300e57a6dSAviad Krawczyk 	u32     sq_id;
21400e57a6dSAviad Krawczyk 	u32     rsvd1;
21500e57a6dSAviad Krawczyk 	u64     ci_addr;
21600e57a6dSAviad Krawczyk };
21700e57a6dSAviad Krawczyk 
21851ba902aSAviad Krawczyk struct hinic_hwdev {
21951ba902aSAviad Krawczyk 	struct hinic_hwif               *hwif;
22051ba902aSAviad Krawczyk 	struct msix_entry               *msix_entries;
221a5564e7eSAviad Krawczyk 
222a5564e7eSAviad Krawczyk 	struct hinic_aeqs               aeqs;
223c3e79bafSAviad Krawczyk 	struct hinic_func_to_io         func_to_io;
224a5564e7eSAviad Krawczyk 
225a5564e7eSAviad Krawczyk 	struct hinic_cap                nic_cap;
22651ba902aSAviad Krawczyk };
22751ba902aSAviad Krawczyk 
228c4d06d2dSAviad Krawczyk struct hinic_nic_cb {
229c4d06d2dSAviad Krawczyk 	void    (*handler)(void *handle, void *buf_in,
230c4d06d2dSAviad Krawczyk 			   u16 in_size, void *buf_out,
231c4d06d2dSAviad Krawczyk 			   u16 *out_size);
232c4d06d2dSAviad Krawczyk 
233c4d06d2dSAviad Krawczyk 	void            *handle;
234c4d06d2dSAviad Krawczyk 	unsigned long   cb_state;
235c4d06d2dSAviad Krawczyk };
236c4d06d2dSAviad Krawczyk 
23751ba902aSAviad Krawczyk struct hinic_pfhwdev {
23851ba902aSAviad Krawczyk 	struct hinic_hwdev              hwdev;
23951ba902aSAviad Krawczyk 
240a5564e7eSAviad Krawczyk 	struct hinic_pf_to_mgmt         pf_to_mgmt;
241c4d06d2dSAviad Krawczyk 
242c4d06d2dSAviad Krawczyk 	struct hinic_nic_cb             nic_cb[HINIC_MGMT_NUM_MSG_CMD];
24351ba902aSAviad Krawczyk };
24451ba902aSAviad Krawczyk 
245c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_register(struct hinic_hwdev *hwdev,
246c4d06d2dSAviad Krawczyk 			     enum hinic_mgmt_msg_cmd cmd, void *handle,
247c4d06d2dSAviad Krawczyk 			     void (*handler)(void *handle, void *buf_in,
248c4d06d2dSAviad Krawczyk 					     u16 in_size, void *buf_out,
249c4d06d2dSAviad Krawczyk 					     u16 *out_size));
250c4d06d2dSAviad Krawczyk 
251c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_unregister(struct hinic_hwdev *hwdev,
252c4d06d2dSAviad Krawczyk 			       enum hinic_mgmt_msg_cmd cmd);
253c4d06d2dSAviad Krawczyk 
25425a3ba61SAviad Krawczyk int hinic_port_msg_cmd(struct hinic_hwdev *hwdev, enum hinic_port_cmd cmd,
25525a3ba61SAviad Krawczyk 		       void *buf_in, u16 in_size, void *buf_out,
25625a3ba61SAviad Krawczyk 		       u16 *out_size);
25725a3ba61SAviad Krawczyk 
258c3e79bafSAviad Krawczyk int hinic_hwdev_ifup(struct hinic_hwdev *hwdev);
259c3e79bafSAviad Krawczyk 
260c3e79bafSAviad Krawczyk void hinic_hwdev_ifdown(struct hinic_hwdev *hwdev);
261c3e79bafSAviad Krawczyk 
26251ba902aSAviad Krawczyk struct hinic_hwdev *hinic_init_hwdev(struct pci_dev *pdev);
26351ba902aSAviad Krawczyk 
26451ba902aSAviad Krawczyk void hinic_free_hwdev(struct hinic_hwdev *hwdev);
26551ba902aSAviad Krawczyk 
266421e9526SXue Chaojing int hinic_hwdev_max_num_qps(struct hinic_hwdev *hwdev);
267421e9526SXue Chaojing 
26851ba902aSAviad Krawczyk int hinic_hwdev_num_qps(struct hinic_hwdev *hwdev);
26951ba902aSAviad Krawczyk 
270c3e79bafSAviad Krawczyk struct hinic_sq *hinic_hwdev_get_sq(struct hinic_hwdev *hwdev, int i);
271c3e79bafSAviad Krawczyk 
272c3e79bafSAviad Krawczyk struct hinic_rq *hinic_hwdev_get_rq(struct hinic_hwdev *hwdev, int i);
273c3e79bafSAviad Krawczyk 
274e2585ea7SAviad Krawczyk int hinic_hwdev_msix_cnt_set(struct hinic_hwdev *hwdev, u16 msix_index);
275e2585ea7SAviad Krawczyk 
276e2585ea7SAviad Krawczyk int hinic_hwdev_msix_set(struct hinic_hwdev *hwdev, u16 msix_index,
277e2585ea7SAviad Krawczyk 			 u8 pending_limit, u8 coalesc_timer,
278e2585ea7SAviad Krawczyk 			 u8 lli_timer_cfg, u8 lli_credit_limit,
279e2585ea7SAviad Krawczyk 			 u8 resend_timer);
280e2585ea7SAviad Krawczyk 
28100e57a6dSAviad Krawczyk int hinic_hwdev_hw_ci_addr_set(struct hinic_hwdev *hwdev, struct hinic_sq *sq,
28200e57a6dSAviad Krawczyk 			       u8 pending_limit, u8 coalesc_timer);
28300e57a6dSAviad Krawczyk 
284905b464aSXue Chaojing void hinic_hwdev_set_msix_state(struct hinic_hwdev *hwdev, u16 msix_index,
285905b464aSXue Chaojing 				enum hinic_msix_state flag);
286905b464aSXue Chaojing 
28751ba902aSAviad Krawczyk #endif
288