xref: /linux/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h (revision aebd17b7685499156b8bc976c66a12396f76d0a7)
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*aebd17b7SXue Chaojing 	HINIC_PORT_CMD_SET_RX_VLAN_OFFLOAD = 27,
49*aebd17b7SXue Chaojing 
50e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_GET_PORT_STATISTICS = 28,
51e54fbbdfSXue Chaojing 
52e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_CLEAR_PORT_STATISTICS = 29,
53e54fbbdfSXue Chaojing 
54e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_GET_VPORT_STAT	= 30,
55e54fbbdfSXue Chaojing 
56e54fbbdfSXue Chaojing 	HINIC_PORT_CMD_CLEAN_VPORT_STAT	= 31,
57e54fbbdfSXue Chaojing 
584fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_TEMPLATE_INDIR_TBL = 37,
594fdc51bbSXue Chaojing 
6025a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_PORT_STATE   = 41,
6125a3ba61SAviad Krawczyk 
62421e9526SXue Chaojing 	HINIC_PORT_CMD_SET_RSS_TEMPLATE_TBL = 43,
63421e9526SXue Chaojing 
644fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_TEMPLATE_TBL = 44,
654fdc51bbSXue Chaojing 
66421e9526SXue Chaojing 	HINIC_PORT_CMD_SET_RSS_HASH_ENGINE = 45,
67421e9526SXue Chaojing 
684fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_HASH_ENGINE = 46,
694fdc51bbSXue Chaojing 
704fdc51bbSXue Chaojing 	HINIC_PORT_CMD_GET_RSS_CTX_TBL  = 47,
714fdc51bbSXue Chaojing 
724fdc51bbSXue Chaojing 	HINIC_PORT_CMD_SET_RSS_CTX_TBL  = 48,
734fdc51bbSXue Chaojing 
74421e9526SXue Chaojing 	HINIC_PORT_CMD_RSS_TEMP_MGR	= 49,
75421e9526SXue Chaojing 
76421e9526SXue Chaojing 	HINIC_PORT_CMD_RSS_CFG		= 66,
77421e9526SXue Chaojing 
7825a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_FWCTXT_INIT      = 69,
7925a3ba61SAviad Krawczyk 
8025a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_FUNC_STATE   = 93,
8125a3ba61SAviad Krawczyk 
8225a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_GLOBAL_QPN   = 102,
8325a3ba61SAviad Krawczyk 
84cc18a754SZhao Chen 	HINIC_PORT_CMD_SET_TSO          = 112,
85cc18a754SZhao Chen 
861e007181SXue Chaojing 	HINIC_PORT_CMD_SET_RQ_IQ_MAP	= 115,
871e007181SXue Chaojing 
8825a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_CAP          = 170,
891e007181SXue Chaojing 
901e007181SXue Chaojing 	HINIC_PORT_CMD_SET_LRO_TIMER	= 244,
9125a3ba61SAviad Krawczyk };
9225a3ba61SAviad Krawczyk 
93421e9526SXue Chaojing enum hinic_ucode_cmd {
94421e9526SXue Chaojing 	HINIC_UCODE_CMD_MODIFY_QUEUE_CONTEXT    = 0,
95421e9526SXue Chaojing 	HINIC_UCODE_CMD_CLEAN_QUEUE_CONTEXT,
96421e9526SXue Chaojing 	HINIC_UCODE_CMD_ARM_SQ,
97421e9526SXue Chaojing 	HINIC_UCODE_CMD_ARM_RQ,
98421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RSS_INDIR_TABLE,
99421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RSS_CONTEXT_TABLE,
100421e9526SXue Chaojing 	HINIC_UCODE_CMD_GET_RSS_INDIR_TABLE,
101421e9526SXue Chaojing 	HINIC_UCODE_CMD_GET_RSS_CONTEXT_TABLE,
102421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_IQ_ENABLE,
103421e9526SXue Chaojing 	HINIC_UCODE_CMD_SET_RQ_FLUSH            = 10
104421e9526SXue Chaojing };
105421e9526SXue Chaojing 
106421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_ALLOC  0x01
107421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_FREE   0x02
108421e9526SXue Chaojing 
109c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd {
110c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_BASE         = 160,
111c4d06d2dSAviad Krawczyk 
112c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_LINK_STATUS  = 160,
113c4d06d2dSAviad Krawczyk 
114c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_MAX,
115c4d06d2dSAviad Krawczyk };
116c4d06d2dSAviad Krawczyk 
117c4d06d2dSAviad Krawczyk enum hinic_cb_state {
118c4d06d2dSAviad Krawczyk 	HINIC_CB_ENABLED = BIT(0),
119c4d06d2dSAviad Krawczyk 	HINIC_CB_RUNNING = BIT(1),
120c4d06d2dSAviad Krawczyk };
121c4d06d2dSAviad Krawczyk 
122e2585ea7SAviad Krawczyk enum hinic_res_state {
123e2585ea7SAviad Krawczyk 	HINIC_RES_CLEAN         = 0,
124e2585ea7SAviad Krawczyk 	HINIC_RES_ACTIVE        = 1,
125e2585ea7SAviad Krawczyk };
126e2585ea7SAviad Krawczyk 
127e2585ea7SAviad Krawczyk struct hinic_cmd_fw_ctxt {
128e2585ea7SAviad Krawczyk 	u8      status;
129e2585ea7SAviad Krawczyk 	u8      version;
130e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
131e2585ea7SAviad Krawczyk 
132e2585ea7SAviad Krawczyk 	u16     func_idx;
133e2585ea7SAviad Krawczyk 	u16     rx_buf_sz;
134e2585ea7SAviad Krawczyk 
135e2585ea7SAviad Krawczyk 	u32     rsvd1;
136e2585ea7SAviad Krawczyk };
137e2585ea7SAviad Krawczyk 
138e2585ea7SAviad Krawczyk struct hinic_cmd_hw_ioctxt {
139e2585ea7SAviad Krawczyk 	u8      status;
140e2585ea7SAviad Krawczyk 	u8      version;
141e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
142e2585ea7SAviad Krawczyk 
143e2585ea7SAviad Krawczyk 	u16     func_idx;
144e2585ea7SAviad Krawczyk 
145e2585ea7SAviad Krawczyk 	u16     rsvd1;
146e2585ea7SAviad Krawczyk 
147e2585ea7SAviad Krawczyk 	u8      set_cmdq_depth;
148e2585ea7SAviad Krawczyk 	u8      cmdq_depth;
149e2585ea7SAviad Krawczyk 
1501e007181SXue Chaojing 	u8      lro_en;
151e2585ea7SAviad Krawczyk 	u8      rsvd3;
152e2585ea7SAviad Krawczyk 	u8      rsvd4;
153e2585ea7SAviad Krawczyk 	u8      rsvd5;
154e2585ea7SAviad Krawczyk 
155e2585ea7SAviad Krawczyk 	u16     rq_depth;
156e2585ea7SAviad Krawczyk 	u16     rx_buf_sz_idx;
157e2585ea7SAviad Krawczyk 	u16     sq_depth;
158e2585ea7SAviad Krawczyk };
159e2585ea7SAviad Krawczyk 
160e2585ea7SAviad Krawczyk struct hinic_cmd_io_status {
161e2585ea7SAviad Krawczyk 	u8      status;
162e2585ea7SAviad Krawczyk 	u8      version;
163e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
164e2585ea7SAviad Krawczyk 
165e2585ea7SAviad Krawczyk 	u16     func_idx;
166e2585ea7SAviad Krawczyk 	u8      rsvd1;
167e2585ea7SAviad Krawczyk 	u8      rsvd2;
168e2585ea7SAviad Krawczyk 	u32     io_status;
169e2585ea7SAviad Krawczyk };
170e2585ea7SAviad Krawczyk 
171e2585ea7SAviad Krawczyk struct hinic_cmd_clear_io_res {
172e2585ea7SAviad Krawczyk 	u8      status;
173e2585ea7SAviad Krawczyk 	u8      version;
174e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
175e2585ea7SAviad Krawczyk 
176e2585ea7SAviad Krawczyk 	u16     func_idx;
177e2585ea7SAviad Krawczyk 	u8      rsvd1;
178e2585ea7SAviad Krawczyk 	u8      rsvd2;
179e2585ea7SAviad Krawczyk };
180e2585ea7SAviad Krawczyk 
181e2585ea7SAviad Krawczyk struct hinic_cmd_set_res_state {
182e2585ea7SAviad Krawczyk 	u8      status;
183e2585ea7SAviad Krawczyk 	u8      version;
184e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
185e2585ea7SAviad Krawczyk 
186e2585ea7SAviad Krawczyk 	u16     func_idx;
187e2585ea7SAviad Krawczyk 	u8      state;
188e2585ea7SAviad Krawczyk 	u8      rsvd1;
189e2585ea7SAviad Krawczyk 	u32     rsvd2;
190e2585ea7SAviad Krawczyk };
191e2585ea7SAviad Krawczyk 
192c3e79bafSAviad Krawczyk struct hinic_cmd_base_qpn {
193c3e79bafSAviad Krawczyk 	u8      status;
194c3e79bafSAviad Krawczyk 	u8      version;
195c3e79bafSAviad Krawczyk 	u8      rsvd0[6];
196c3e79bafSAviad Krawczyk 
197c3e79bafSAviad Krawczyk 	u16     func_idx;
198c3e79bafSAviad Krawczyk 	u16     qpn;
199c3e79bafSAviad Krawczyk };
200c3e79bafSAviad Krawczyk 
20100e57a6dSAviad Krawczyk struct hinic_cmd_hw_ci {
20200e57a6dSAviad Krawczyk 	u8      status;
20300e57a6dSAviad Krawczyk 	u8      version;
20400e57a6dSAviad Krawczyk 	u8      rsvd0[6];
20500e57a6dSAviad Krawczyk 
20600e57a6dSAviad Krawczyk 	u16     func_idx;
20700e57a6dSAviad Krawczyk 
20800e57a6dSAviad Krawczyk 	u8      dma_attr_off;
20900e57a6dSAviad Krawczyk 	u8      pending_limit;
21000e57a6dSAviad Krawczyk 	u8      coalesc_timer;
21100e57a6dSAviad Krawczyk 
21200e57a6dSAviad Krawczyk 	u8      msix_en;
21300e57a6dSAviad Krawczyk 	u16     msix_entry_idx;
21400e57a6dSAviad Krawczyk 
21500e57a6dSAviad Krawczyk 	u32     sq_id;
21600e57a6dSAviad Krawczyk 	u32     rsvd1;
21700e57a6dSAviad Krawczyk 	u64     ci_addr;
21800e57a6dSAviad Krawczyk };
21900e57a6dSAviad Krawczyk 
22051ba902aSAviad Krawczyk struct hinic_hwdev {
22151ba902aSAviad Krawczyk 	struct hinic_hwif               *hwif;
22251ba902aSAviad Krawczyk 	struct msix_entry               *msix_entries;
223a5564e7eSAviad Krawczyk 
224a5564e7eSAviad Krawczyk 	struct hinic_aeqs               aeqs;
225c3e79bafSAviad Krawczyk 	struct hinic_func_to_io         func_to_io;
226a5564e7eSAviad Krawczyk 
227a5564e7eSAviad Krawczyk 	struct hinic_cap                nic_cap;
22851ba902aSAviad Krawczyk };
22951ba902aSAviad Krawczyk 
230c4d06d2dSAviad Krawczyk struct hinic_nic_cb {
231c4d06d2dSAviad Krawczyk 	void    (*handler)(void *handle, void *buf_in,
232c4d06d2dSAviad Krawczyk 			   u16 in_size, void *buf_out,
233c4d06d2dSAviad Krawczyk 			   u16 *out_size);
234c4d06d2dSAviad Krawczyk 
235c4d06d2dSAviad Krawczyk 	void            *handle;
236c4d06d2dSAviad Krawczyk 	unsigned long   cb_state;
237c4d06d2dSAviad Krawczyk };
238c4d06d2dSAviad Krawczyk 
23951ba902aSAviad Krawczyk struct hinic_pfhwdev {
24051ba902aSAviad Krawczyk 	struct hinic_hwdev              hwdev;
24151ba902aSAviad Krawczyk 
242a5564e7eSAviad Krawczyk 	struct hinic_pf_to_mgmt         pf_to_mgmt;
243c4d06d2dSAviad Krawczyk 
244c4d06d2dSAviad Krawczyk 	struct hinic_nic_cb             nic_cb[HINIC_MGMT_NUM_MSG_CMD];
24551ba902aSAviad Krawczyk };
24651ba902aSAviad Krawczyk 
247c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_register(struct hinic_hwdev *hwdev,
248c4d06d2dSAviad Krawczyk 			     enum hinic_mgmt_msg_cmd cmd, void *handle,
249c4d06d2dSAviad Krawczyk 			     void (*handler)(void *handle, void *buf_in,
250c4d06d2dSAviad Krawczyk 					     u16 in_size, void *buf_out,
251c4d06d2dSAviad Krawczyk 					     u16 *out_size));
252c4d06d2dSAviad Krawczyk 
253c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_unregister(struct hinic_hwdev *hwdev,
254c4d06d2dSAviad Krawczyk 			       enum hinic_mgmt_msg_cmd cmd);
255c4d06d2dSAviad Krawczyk 
25625a3ba61SAviad Krawczyk int hinic_port_msg_cmd(struct hinic_hwdev *hwdev, enum hinic_port_cmd cmd,
25725a3ba61SAviad Krawczyk 		       void *buf_in, u16 in_size, void *buf_out,
25825a3ba61SAviad Krawczyk 		       u16 *out_size);
25925a3ba61SAviad Krawczyk 
260c3e79bafSAviad Krawczyk int hinic_hwdev_ifup(struct hinic_hwdev *hwdev);
261c3e79bafSAviad Krawczyk 
262c3e79bafSAviad Krawczyk void hinic_hwdev_ifdown(struct hinic_hwdev *hwdev);
263c3e79bafSAviad Krawczyk 
26451ba902aSAviad Krawczyk struct hinic_hwdev *hinic_init_hwdev(struct pci_dev *pdev);
26551ba902aSAviad Krawczyk 
26651ba902aSAviad Krawczyk void hinic_free_hwdev(struct hinic_hwdev *hwdev);
26751ba902aSAviad Krawczyk 
268421e9526SXue Chaojing int hinic_hwdev_max_num_qps(struct hinic_hwdev *hwdev);
269421e9526SXue Chaojing 
27051ba902aSAviad Krawczyk int hinic_hwdev_num_qps(struct hinic_hwdev *hwdev);
27151ba902aSAviad Krawczyk 
272c3e79bafSAviad Krawczyk struct hinic_sq *hinic_hwdev_get_sq(struct hinic_hwdev *hwdev, int i);
273c3e79bafSAviad Krawczyk 
274c3e79bafSAviad Krawczyk struct hinic_rq *hinic_hwdev_get_rq(struct hinic_hwdev *hwdev, int i);
275c3e79bafSAviad Krawczyk 
276e2585ea7SAviad Krawczyk int hinic_hwdev_msix_cnt_set(struct hinic_hwdev *hwdev, u16 msix_index);
277e2585ea7SAviad Krawczyk 
278e2585ea7SAviad Krawczyk int hinic_hwdev_msix_set(struct hinic_hwdev *hwdev, u16 msix_index,
279e2585ea7SAviad Krawczyk 			 u8 pending_limit, u8 coalesc_timer,
280e2585ea7SAviad Krawczyk 			 u8 lli_timer_cfg, u8 lli_credit_limit,
281e2585ea7SAviad Krawczyk 			 u8 resend_timer);
282e2585ea7SAviad Krawczyk 
28300e57a6dSAviad Krawczyk int hinic_hwdev_hw_ci_addr_set(struct hinic_hwdev *hwdev, struct hinic_sq *sq,
28400e57a6dSAviad Krawczyk 			       u8 pending_limit, u8 coalesc_timer);
28500e57a6dSAviad Krawczyk 
286905b464aSXue Chaojing void hinic_hwdev_set_msix_state(struct hinic_hwdev *hwdev, u16 msix_index,
287905b464aSXue Chaojing 				enum hinic_msix_state flag);
288905b464aSXue Chaojing 
28951ba902aSAviad Krawczyk #endif
290