xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/mellanox/mlxsw/pci_hw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef _MLXSW_PCI_HW_H
5*4882a593Smuzhiyun #define _MLXSW_PCI_HW_H
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/bitops.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include "item.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define MLXSW_PCI_BAR0_SIZE		(1024 * 1024) /* 1MB */
12*4882a593Smuzhiyun #define MLXSW_PCI_PAGE_SIZE		4096
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define MLXSW_PCI_CIR_BASE			0x71000
15*4882a593Smuzhiyun #define MLXSW_PCI_CIR_IN_PARAM_HI		MLXSW_PCI_CIR_BASE
16*4882a593Smuzhiyun #define MLXSW_PCI_CIR_IN_PARAM_LO		(MLXSW_PCI_CIR_BASE + 0x04)
17*4882a593Smuzhiyun #define MLXSW_PCI_CIR_IN_MODIFIER		(MLXSW_PCI_CIR_BASE + 0x08)
18*4882a593Smuzhiyun #define MLXSW_PCI_CIR_OUT_PARAM_HI		(MLXSW_PCI_CIR_BASE + 0x0C)
19*4882a593Smuzhiyun #define MLXSW_PCI_CIR_OUT_PARAM_LO		(MLXSW_PCI_CIR_BASE + 0x10)
20*4882a593Smuzhiyun #define MLXSW_PCI_CIR_TOKEN			(MLXSW_PCI_CIR_BASE + 0x14)
21*4882a593Smuzhiyun #define MLXSW_PCI_CIR_CTRL			(MLXSW_PCI_CIR_BASE + 0x18)
22*4882a593Smuzhiyun #define MLXSW_PCI_CIR_CTRL_GO_BIT		BIT(23)
23*4882a593Smuzhiyun #define MLXSW_PCI_CIR_CTRL_EVREQ_BIT		BIT(22)
24*4882a593Smuzhiyun #define MLXSW_PCI_CIR_CTRL_OPCODE_MOD_SHIFT	12
25*4882a593Smuzhiyun #define MLXSW_PCI_CIR_CTRL_STATUS_SHIFT		24
26*4882a593Smuzhiyun #define MLXSW_PCI_CIR_TIMEOUT_MSECS		1000
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define MLXSW_PCI_SW_RESET_TIMEOUT_MSECS	900000
29*4882a593Smuzhiyun #define MLXSW_PCI_SW_RESET_WAIT_MSECS		200
30*4882a593Smuzhiyun #define MLXSW_PCI_FW_READY			0xA1844
31*4882a593Smuzhiyun #define MLXSW_PCI_FW_READY_MASK			0xFFFF
32*4882a593Smuzhiyun #define MLXSW_PCI_FW_READY_MAGIC		0x5E
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL_SDQ_OFFSET		0x000
35*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL_RDQ_OFFSET		0x200
36*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL_CQ_OFFSET		0x400
37*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL_EQ_OFFSET		0x600
38*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL_ARM_CQ_OFFSET	0x800
39*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL_ARM_EQ_OFFSET	0xA00
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define MLXSW_PCI_DOORBELL(offset, type_offset, num)	\
42*4882a593Smuzhiyun 	((offset) + (type_offset) + (num) * 4)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define MLXSW_PCI_FREE_RUNNING_CLOCK_H(offset)	(offset)
45*4882a593Smuzhiyun #define MLXSW_PCI_FREE_RUNNING_CLOCK_L(offset)	((offset) + 4)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define MLXSW_PCI_CQS_MAX	96
48*4882a593Smuzhiyun #define MLXSW_PCI_EQS_COUNT	2
49*4882a593Smuzhiyun #define MLXSW_PCI_EQ_ASYNC_NUM	0
50*4882a593Smuzhiyun #define MLXSW_PCI_EQ_COMP_NUM	1
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define MLXSW_PCI_SDQS_MIN	2 /* EMAD and control traffic */
53*4882a593Smuzhiyun #define MLXSW_PCI_SDQ_EMAD_INDEX	0
54*4882a593Smuzhiyun #define MLXSW_PCI_SDQ_EMAD_TC	0
55*4882a593Smuzhiyun #define MLXSW_PCI_SDQ_CTL_TC	3
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define MLXSW_PCI_AQ_PAGES	8
58*4882a593Smuzhiyun #define MLXSW_PCI_AQ_SIZE	(MLXSW_PCI_PAGE_SIZE * MLXSW_PCI_AQ_PAGES)
59*4882a593Smuzhiyun #define MLXSW_PCI_WQE_SIZE	32 /* 32 bytes per element */
60*4882a593Smuzhiyun #define MLXSW_PCI_CQE01_SIZE	16 /* 16 bytes per element */
61*4882a593Smuzhiyun #define MLXSW_PCI_CQE2_SIZE	32 /* 32 bytes per element */
62*4882a593Smuzhiyun #define MLXSW_PCI_CQE_SIZE_MAX	MLXSW_PCI_CQE2_SIZE
63*4882a593Smuzhiyun #define MLXSW_PCI_EQE_SIZE	16 /* 16 bytes per element */
64*4882a593Smuzhiyun #define MLXSW_PCI_WQE_COUNT	(MLXSW_PCI_AQ_SIZE / MLXSW_PCI_WQE_SIZE)
65*4882a593Smuzhiyun #define MLXSW_PCI_CQE01_COUNT	(MLXSW_PCI_AQ_SIZE / MLXSW_PCI_CQE01_SIZE)
66*4882a593Smuzhiyun #define MLXSW_PCI_CQE2_COUNT	(MLXSW_PCI_AQ_SIZE / MLXSW_PCI_CQE2_SIZE)
67*4882a593Smuzhiyun #define MLXSW_PCI_EQE_COUNT	(MLXSW_PCI_AQ_SIZE / MLXSW_PCI_EQE_SIZE)
68*4882a593Smuzhiyun #define MLXSW_PCI_EQE_UPDATE_COUNT	0x80
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define MLXSW_PCI_WQE_SG_ENTRIES	3
71*4882a593Smuzhiyun #define MLXSW_PCI_WQE_TYPE_ETHERNET	0xA
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* pci_wqe_c
74*4882a593Smuzhiyun  * If set it indicates that a completion should be reported upon
75*4882a593Smuzhiyun  * execution of this descriptor.
76*4882a593Smuzhiyun  */
77*4882a593Smuzhiyun MLXSW_ITEM32(pci, wqe, c, 0x00, 31, 1);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /* pci_wqe_lp
80*4882a593Smuzhiyun  * Local Processing, set if packet should be processed by the local
81*4882a593Smuzhiyun  * switch hardware:
82*4882a593Smuzhiyun  * For Ethernet EMAD (Direct Route and non Direct Route) -
83*4882a593Smuzhiyun  * must be set if packet destination is local device
84*4882a593Smuzhiyun  * For InfiniBand CTL - must be set if packet destination is local device
85*4882a593Smuzhiyun  * Otherwise it must be clear
86*4882a593Smuzhiyun  * Local Process packets must not exceed the size of 2K (including payload
87*4882a593Smuzhiyun  * and headers).
88*4882a593Smuzhiyun  */
89*4882a593Smuzhiyun MLXSW_ITEM32(pci, wqe, lp, 0x00, 30, 1);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* pci_wqe_type
92*4882a593Smuzhiyun  * Packet type.
93*4882a593Smuzhiyun  */
94*4882a593Smuzhiyun MLXSW_ITEM32(pci, wqe, type, 0x00, 23, 4);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* pci_wqe_byte_count
97*4882a593Smuzhiyun  * Size of i-th scatter/gather entry, 0 if entry is unused.
98*4882a593Smuzhiyun  */
99*4882a593Smuzhiyun MLXSW_ITEM16_INDEXED(pci, wqe, byte_count, 0x02, 0, 14, 0x02, 0x00, false);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /* pci_wqe_address
102*4882a593Smuzhiyun  * Physical address of i-th scatter/gather entry.
103*4882a593Smuzhiyun  * Gather Entries must be 2Byte aligned.
104*4882a593Smuzhiyun  */
105*4882a593Smuzhiyun MLXSW_ITEM64_INDEXED(pci, wqe, address, 0x08, 0, 64, 0x8, 0x0, false);
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun enum mlxsw_pci_cqe_v {
108*4882a593Smuzhiyun 	MLXSW_PCI_CQE_V0,
109*4882a593Smuzhiyun 	MLXSW_PCI_CQE_V1,
110*4882a593Smuzhiyun 	MLXSW_PCI_CQE_V2,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define mlxsw_pci_cqe_item_helpers(name, v0, v1, v2)				\
114*4882a593Smuzhiyun static inline u32 mlxsw_pci_cqe_##name##_get(enum mlxsw_pci_cqe_v v, char *cqe)	\
115*4882a593Smuzhiyun {										\
116*4882a593Smuzhiyun 	switch (v) {								\
117*4882a593Smuzhiyun 	default:								\
118*4882a593Smuzhiyun 	case MLXSW_PCI_CQE_V0:							\
119*4882a593Smuzhiyun 		return mlxsw_pci_cqe##v0##_##name##_get(cqe);			\
120*4882a593Smuzhiyun 	case MLXSW_PCI_CQE_V1:							\
121*4882a593Smuzhiyun 		return mlxsw_pci_cqe##v1##_##name##_get(cqe);			\
122*4882a593Smuzhiyun 	case MLXSW_PCI_CQE_V2:							\
123*4882a593Smuzhiyun 		return mlxsw_pci_cqe##v2##_##name##_get(cqe);			\
124*4882a593Smuzhiyun 	}									\
125*4882a593Smuzhiyun }										\
126*4882a593Smuzhiyun static inline void mlxsw_pci_cqe_##name##_set(enum mlxsw_pci_cqe_v v,		\
127*4882a593Smuzhiyun 					      char *cqe, u32 val)		\
128*4882a593Smuzhiyun {										\
129*4882a593Smuzhiyun 	switch (v) {								\
130*4882a593Smuzhiyun 	default:								\
131*4882a593Smuzhiyun 	case MLXSW_PCI_CQE_V0:							\
132*4882a593Smuzhiyun 		mlxsw_pci_cqe##v0##_##name##_set(cqe, val);			\
133*4882a593Smuzhiyun 		break;								\
134*4882a593Smuzhiyun 	case MLXSW_PCI_CQE_V1:							\
135*4882a593Smuzhiyun 		mlxsw_pci_cqe##v1##_##name##_set(cqe, val);			\
136*4882a593Smuzhiyun 		break;								\
137*4882a593Smuzhiyun 	case MLXSW_PCI_CQE_V2:							\
138*4882a593Smuzhiyun 		mlxsw_pci_cqe##v2##_##name##_set(cqe, val);			\
139*4882a593Smuzhiyun 		break;								\
140*4882a593Smuzhiyun 	}									\
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* pci_cqe_lag
144*4882a593Smuzhiyun  * Packet arrives from a port which is a LAG
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, lag, 0x00, 23, 1);
147*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, lag, 0x00, 24, 1);
148*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(lag, 0, 12, 12);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* pci_cqe_system_port/lag_id
151*4882a593Smuzhiyun  * When lag=0: System port on which the packet was received
152*4882a593Smuzhiyun  * When lag=1:
153*4882a593Smuzhiyun  * bits [15:4] LAG ID on which the packet was received
154*4882a593Smuzhiyun  * bits [3:0] sub_port on which the packet was received
155*4882a593Smuzhiyun  */
156*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe, system_port, 0x00, 0, 16);
157*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, lag_id, 0x00, 4, 12);
158*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, lag_id, 0x00, 0, 16);
159*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(lag_id, 0, 12, 12);
160*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, lag_subport, 0x00, 0, 4);
161*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, lag_subport, 0x00, 16, 8);
162*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(lag_subport, 0, 12, 12);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun /* pci_cqe_wqe_counter
165*4882a593Smuzhiyun  * WQE count of the WQEs completed on the associated dqn
166*4882a593Smuzhiyun  */
167*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe, wqe_counter, 0x04, 16, 16);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /* pci_cqe_byte_count
170*4882a593Smuzhiyun  * Byte count of received packets including additional two
171*4882a593Smuzhiyun  * Reserved Bytes that are append to the end of the frame.
172*4882a593Smuzhiyun  * Reserved for Send CQE.
173*4882a593Smuzhiyun  */
174*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe, byte_count, 0x04, 0, 14);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /* pci_cqe_trap_id
177*4882a593Smuzhiyun  * Trap ID that captured the packet.
178*4882a593Smuzhiyun  */
179*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe, trap_id, 0x08, 0, 10);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* pci_cqe_crc
182*4882a593Smuzhiyun  * Length include CRC. Indicates the length field includes
183*4882a593Smuzhiyun  * the packet's CRC.
184*4882a593Smuzhiyun  */
185*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, crc, 0x0C, 8, 1);
186*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, crc, 0x0C, 9, 1);
187*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(crc, 0, 12, 12);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun /* pci_cqe_e
190*4882a593Smuzhiyun  * CQE with Error.
191*4882a593Smuzhiyun  */
192*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, e, 0x0C, 7, 1);
193*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, e, 0x00, 27, 1);
194*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(e, 0, 12, 12);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /* pci_cqe_sr
197*4882a593Smuzhiyun  * 1 - Send Queue
198*4882a593Smuzhiyun  * 0 - Receive Queue
199*4882a593Smuzhiyun  */
200*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, sr, 0x0C, 6, 1);
201*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, sr, 0x00, 26, 1);
202*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(sr, 0, 12, 12);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* pci_cqe_dqn
205*4882a593Smuzhiyun  * Descriptor Queue (DQ) Number.
206*4882a593Smuzhiyun  */
207*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe0, dqn, 0x0C, 1, 5);
208*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe12, dqn, 0x0C, 1, 6);
209*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(dqn, 0, 12, 12);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun /* pci_cqe_user_def_val_orig_pkt_len
212*4882a593Smuzhiyun  * When trap_id is an ACL: User defined value from policy engine action.
213*4882a593Smuzhiyun  */
214*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe2, user_def_val_orig_pkt_len, 0x14, 0, 20);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /* pci_cqe_mirror_reason
217*4882a593Smuzhiyun  * Mirror reason.
218*4882a593Smuzhiyun  */
219*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe2, mirror_reason, 0x18, 24, 8);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /* pci_cqe_owner
222*4882a593Smuzhiyun  * Ownership bit.
223*4882a593Smuzhiyun  */
224*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe01, owner, 0x0C, 0, 1);
225*4882a593Smuzhiyun MLXSW_ITEM32(pci, cqe2, owner, 0x1C, 0, 1);
226*4882a593Smuzhiyun mlxsw_pci_cqe_item_helpers(owner, 01, 01, 2);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /* pci_eqe_event_type
229*4882a593Smuzhiyun  * Event type.
230*4882a593Smuzhiyun  */
231*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, event_type, 0x0C, 24, 8);
232*4882a593Smuzhiyun #define MLXSW_PCI_EQE_EVENT_TYPE_COMP	0x00
233*4882a593Smuzhiyun #define MLXSW_PCI_EQE_EVENT_TYPE_CMD	0x0A
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun /* pci_eqe_event_sub_type
236*4882a593Smuzhiyun  * Event type.
237*4882a593Smuzhiyun  */
238*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, event_sub_type, 0x0C, 16, 8);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /* pci_eqe_cqn
241*4882a593Smuzhiyun  * Completion Queue that triggered this EQE.
242*4882a593Smuzhiyun  */
243*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, cqn, 0x0C, 8, 7);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /* pci_eqe_owner
246*4882a593Smuzhiyun  * Ownership bit.
247*4882a593Smuzhiyun  */
248*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, owner, 0x0C, 0, 1);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun /* pci_eqe_cmd_token
251*4882a593Smuzhiyun  * Command completion event - token
252*4882a593Smuzhiyun  */
253*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, cmd_token, 0x00, 16, 16);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun /* pci_eqe_cmd_status
256*4882a593Smuzhiyun  * Command completion event - status
257*4882a593Smuzhiyun  */
258*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, cmd_status, 0x00, 0, 8);
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /* pci_eqe_cmd_out_param_h
261*4882a593Smuzhiyun  * Command completion event - output parameter - higher part
262*4882a593Smuzhiyun  */
263*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, cmd_out_param_h, 0x04, 0, 32);
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /* pci_eqe_cmd_out_param_l
266*4882a593Smuzhiyun  * Command completion event - output parameter - lower part
267*4882a593Smuzhiyun  */
268*4882a593Smuzhiyun MLXSW_ITEM32(pci, eqe, cmd_out_param_l, 0x08, 0, 32);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun #endif
271