xref: /linux/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h (revision 4a61abb100c8a647959147034f60e9fce17ce9af)
151ba902aSAviad Krawczyk /*
251ba902aSAviad Krawczyk  * Huawei HiNIC PCI Express Linux driver
351ba902aSAviad Krawczyk  * Copyright(c) 2017 Huawei Technologies Co., Ltd
451ba902aSAviad Krawczyk  *
551ba902aSAviad Krawczyk  * This program is free software; you can redistribute it and/or modify it
651ba902aSAviad Krawczyk  * under the terms and conditions of the GNU General Public License,
751ba902aSAviad Krawczyk  * version 2, as published by the Free Software Foundation.
851ba902aSAviad Krawczyk  *
951ba902aSAviad Krawczyk  * This program is distributed in the hope it will be useful, but WITHOUT
1051ba902aSAviad Krawczyk  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1151ba902aSAviad Krawczyk  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1251ba902aSAviad Krawczyk  * for more details.
1351ba902aSAviad Krawczyk  *
1451ba902aSAviad Krawczyk  */
1551ba902aSAviad Krawczyk 
1651ba902aSAviad Krawczyk #ifndef HINIC_HW_DEV_H
1751ba902aSAviad Krawczyk #define HINIC_HW_DEV_H
1851ba902aSAviad Krawczyk 
1951ba902aSAviad Krawczyk #include <linux/pci.h>
20a5564e7eSAviad Krawczyk #include <linux/types.h>
21c4d06d2dSAviad Krawczyk #include <linux/bitops.h>
2251ba902aSAviad Krawczyk 
2351ba902aSAviad Krawczyk #include "hinic_hw_if.h"
24a5564e7eSAviad Krawczyk #include "hinic_hw_eqs.h"
25a5564e7eSAviad Krawczyk #include "hinic_hw_mgmt.h"
26c3e79bafSAviad Krawczyk #include "hinic_hw_qp.h"
27c3e79bafSAviad Krawczyk #include "hinic_hw_io.h"
2851ba902aSAviad Krawczyk 
2951ba902aSAviad Krawczyk #define HINIC_MAX_QPS   32
3051ba902aSAviad Krawczyk 
31c4d06d2dSAviad Krawczyk #define HINIC_MGMT_NUM_MSG_CMD  (HINIC_MGMT_MSG_CMD_MAX - \
32c4d06d2dSAviad Krawczyk 				 HINIC_MGMT_MSG_CMD_BASE)
33c4d06d2dSAviad Krawczyk 
34a5564e7eSAviad Krawczyk struct hinic_cap {
35a5564e7eSAviad Krawczyk 	u16     max_qps;
36a5564e7eSAviad Krawczyk 	u16     num_qps;
37a5564e7eSAviad Krawczyk };
38a5564e7eSAviad Krawczyk 
3925a3ba61SAviad Krawczyk enum hinic_port_cmd {
4025a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_CHANGE_MTU       = 2,
4125a3ba61SAviad Krawczyk 
4225a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_ADD_VLAN         = 3,
4325a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_DEL_VLAN         = 4,
4425a3ba61SAviad Krawczyk 
4525a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_MAC          = 9,
4625a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_MAC          = 10,
4725a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_DEL_MAC          = 11,
4825a3ba61SAviad Krawczyk 
4925a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_RX_MODE      = 12,
5025a3ba61SAviad Krawczyk 
5125a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_LINK_STATE   = 24,
5225a3ba61SAviad Krawczyk 
53*4a61abb1SXue Chaojing 	HINIC_PORT_CMD_SET_RX_CSUM	= 26,
54*4a61abb1SXue Chaojing 
5525a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_PORT_STATE   = 41,
5625a3ba61SAviad Krawczyk 
5725a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_FWCTXT_INIT      = 69,
5825a3ba61SAviad Krawczyk 
5925a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_SET_FUNC_STATE   = 93,
6025a3ba61SAviad Krawczyk 
6125a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_GLOBAL_QPN   = 102,
6225a3ba61SAviad Krawczyk 
63cc18a754SZhao Chen 	HINIC_PORT_CMD_SET_TSO          = 112,
64cc18a754SZhao Chen 
6525a3ba61SAviad Krawczyk 	HINIC_PORT_CMD_GET_CAP          = 170,
6625a3ba61SAviad Krawczyk };
6725a3ba61SAviad Krawczyk 
68c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd {
69c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_BASE         = 160,
70c4d06d2dSAviad Krawczyk 
71c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_LINK_STATUS  = 160,
72c4d06d2dSAviad Krawczyk 
73c4d06d2dSAviad Krawczyk 	HINIC_MGMT_MSG_CMD_MAX,
74c4d06d2dSAviad Krawczyk };
75c4d06d2dSAviad Krawczyk 
76c4d06d2dSAviad Krawczyk enum hinic_cb_state {
77c4d06d2dSAviad Krawczyk 	HINIC_CB_ENABLED = BIT(0),
78c4d06d2dSAviad Krawczyk 	HINIC_CB_RUNNING = BIT(1),
79c4d06d2dSAviad Krawczyk };
80c4d06d2dSAviad Krawczyk 
81e2585ea7SAviad Krawczyk enum hinic_res_state {
82e2585ea7SAviad Krawczyk 	HINIC_RES_CLEAN         = 0,
83e2585ea7SAviad Krawczyk 	HINIC_RES_ACTIVE        = 1,
84e2585ea7SAviad Krawczyk };
85e2585ea7SAviad Krawczyk 
86e2585ea7SAviad Krawczyk struct hinic_cmd_fw_ctxt {
87e2585ea7SAviad Krawczyk 	u8      status;
88e2585ea7SAviad Krawczyk 	u8      version;
89e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
90e2585ea7SAviad Krawczyk 
91e2585ea7SAviad Krawczyk 	u16     func_idx;
92e2585ea7SAviad Krawczyk 	u16     rx_buf_sz;
93e2585ea7SAviad Krawczyk 
94e2585ea7SAviad Krawczyk 	u32     rsvd1;
95e2585ea7SAviad Krawczyk };
96e2585ea7SAviad Krawczyk 
97e2585ea7SAviad Krawczyk struct hinic_cmd_hw_ioctxt {
98e2585ea7SAviad Krawczyk 	u8      status;
99e2585ea7SAviad Krawczyk 	u8      version;
100e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
101e2585ea7SAviad Krawczyk 
102e2585ea7SAviad Krawczyk 	u16     func_idx;
103e2585ea7SAviad Krawczyk 
104e2585ea7SAviad Krawczyk 	u16     rsvd1;
105e2585ea7SAviad Krawczyk 
106e2585ea7SAviad Krawczyk 	u8      set_cmdq_depth;
107e2585ea7SAviad Krawczyk 	u8      cmdq_depth;
108e2585ea7SAviad Krawczyk 
109e2585ea7SAviad Krawczyk 	u8      rsvd2;
110e2585ea7SAviad Krawczyk 	u8      rsvd3;
111e2585ea7SAviad Krawczyk 	u8      rsvd4;
112e2585ea7SAviad Krawczyk 	u8      rsvd5;
113e2585ea7SAviad Krawczyk 
114e2585ea7SAviad Krawczyk 	u16     rq_depth;
115e2585ea7SAviad Krawczyk 	u16     rx_buf_sz_idx;
116e2585ea7SAviad Krawczyk 	u16     sq_depth;
117e2585ea7SAviad Krawczyk };
118e2585ea7SAviad Krawczyk 
119e2585ea7SAviad Krawczyk struct hinic_cmd_io_status {
120e2585ea7SAviad Krawczyk 	u8      status;
121e2585ea7SAviad Krawczyk 	u8      version;
122e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
123e2585ea7SAviad Krawczyk 
124e2585ea7SAviad Krawczyk 	u16     func_idx;
125e2585ea7SAviad Krawczyk 	u8      rsvd1;
126e2585ea7SAviad Krawczyk 	u8      rsvd2;
127e2585ea7SAviad Krawczyk 	u32     io_status;
128e2585ea7SAviad Krawczyk };
129e2585ea7SAviad Krawczyk 
130e2585ea7SAviad Krawczyk struct hinic_cmd_clear_io_res {
131e2585ea7SAviad Krawczyk 	u8      status;
132e2585ea7SAviad Krawczyk 	u8      version;
133e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
134e2585ea7SAviad Krawczyk 
135e2585ea7SAviad Krawczyk 	u16     func_idx;
136e2585ea7SAviad Krawczyk 	u8      rsvd1;
137e2585ea7SAviad Krawczyk 	u8      rsvd2;
138e2585ea7SAviad Krawczyk };
139e2585ea7SAviad Krawczyk 
140e2585ea7SAviad Krawczyk struct hinic_cmd_set_res_state {
141e2585ea7SAviad Krawczyk 	u8      status;
142e2585ea7SAviad Krawczyk 	u8      version;
143e2585ea7SAviad Krawczyk 	u8      rsvd0[6];
144e2585ea7SAviad Krawczyk 
145e2585ea7SAviad Krawczyk 	u16     func_idx;
146e2585ea7SAviad Krawczyk 	u8      state;
147e2585ea7SAviad Krawczyk 	u8      rsvd1;
148e2585ea7SAviad Krawczyk 	u32     rsvd2;
149e2585ea7SAviad Krawczyk };
150e2585ea7SAviad Krawczyk 
151c3e79bafSAviad Krawczyk struct hinic_cmd_base_qpn {
152c3e79bafSAviad Krawczyk 	u8      status;
153c3e79bafSAviad Krawczyk 	u8      version;
154c3e79bafSAviad Krawczyk 	u8      rsvd0[6];
155c3e79bafSAviad Krawczyk 
156c3e79bafSAviad Krawczyk 	u16     func_idx;
157c3e79bafSAviad Krawczyk 	u16     qpn;
158c3e79bafSAviad Krawczyk };
159c3e79bafSAviad Krawczyk 
16000e57a6dSAviad Krawczyk struct hinic_cmd_hw_ci {
16100e57a6dSAviad Krawczyk 	u8      status;
16200e57a6dSAviad Krawczyk 	u8      version;
16300e57a6dSAviad Krawczyk 	u8      rsvd0[6];
16400e57a6dSAviad Krawczyk 
16500e57a6dSAviad Krawczyk 	u16     func_idx;
16600e57a6dSAviad Krawczyk 
16700e57a6dSAviad Krawczyk 	u8      dma_attr_off;
16800e57a6dSAviad Krawczyk 	u8      pending_limit;
16900e57a6dSAviad Krawczyk 	u8      coalesc_timer;
17000e57a6dSAviad Krawczyk 
17100e57a6dSAviad Krawczyk 	u8      msix_en;
17200e57a6dSAviad Krawczyk 	u16     msix_entry_idx;
17300e57a6dSAviad Krawczyk 
17400e57a6dSAviad Krawczyk 	u32     sq_id;
17500e57a6dSAviad Krawczyk 	u32     rsvd1;
17600e57a6dSAviad Krawczyk 	u64     ci_addr;
17700e57a6dSAviad Krawczyk };
17800e57a6dSAviad Krawczyk 
17951ba902aSAviad Krawczyk struct hinic_hwdev {
18051ba902aSAviad Krawczyk 	struct hinic_hwif               *hwif;
18151ba902aSAviad Krawczyk 	struct msix_entry               *msix_entries;
182a5564e7eSAviad Krawczyk 
183a5564e7eSAviad Krawczyk 	struct hinic_aeqs               aeqs;
184c3e79bafSAviad Krawczyk 	struct hinic_func_to_io         func_to_io;
185a5564e7eSAviad Krawczyk 
186a5564e7eSAviad Krawczyk 	struct hinic_cap                nic_cap;
18751ba902aSAviad Krawczyk };
18851ba902aSAviad Krawczyk 
189c4d06d2dSAviad Krawczyk struct hinic_nic_cb {
190c4d06d2dSAviad Krawczyk 	void    (*handler)(void *handle, void *buf_in,
191c4d06d2dSAviad Krawczyk 			   u16 in_size, void *buf_out,
192c4d06d2dSAviad Krawczyk 			   u16 *out_size);
193c4d06d2dSAviad Krawczyk 
194c4d06d2dSAviad Krawczyk 	void            *handle;
195c4d06d2dSAviad Krawczyk 	unsigned long   cb_state;
196c4d06d2dSAviad Krawczyk };
197c4d06d2dSAviad Krawczyk 
19851ba902aSAviad Krawczyk struct hinic_pfhwdev {
19951ba902aSAviad Krawczyk 	struct hinic_hwdev              hwdev;
20051ba902aSAviad Krawczyk 
201a5564e7eSAviad Krawczyk 	struct hinic_pf_to_mgmt         pf_to_mgmt;
202c4d06d2dSAviad Krawczyk 
203c4d06d2dSAviad Krawczyk 	struct hinic_nic_cb             nic_cb[HINIC_MGMT_NUM_MSG_CMD];
20451ba902aSAviad Krawczyk };
20551ba902aSAviad Krawczyk 
206c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_register(struct hinic_hwdev *hwdev,
207c4d06d2dSAviad Krawczyk 			     enum hinic_mgmt_msg_cmd cmd, void *handle,
208c4d06d2dSAviad Krawczyk 			     void (*handler)(void *handle, void *buf_in,
209c4d06d2dSAviad Krawczyk 					     u16 in_size, void *buf_out,
210c4d06d2dSAviad Krawczyk 					     u16 *out_size));
211c4d06d2dSAviad Krawczyk 
212c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_unregister(struct hinic_hwdev *hwdev,
213c4d06d2dSAviad Krawczyk 			       enum hinic_mgmt_msg_cmd cmd);
214c4d06d2dSAviad Krawczyk 
21525a3ba61SAviad Krawczyk int hinic_port_msg_cmd(struct hinic_hwdev *hwdev, enum hinic_port_cmd cmd,
21625a3ba61SAviad Krawczyk 		       void *buf_in, u16 in_size, void *buf_out,
21725a3ba61SAviad Krawczyk 		       u16 *out_size);
21825a3ba61SAviad Krawczyk 
219c3e79bafSAviad Krawczyk int hinic_hwdev_ifup(struct hinic_hwdev *hwdev);
220c3e79bafSAviad Krawczyk 
221c3e79bafSAviad Krawczyk void hinic_hwdev_ifdown(struct hinic_hwdev *hwdev);
222c3e79bafSAviad Krawczyk 
22351ba902aSAviad Krawczyk struct hinic_hwdev *hinic_init_hwdev(struct pci_dev *pdev);
22451ba902aSAviad Krawczyk 
22551ba902aSAviad Krawczyk void hinic_free_hwdev(struct hinic_hwdev *hwdev);
22651ba902aSAviad Krawczyk 
22751ba902aSAviad Krawczyk int hinic_hwdev_num_qps(struct hinic_hwdev *hwdev);
22851ba902aSAviad Krawczyk 
229c3e79bafSAviad Krawczyk struct hinic_sq *hinic_hwdev_get_sq(struct hinic_hwdev *hwdev, int i);
230c3e79bafSAviad Krawczyk 
231c3e79bafSAviad Krawczyk struct hinic_rq *hinic_hwdev_get_rq(struct hinic_hwdev *hwdev, int i);
232c3e79bafSAviad Krawczyk 
233e2585ea7SAviad Krawczyk int hinic_hwdev_msix_cnt_set(struct hinic_hwdev *hwdev, u16 msix_index);
234e2585ea7SAviad Krawczyk 
235e2585ea7SAviad Krawczyk int hinic_hwdev_msix_set(struct hinic_hwdev *hwdev, u16 msix_index,
236e2585ea7SAviad Krawczyk 			 u8 pending_limit, u8 coalesc_timer,
237e2585ea7SAviad Krawczyk 			 u8 lli_timer_cfg, u8 lli_credit_limit,
238e2585ea7SAviad Krawczyk 			 u8 resend_timer);
239e2585ea7SAviad Krawczyk 
24000e57a6dSAviad Krawczyk int hinic_hwdev_hw_ci_addr_set(struct hinic_hwdev *hwdev, struct hinic_sq *sq,
24100e57a6dSAviad Krawczyk 			       u8 pending_limit, u8 coalesc_timer);
24200e57a6dSAviad Krawczyk 
24351ba902aSAviad Krawczyk #endif
244