xref: /linux/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h (revision fedd0c15d2885e393d4ef4db818b462c3bbfc337)
1*fedd0c15SSalil Mehta /* SPDX-License-Identifier: GPL-2.0+ */
2*fedd0c15SSalil Mehta /* Copyright (c) 2016-2017 Hisilicon Limited. */
3*fedd0c15SSalil Mehta 
4*fedd0c15SSalil Mehta #ifndef __HCLGEVF_CMD_H
5*fedd0c15SSalil Mehta #define __HCLGEVF_CMD_H
6*fedd0c15SSalil Mehta #include <linux/io.h>
7*fedd0c15SSalil Mehta #include <linux/types.h>
8*fedd0c15SSalil Mehta #include "hnae3.h"
9*fedd0c15SSalil Mehta 
10*fedd0c15SSalil Mehta #define HCLGEVF_CMDQ_TX_TIMEOUT		200
11*fedd0c15SSalil Mehta #define HCLGEVF_CMDQ_RX_INVLD_B		0
12*fedd0c15SSalil Mehta #define HCLGEVF_CMDQ_RX_OUTVLD_B	1
13*fedd0c15SSalil Mehta 
14*fedd0c15SSalil Mehta struct hclgevf_hw;
15*fedd0c15SSalil Mehta struct hclgevf_dev;
16*fedd0c15SSalil Mehta 
17*fedd0c15SSalil Mehta struct hclgevf_desc {
18*fedd0c15SSalil Mehta 	__le16 opcode;
19*fedd0c15SSalil Mehta 	__le16 flag;
20*fedd0c15SSalil Mehta 	__le16 retval;
21*fedd0c15SSalil Mehta 	__le16 rsv;
22*fedd0c15SSalil Mehta 	__le32 data[6];
23*fedd0c15SSalil Mehta };
24*fedd0c15SSalil Mehta 
25*fedd0c15SSalil Mehta struct hclgevf_desc_cb {
26*fedd0c15SSalil Mehta 	dma_addr_t dma;
27*fedd0c15SSalil Mehta 	void *va;
28*fedd0c15SSalil Mehta 	u32 length;
29*fedd0c15SSalil Mehta };
30*fedd0c15SSalil Mehta 
31*fedd0c15SSalil Mehta struct hclgevf_cmq_ring {
32*fedd0c15SSalil Mehta 	dma_addr_t desc_dma_addr;
33*fedd0c15SSalil Mehta 	struct hclgevf_desc *desc;
34*fedd0c15SSalil Mehta 	struct hclgevf_desc_cb *desc_cb;
35*fedd0c15SSalil Mehta 	struct hclgevf_dev  *dev;
36*fedd0c15SSalil Mehta 	u32 head;
37*fedd0c15SSalil Mehta 	u32 tail;
38*fedd0c15SSalil Mehta 
39*fedd0c15SSalil Mehta 	u16 buf_size;
40*fedd0c15SSalil Mehta 	u16 desc_num;
41*fedd0c15SSalil Mehta 	int next_to_use;
42*fedd0c15SSalil Mehta 	int next_to_clean;
43*fedd0c15SSalil Mehta 	u8 flag;
44*fedd0c15SSalil Mehta 	spinlock_t lock; /* Command queue lock */
45*fedd0c15SSalil Mehta };
46*fedd0c15SSalil Mehta 
47*fedd0c15SSalil Mehta enum hclgevf_cmd_return_status {
48*fedd0c15SSalil Mehta 	HCLGEVF_CMD_EXEC_SUCCESS	= 0,
49*fedd0c15SSalil Mehta 	HCLGEVF_CMD_NO_AUTH	= 1,
50*fedd0c15SSalil Mehta 	HCLGEVF_CMD_NOT_EXEC	= 2,
51*fedd0c15SSalil Mehta 	HCLGEVF_CMD_QUEUE_FULL	= 3,
52*fedd0c15SSalil Mehta };
53*fedd0c15SSalil Mehta 
54*fedd0c15SSalil Mehta enum hclgevf_cmd_status {
55*fedd0c15SSalil Mehta 	HCLGEVF_STATUS_SUCCESS	= 0,
56*fedd0c15SSalil Mehta 	HCLGEVF_ERR_CSQ_FULL	= -1,
57*fedd0c15SSalil Mehta 	HCLGEVF_ERR_CSQ_TIMEOUT	= -2,
58*fedd0c15SSalil Mehta 	HCLGEVF_ERR_CSQ_ERROR	= -3
59*fedd0c15SSalil Mehta };
60*fedd0c15SSalil Mehta 
61*fedd0c15SSalil Mehta struct hclgevf_cmq {
62*fedd0c15SSalil Mehta 	struct hclgevf_cmq_ring csq;
63*fedd0c15SSalil Mehta 	struct hclgevf_cmq_ring crq;
64*fedd0c15SSalil Mehta 	u16 tx_timeout; /* Tx timeout */
65*fedd0c15SSalil Mehta 	enum hclgevf_cmd_status last_status;
66*fedd0c15SSalil Mehta };
67*fedd0c15SSalil Mehta 
68*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_IN_VALID_SHIFT		0
69*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_OUT_VALID_SHIFT	1
70*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_NEXT_SHIFT		2
71*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_WR_OR_RD_SHIFT		3
72*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_NO_INTR_SHIFT		4
73*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_ERR_INTR_SHIFT		5
74*fedd0c15SSalil Mehta 
75*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_IN		BIT(HCLGEVF_CMD_FLAG_IN_VALID_SHIFT)
76*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_OUT		BIT(HCLGEVF_CMD_FLAG_OUT_VALID_SHIFT)
77*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_NEXT		BIT(HCLGEVF_CMD_FLAG_NEXT_SHIFT)
78*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_WR		BIT(HCLGEVF_CMD_FLAG_WR_OR_RD_SHIFT)
79*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_NO_INTR	BIT(HCLGEVF_CMD_FLAG_NO_INTR_SHIFT)
80*fedd0c15SSalil Mehta #define HCLGEVF_CMD_FLAG_ERR_INTR	BIT(HCLGEVF_CMD_FLAG_ERR_INTR_SHIFT)
81*fedd0c15SSalil Mehta 
82*fedd0c15SSalil Mehta enum hclgevf_opcode_type {
83*fedd0c15SSalil Mehta 	/* Generic command */
84*fedd0c15SSalil Mehta 	HCLGEVF_OPC_QUERY_FW_VER	= 0x0001,
85*fedd0c15SSalil Mehta 	/* TQP command */
86*fedd0c15SSalil Mehta 	HCLGEVF_OPC_QUERY_TX_STATUS	= 0x0B03,
87*fedd0c15SSalil Mehta 	HCLGEVF_OPC_QUERY_RX_STATUS	= 0x0B13,
88*fedd0c15SSalil Mehta 	HCLGEVF_OPC_CFG_COM_TQP_QUEUE	= 0x0B20,
89*fedd0c15SSalil Mehta 	/* TSO cmd */
90*fedd0c15SSalil Mehta 	HCLGEVF_OPC_TSO_GENERIC_CONFIG	= 0x0C01,
91*fedd0c15SSalil Mehta 	/* RSS cmd */
92*fedd0c15SSalil Mehta 	HCLGEVF_OPC_RSS_GENERIC_CONFIG	= 0x0D01,
93*fedd0c15SSalil Mehta 	HCLGEVF_OPC_RSS_INDIR_TABLE	= 0x0D07,
94*fedd0c15SSalil Mehta 	HCLGEVF_OPC_RSS_TC_MODE		= 0x0D08,
95*fedd0c15SSalil Mehta 	/* Mailbox cmd */
96*fedd0c15SSalil Mehta 	HCLGEVF_OPC_MBX_VF_TO_PF	= 0x2001,
97*fedd0c15SSalil Mehta };
98*fedd0c15SSalil Mehta 
99*fedd0c15SSalil Mehta #define HCLGEVF_TQP_REG_OFFSET		0x80000
100*fedd0c15SSalil Mehta #define HCLGEVF_TQP_REG_SIZE		0x200
101*fedd0c15SSalil Mehta 
102*fedd0c15SSalil Mehta struct hclgevf_tqp_map {
103*fedd0c15SSalil Mehta 	__le16 tqp_id;	/* Absolute tqp id for in this pf */
104*fedd0c15SSalil Mehta 	u8 tqp_vf; /* VF id */
105*fedd0c15SSalil Mehta #define HCLGEVF_TQP_MAP_TYPE_PF		0
106*fedd0c15SSalil Mehta #define HCLGEVF_TQP_MAP_TYPE_VF		1
107*fedd0c15SSalil Mehta #define HCLGEVF_TQP_MAP_TYPE_B		0
108*fedd0c15SSalil Mehta #define HCLGEVF_TQP_MAP_EN_B		1
109*fedd0c15SSalil Mehta 	u8 tqp_flag;	/* Indicate it's pf or vf tqp */
110*fedd0c15SSalil Mehta 	__le16 tqp_vid; /* Virtual id in this pf/vf */
111*fedd0c15SSalil Mehta 	u8 rsv[18];
112*fedd0c15SSalil Mehta };
113*fedd0c15SSalil Mehta 
114*fedd0c15SSalil Mehta #define HCLGEVF_VECTOR_ELEMENTS_PER_CMD	10
115*fedd0c15SSalil Mehta 
116*fedd0c15SSalil Mehta enum hclgevf_int_type {
117*fedd0c15SSalil Mehta 	HCLGEVF_INT_TX = 0,
118*fedd0c15SSalil Mehta 	HCLGEVF_INT_RX,
119*fedd0c15SSalil Mehta 	HCLGEVF_INT_EVENT,
120*fedd0c15SSalil Mehta };
121*fedd0c15SSalil Mehta 
122*fedd0c15SSalil Mehta struct hclgevf_ctrl_vector_chain {
123*fedd0c15SSalil Mehta 	u8 int_vector_id;
124*fedd0c15SSalil Mehta 	u8 int_cause_num;
125*fedd0c15SSalil Mehta #define HCLGEVF_INT_TYPE_S	0
126*fedd0c15SSalil Mehta #define HCLGEVF_INT_TYPE_M	0x3
127*fedd0c15SSalil Mehta #define HCLGEVF_TQP_ID_S	2
128*fedd0c15SSalil Mehta #define HCLGEVF_TQP_ID_M	(0x3fff << HCLGEVF_TQP_ID_S)
129*fedd0c15SSalil Mehta 	__le16 tqp_type_and_id[HCLGEVF_VECTOR_ELEMENTS_PER_CMD];
130*fedd0c15SSalil Mehta 	u8 vfid;
131*fedd0c15SSalil Mehta 	u8 resv;
132*fedd0c15SSalil Mehta };
133*fedd0c15SSalil Mehta 
134*fedd0c15SSalil Mehta struct hclgevf_query_version_cmd {
135*fedd0c15SSalil Mehta 	__le32 firmware;
136*fedd0c15SSalil Mehta 	__le32 firmware_rsv[5];
137*fedd0c15SSalil Mehta };
138*fedd0c15SSalil Mehta 
139*fedd0c15SSalil Mehta #define HCLGEVF_RSS_HASH_KEY_OFFSET	4
140*fedd0c15SSalil Mehta #define HCLGEVF_RSS_HASH_KEY_NUM	16
141*fedd0c15SSalil Mehta struct hclgevf_rss_config_cmd {
142*fedd0c15SSalil Mehta 	u8 hash_config;
143*fedd0c15SSalil Mehta 	u8 rsv[7];
144*fedd0c15SSalil Mehta 	u8 hash_key[HCLGEVF_RSS_HASH_KEY_NUM];
145*fedd0c15SSalil Mehta };
146*fedd0c15SSalil Mehta 
147*fedd0c15SSalil Mehta struct hclgevf_rss_input_tuple_cmd {
148*fedd0c15SSalil Mehta 	u8 ipv4_tcp_en;
149*fedd0c15SSalil Mehta 	u8 ipv4_udp_en;
150*fedd0c15SSalil Mehta 	u8 ipv4_stcp_en;
151*fedd0c15SSalil Mehta 	u8 ipv4_fragment_en;
152*fedd0c15SSalil Mehta 	u8 ipv6_tcp_en;
153*fedd0c15SSalil Mehta 	u8 ipv6_udp_en;
154*fedd0c15SSalil Mehta 	u8 ipv6_stcp_en;
155*fedd0c15SSalil Mehta 	u8 ipv6_fragment_en;
156*fedd0c15SSalil Mehta 	u8 rsv[16];
157*fedd0c15SSalil Mehta };
158*fedd0c15SSalil Mehta 
159*fedd0c15SSalil Mehta #define HCLGEVF_RSS_CFG_TBL_SIZE	16
160*fedd0c15SSalil Mehta 
161*fedd0c15SSalil Mehta struct hclgevf_rss_indirection_table_cmd {
162*fedd0c15SSalil Mehta 	u16 start_table_index;
163*fedd0c15SSalil Mehta 	u16 rss_set_bitmap;
164*fedd0c15SSalil Mehta 	u8 rsv[4];
165*fedd0c15SSalil Mehta 	u8 rss_result[HCLGEVF_RSS_CFG_TBL_SIZE];
166*fedd0c15SSalil Mehta };
167*fedd0c15SSalil Mehta 
168*fedd0c15SSalil Mehta #define HCLGEVF_RSS_TC_OFFSET_S		0
169*fedd0c15SSalil Mehta #define HCLGEVF_RSS_TC_OFFSET_M		(0x3ff << HCLGEVF_RSS_TC_OFFSET_S)
170*fedd0c15SSalil Mehta #define HCLGEVF_RSS_TC_SIZE_S		12
171*fedd0c15SSalil Mehta #define HCLGEVF_RSS_TC_SIZE_M		(0x7 << HCLGEVF_RSS_TC_SIZE_S)
172*fedd0c15SSalil Mehta #define HCLGEVF_RSS_TC_VALID_B		15
173*fedd0c15SSalil Mehta #define HCLGEVF_MAX_TC_NUM		8
174*fedd0c15SSalil Mehta struct hclgevf_rss_tc_mode_cmd {
175*fedd0c15SSalil Mehta 	u16 rss_tc_mode[HCLGEVF_MAX_TC_NUM];
176*fedd0c15SSalil Mehta 	u8 rsv[8];
177*fedd0c15SSalil Mehta };
178*fedd0c15SSalil Mehta 
179*fedd0c15SSalil Mehta #define HCLGEVF_LINK_STS_B	0
180*fedd0c15SSalil Mehta #define HCLGEVF_LINK_STATUS	BIT(HCLGEVF_LINK_STS_B)
181*fedd0c15SSalil Mehta struct hclgevf_link_status_cmd {
182*fedd0c15SSalil Mehta 	u8 status;
183*fedd0c15SSalil Mehta 	u8 rsv[23];
184*fedd0c15SSalil Mehta };
185*fedd0c15SSalil Mehta 
186*fedd0c15SSalil Mehta #define HCLGEVF_RING_ID_MASK	0x3ff
187*fedd0c15SSalil Mehta #define HCLGEVF_TQP_ENABLE_B	0
188*fedd0c15SSalil Mehta 
189*fedd0c15SSalil Mehta struct hclgevf_cfg_com_tqp_queue_cmd {
190*fedd0c15SSalil Mehta 	__le16 tqp_id;
191*fedd0c15SSalil Mehta 	__le16 stream_id;
192*fedd0c15SSalil Mehta 	u8 enable;
193*fedd0c15SSalil Mehta 	u8 rsv[19];
194*fedd0c15SSalil Mehta };
195*fedd0c15SSalil Mehta 
196*fedd0c15SSalil Mehta struct hclgevf_cfg_tx_queue_pointer_cmd {
197*fedd0c15SSalil Mehta 	__le16 tqp_id;
198*fedd0c15SSalil Mehta 	__le16 tx_tail;
199*fedd0c15SSalil Mehta 	__le16 tx_head;
200*fedd0c15SSalil Mehta 	__le16 fbd_num;
201*fedd0c15SSalil Mehta 	__le16 ring_offset;
202*fedd0c15SSalil Mehta 	u8 rsv[14];
203*fedd0c15SSalil Mehta };
204*fedd0c15SSalil Mehta 
205*fedd0c15SSalil Mehta #define HCLGEVF_TSO_ENABLE_B	0
206*fedd0c15SSalil Mehta struct hclgevf_cfg_tso_status_cmd {
207*fedd0c15SSalil Mehta 	u8 tso_enable;
208*fedd0c15SSalil Mehta 	u8 rsv[23];
209*fedd0c15SSalil Mehta };
210*fedd0c15SSalil Mehta 
211*fedd0c15SSalil Mehta #define HCLGEVF_TYPE_CRQ		0
212*fedd0c15SSalil Mehta #define HCLGEVF_TYPE_CSQ		1
213*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CSQ_BASEADDR_L_REG	0x27000
214*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CSQ_BASEADDR_H_REG	0x27004
215*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CSQ_DEPTH_REG	0x27008
216*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CSQ_TAIL_REG	0x27010
217*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CSQ_HEAD_REG	0x27014
218*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CRQ_BASEADDR_L_REG	0x27018
219*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CRQ_BASEADDR_H_REG	0x2701c
220*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CRQ_DEPTH_REG	0x27020
221*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CRQ_TAIL_REG	0x27024
222*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CRQ_HEAD_REG	0x27028
223*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CMQ_EN_B		16
224*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CMQ_ENABLE		BIT(HCLGEVF_NIC_CMQ_EN_B)
225*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CMQ_DESC_NUM	1024
226*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CMQ_DESC_NUM_S	3
227*fedd0c15SSalil Mehta #define HCLGEVF_NIC_CMDQ_INT_SRC_REG	0x27100
228*fedd0c15SSalil Mehta 
229*fedd0c15SSalil Mehta static inline void hclgevf_write_reg(void __iomem *base, u32 reg, u32 value)
230*fedd0c15SSalil Mehta {
231*fedd0c15SSalil Mehta 	writel(value, base + reg);
232*fedd0c15SSalil Mehta }
233*fedd0c15SSalil Mehta 
234*fedd0c15SSalil Mehta static inline u32 hclgevf_read_reg(u8 __iomem *base, u32 reg)
235*fedd0c15SSalil Mehta {
236*fedd0c15SSalil Mehta 	u8 __iomem *reg_addr = READ_ONCE(base);
237*fedd0c15SSalil Mehta 
238*fedd0c15SSalil Mehta 	return readl(reg_addr + reg);
239*fedd0c15SSalil Mehta }
240*fedd0c15SSalil Mehta 
241*fedd0c15SSalil Mehta #define hclgevf_write_dev(a, reg, value) \
242*fedd0c15SSalil Mehta 	hclgevf_write_reg((a)->io_base, (reg), (value))
243*fedd0c15SSalil Mehta #define hclgevf_read_dev(a, reg) \
244*fedd0c15SSalil Mehta 	hclgevf_read_reg((a)->io_base, (reg))
245*fedd0c15SSalil Mehta 
246*fedd0c15SSalil Mehta #define HCLGEVF_SEND_SYNC(flag) \
247*fedd0c15SSalil Mehta 	((flag) & HCLGEVF_CMD_FLAG_NO_INTR)
248*fedd0c15SSalil Mehta 
249*fedd0c15SSalil Mehta int hclgevf_cmd_init(struct hclgevf_dev *hdev);
250*fedd0c15SSalil Mehta void hclgevf_cmd_uninit(struct hclgevf_dev *hdev);
251*fedd0c15SSalil Mehta 
252*fedd0c15SSalil Mehta int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num);
253*fedd0c15SSalil Mehta void hclgevf_cmd_setup_basic_desc(struct hclgevf_desc *desc,
254*fedd0c15SSalil Mehta 				  enum hclgevf_opcode_type opcode,
255*fedd0c15SSalil Mehta 				  bool is_read);
256*fedd0c15SSalil Mehta #endif
257