xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/netronome/nfp/nfp_asm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2*4882a593Smuzhiyun /* Copyright (C) 2016-2018 Netronome Systems, Inc. */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef __NFP_ASM_H__
5*4882a593Smuzhiyun #define __NFP_ASM_H__ 1
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/bitfield.h>
8*4882a593Smuzhiyun #include <linux/bug.h>
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define REG_NONE	0
12*4882a593Smuzhiyun #define REG_WIDTH	4
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define RE_REG_NO_DST	0x020
15*4882a593Smuzhiyun #define RE_REG_IMM	0x020
16*4882a593Smuzhiyun #define RE_REG_IMM_encode(x)					\
17*4882a593Smuzhiyun 	(RE_REG_IMM | ((x) & 0x1f) | (((x) & 0x60) << 1))
18*4882a593Smuzhiyun #define RE_REG_IMM_MAX	 0x07fULL
19*4882a593Smuzhiyun #define RE_REG_LM	0x050
20*4882a593Smuzhiyun #define RE_REG_LM_IDX	0x008
21*4882a593Smuzhiyun #define RE_REG_LM_IDX_MAX	0x7
22*4882a593Smuzhiyun #define RE_REG_XFR	0x080
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define UR_REG_XFR	0x180
25*4882a593Smuzhiyun #define UR_REG_LM	0x200
26*4882a593Smuzhiyun #define UR_REG_LM_IDX	0x020
27*4882a593Smuzhiyun #define UR_REG_LM_POST_MOD	0x010
28*4882a593Smuzhiyun #define UR_REG_LM_POST_MOD_DEC	0x001
29*4882a593Smuzhiyun #define UR_REG_LM_IDX_MAX	0xf
30*4882a593Smuzhiyun #define UR_REG_NN	0x280
31*4882a593Smuzhiyun #define UR_REG_NO_DST	0x300
32*4882a593Smuzhiyun #define UR_REG_IMM	UR_REG_NO_DST
33*4882a593Smuzhiyun #define UR_REG_IMM_encode(x) (UR_REG_IMM | (x))
34*4882a593Smuzhiyun #define UR_REG_IMM_MAX	 0x0ffULL
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define OP_BR_BASE		0x0d800000020ULL
37*4882a593Smuzhiyun #define OP_BR_BASE_MASK		0x0f8000c3ce0ULL
38*4882a593Smuzhiyun #define OP_BR_MASK		0x0000000001fULL
39*4882a593Smuzhiyun #define OP_BR_EV_PIP		0x00000000300ULL
40*4882a593Smuzhiyun #define OP_BR_CSS		0x0000003c000ULL
41*4882a593Smuzhiyun #define OP_BR_DEFBR		0x00000300000ULL
42*4882a593Smuzhiyun #define OP_BR_ADDR_LO		0x007ffc00000ULL
43*4882a593Smuzhiyun #define OP_BR_ADDR_HI		0x10000000000ULL
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define OP_BR_BIT_BASE		0x0d000000000ULL
46*4882a593Smuzhiyun #define OP_BR_BIT_BASE_MASK	0x0f800080300ULL
47*4882a593Smuzhiyun #define OP_BR_BIT_A_SRC		0x000000000ffULL
48*4882a593Smuzhiyun #define OP_BR_BIT_B_SRC		0x0000003fc00ULL
49*4882a593Smuzhiyun #define OP_BR_BIT_BV		0x00000040000ULL
50*4882a593Smuzhiyun #define OP_BR_BIT_SRC_LMEXTN	0x40000000000ULL
51*4882a593Smuzhiyun #define OP_BR_BIT_DEFBR		OP_BR_DEFBR
52*4882a593Smuzhiyun #define OP_BR_BIT_ADDR_LO	OP_BR_ADDR_LO
53*4882a593Smuzhiyun #define OP_BR_BIT_ADDR_HI	OP_BR_ADDR_HI
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define OP_BR_ALU_BASE		0x0e800000000ULL
56*4882a593Smuzhiyun #define OP_BR_ALU_BASE_MASK	0x0ff80000000ULL
57*4882a593Smuzhiyun #define OP_BR_ALU_A_SRC		0x000000003ffULL
58*4882a593Smuzhiyun #define OP_BR_ALU_B_SRC		0x000000ffc00ULL
59*4882a593Smuzhiyun #define OP_BR_ALU_DEFBR		0x00000300000ULL
60*4882a593Smuzhiyun #define OP_BR_ALU_IMM_HI	0x0007fc00000ULL
61*4882a593Smuzhiyun #define OP_BR_ALU_SRC_LMEXTN	0x40000000000ULL
62*4882a593Smuzhiyun #define OP_BR_ALU_DST_LMEXTN	0x80000000000ULL
63*4882a593Smuzhiyun 
nfp_is_br(u64 insn)64*4882a593Smuzhiyun static inline bool nfp_is_br(u64 insn)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun 	return (insn & OP_BR_BASE_MASK) == OP_BR_BASE ||
67*4882a593Smuzhiyun 	       (insn & OP_BR_BIT_BASE_MASK) == OP_BR_BIT_BASE;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun enum br_mask {
71*4882a593Smuzhiyun 	BR_BEQ = 0x00,
72*4882a593Smuzhiyun 	BR_BNE = 0x01,
73*4882a593Smuzhiyun 	BR_BMI = 0x02,
74*4882a593Smuzhiyun 	BR_BHS = 0x04,
75*4882a593Smuzhiyun 	BR_BCC = 0x05,
76*4882a593Smuzhiyun 	BR_BLO = 0x05,
77*4882a593Smuzhiyun 	BR_BGE = 0x08,
78*4882a593Smuzhiyun 	BR_BLT = 0x09,
79*4882a593Smuzhiyun 	BR_UNC = 0x18,
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun enum br_ev_pip {
83*4882a593Smuzhiyun 	BR_EV_PIP_UNCOND = 0,
84*4882a593Smuzhiyun 	BR_EV_PIP_COND = 1,
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun enum br_ctx_signal_state {
88*4882a593Smuzhiyun 	BR_CSS_NONE = 2,
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun u16 br_get_offset(u64 instr);
92*4882a593Smuzhiyun void br_set_offset(u64 *instr, u16 offset);
93*4882a593Smuzhiyun void br_add_offset(u64 *instr, u16 offset);
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define OP_BBYTE_BASE		0x0c800000000ULL
96*4882a593Smuzhiyun #define OP_BB_A_SRC		0x000000000ffULL
97*4882a593Smuzhiyun #define OP_BB_BYTE		0x00000000300ULL
98*4882a593Smuzhiyun #define OP_BB_B_SRC		0x0000003fc00ULL
99*4882a593Smuzhiyun #define OP_BB_I8		0x00000040000ULL
100*4882a593Smuzhiyun #define OP_BB_EQ		0x00000080000ULL
101*4882a593Smuzhiyun #define OP_BB_DEFBR		0x00000300000ULL
102*4882a593Smuzhiyun #define OP_BB_ADDR_LO		0x007ffc00000ULL
103*4882a593Smuzhiyun #define OP_BB_ADDR_HI		0x10000000000ULL
104*4882a593Smuzhiyun #define OP_BB_SRC_LMEXTN	0x40000000000ULL
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #define OP_BALU_BASE		0x0e800000000ULL
107*4882a593Smuzhiyun #define OP_BA_A_SRC		0x000000003ffULL
108*4882a593Smuzhiyun #define OP_BA_B_SRC		0x000000ffc00ULL
109*4882a593Smuzhiyun #define OP_BA_DEFBR		0x00000300000ULL
110*4882a593Smuzhiyun #define OP_BA_ADDR_HI		0x0007fc00000ULL
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #define OP_IMMED_A_SRC		0x000000003ffULL
113*4882a593Smuzhiyun #define OP_IMMED_B_SRC		0x000000ffc00ULL
114*4882a593Smuzhiyun #define OP_IMMED_IMM		0x0000ff00000ULL
115*4882a593Smuzhiyun #define OP_IMMED_WIDTH		0x00060000000ULL
116*4882a593Smuzhiyun #define OP_IMMED_INV		0x00080000000ULL
117*4882a593Smuzhiyun #define OP_IMMED_SHIFT		0x00600000000ULL
118*4882a593Smuzhiyun #define OP_IMMED_BASE		0x0f000000000ULL
119*4882a593Smuzhiyun #define OP_IMMED_WR_AB		0x20000000000ULL
120*4882a593Smuzhiyun #define OP_IMMED_SRC_LMEXTN	0x40000000000ULL
121*4882a593Smuzhiyun #define OP_IMMED_DST_LMEXTN	0x80000000000ULL
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun enum immed_width {
124*4882a593Smuzhiyun 	IMMED_WIDTH_ALL = 0,
125*4882a593Smuzhiyun 	IMMED_WIDTH_BYTE = 1,
126*4882a593Smuzhiyun 	IMMED_WIDTH_WORD = 2,
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun enum immed_shift {
130*4882a593Smuzhiyun 	IMMED_SHIFT_0B = 0,
131*4882a593Smuzhiyun 	IMMED_SHIFT_1B = 1,
132*4882a593Smuzhiyun 	IMMED_SHIFT_2B = 2,
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun u16 immed_get_value(u64 instr);
136*4882a593Smuzhiyun void immed_set_value(u64 *instr, u16 immed);
137*4882a593Smuzhiyun void immed_add_value(u64 *instr, u16 offset);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #define OP_SHF_BASE		0x08000000000ULL
140*4882a593Smuzhiyun #define OP_SHF_A_SRC		0x000000000ffULL
141*4882a593Smuzhiyun #define OP_SHF_SC		0x00000000300ULL
142*4882a593Smuzhiyun #define OP_SHF_B_SRC		0x0000003fc00ULL
143*4882a593Smuzhiyun #define OP_SHF_I8		0x00000040000ULL
144*4882a593Smuzhiyun #define OP_SHF_SW		0x00000080000ULL
145*4882a593Smuzhiyun #define OP_SHF_DST		0x0000ff00000ULL
146*4882a593Smuzhiyun #define OP_SHF_SHIFT		0x001f0000000ULL
147*4882a593Smuzhiyun #define OP_SHF_OP		0x00e00000000ULL
148*4882a593Smuzhiyun #define OP_SHF_DST_AB		0x01000000000ULL
149*4882a593Smuzhiyun #define OP_SHF_WR_AB		0x20000000000ULL
150*4882a593Smuzhiyun #define OP_SHF_SRC_LMEXTN	0x40000000000ULL
151*4882a593Smuzhiyun #define OP_SHF_DST_LMEXTN	0x80000000000ULL
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun enum shf_op {
154*4882a593Smuzhiyun 	SHF_OP_NONE = 0,
155*4882a593Smuzhiyun 	SHF_OP_AND = 2,
156*4882a593Smuzhiyun 	SHF_OP_OR = 5,
157*4882a593Smuzhiyun 	SHF_OP_ASHR = 6,
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun enum shf_sc {
161*4882a593Smuzhiyun 	SHF_SC_R_ROT = 0,
162*4882a593Smuzhiyun 	SHF_SC_NONE = SHF_SC_R_ROT,
163*4882a593Smuzhiyun 	SHF_SC_R_SHF = 1,
164*4882a593Smuzhiyun 	SHF_SC_L_SHF = 2,
165*4882a593Smuzhiyun 	SHF_SC_R_DSHF = 3,
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define OP_ALU_A_SRC		0x000000003ffULL
169*4882a593Smuzhiyun #define OP_ALU_B_SRC		0x000000ffc00ULL
170*4882a593Smuzhiyun #define OP_ALU_DST		0x0003ff00000ULL
171*4882a593Smuzhiyun #define OP_ALU_SW		0x00040000000ULL
172*4882a593Smuzhiyun #define OP_ALU_OP		0x00f80000000ULL
173*4882a593Smuzhiyun #define OP_ALU_DST_AB		0x01000000000ULL
174*4882a593Smuzhiyun #define OP_ALU_BASE		0x0a000000000ULL
175*4882a593Smuzhiyun #define OP_ALU_WR_AB		0x20000000000ULL
176*4882a593Smuzhiyun #define OP_ALU_SRC_LMEXTN	0x40000000000ULL
177*4882a593Smuzhiyun #define OP_ALU_DST_LMEXTN	0x80000000000ULL
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun enum alu_op {
180*4882a593Smuzhiyun 	ALU_OP_NONE		= 0x00,
181*4882a593Smuzhiyun 	ALU_OP_ADD		= 0x01,
182*4882a593Smuzhiyun 	ALU_OP_NOT		= 0x04,
183*4882a593Smuzhiyun 	ALU_OP_ADD_2B		= 0x05,
184*4882a593Smuzhiyun 	ALU_OP_AND		= 0x08,
185*4882a593Smuzhiyun 	ALU_OP_AND_NOT_A	= 0x0c,
186*4882a593Smuzhiyun 	ALU_OP_SUB_C		= 0x0d,
187*4882a593Smuzhiyun 	ALU_OP_AND_NOT_B	= 0x10,
188*4882a593Smuzhiyun 	ALU_OP_ADD_C		= 0x11,
189*4882a593Smuzhiyun 	ALU_OP_OR		= 0x14,
190*4882a593Smuzhiyun 	ALU_OP_SUB		= 0x15,
191*4882a593Smuzhiyun 	ALU_OP_XOR		= 0x18,
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun enum alu_dst_ab {
195*4882a593Smuzhiyun 	ALU_DST_A = 0,
196*4882a593Smuzhiyun 	ALU_DST_B = 1,
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #define OP_LDF_BASE		0x0c000000000ULL
200*4882a593Smuzhiyun #define OP_LDF_A_SRC		0x000000000ffULL
201*4882a593Smuzhiyun #define OP_LDF_SC		0x00000000300ULL
202*4882a593Smuzhiyun #define OP_LDF_B_SRC		0x0000003fc00ULL
203*4882a593Smuzhiyun #define OP_LDF_I8		0x00000040000ULL
204*4882a593Smuzhiyun #define OP_LDF_SW		0x00000080000ULL
205*4882a593Smuzhiyun #define OP_LDF_ZF		0x00000100000ULL
206*4882a593Smuzhiyun #define OP_LDF_BMASK		0x0000f000000ULL
207*4882a593Smuzhiyun #define OP_LDF_SHF		0x001f0000000ULL
208*4882a593Smuzhiyun #define OP_LDF_WR_AB		0x20000000000ULL
209*4882a593Smuzhiyun #define OP_LDF_SRC_LMEXTN	0x40000000000ULL
210*4882a593Smuzhiyun #define OP_LDF_DST_LMEXTN	0x80000000000ULL
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun #define OP_CMD_A_SRC		0x000000000ffULL
213*4882a593Smuzhiyun #define OP_CMD_CTX		0x00000000300ULL
214*4882a593Smuzhiyun #define OP_CMD_B_SRC		0x0000003fc00ULL
215*4882a593Smuzhiyun #define OP_CMD_TOKEN		0x000000c0000ULL
216*4882a593Smuzhiyun #define OP_CMD_XFER		0x00001f00000ULL
217*4882a593Smuzhiyun #define OP_CMD_CNT		0x0000e000000ULL
218*4882a593Smuzhiyun #define OP_CMD_SIG		0x000f0000000ULL
219*4882a593Smuzhiyun #define OP_CMD_TGT_CMD		0x07f00000000ULL
220*4882a593Smuzhiyun #define OP_CMD_INDIR		0x20000000000ULL
221*4882a593Smuzhiyun #define OP_CMD_MODE	       0x1c0000000000ULL
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun struct cmd_tgt_act {
224*4882a593Smuzhiyun 	u8 token;
225*4882a593Smuzhiyun 	u8 tgt_cmd;
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun enum cmd_tgt_map {
229*4882a593Smuzhiyun 	CMD_TGT_READ8,
230*4882a593Smuzhiyun 	CMD_TGT_WRITE8_SWAP,
231*4882a593Smuzhiyun 	CMD_TGT_WRITE32_SWAP,
232*4882a593Smuzhiyun 	CMD_TGT_READ32,
233*4882a593Smuzhiyun 	CMD_TGT_READ32_LE,
234*4882a593Smuzhiyun 	CMD_TGT_READ32_SWAP,
235*4882a593Smuzhiyun 	CMD_TGT_READ_LE,
236*4882a593Smuzhiyun 	CMD_TGT_READ_SWAP_LE,
237*4882a593Smuzhiyun 	CMD_TGT_ADD,
238*4882a593Smuzhiyun 	CMD_TGT_ADD_IMM,
239*4882a593Smuzhiyun 	__CMD_TGT_MAP_SIZE,
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun extern const struct cmd_tgt_act cmd_tgt_act[__CMD_TGT_MAP_SIZE];
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun enum cmd_mode {
245*4882a593Smuzhiyun 	CMD_MODE_40b_AB	= 0,
246*4882a593Smuzhiyun 	CMD_MODE_40b_BA	= 1,
247*4882a593Smuzhiyun 	CMD_MODE_32b	= 4,
248*4882a593Smuzhiyun };
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun enum cmd_ctx_swap {
251*4882a593Smuzhiyun 	CMD_CTX_SWAP = 0,
252*4882a593Smuzhiyun 	CMD_CTX_SWAP_DEFER1 = 1,
253*4882a593Smuzhiyun 	CMD_CTX_SWAP_DEFER2 = 2,
254*4882a593Smuzhiyun 	CMD_CTX_NO_SWAP = 3,
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun #define CMD_OVE_DATA	GENMASK(5, 3)
258*4882a593Smuzhiyun #define CMD_OVE_LEN	BIT(7)
259*4882a593Smuzhiyun #define CMD_OV_LEN	GENMASK(12, 8)
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun #define OP_LCSR_BASE		0x0fc00000000ULL
262*4882a593Smuzhiyun #define OP_LCSR_A_SRC		0x000000003ffULL
263*4882a593Smuzhiyun #define OP_LCSR_B_SRC		0x000000ffc00ULL
264*4882a593Smuzhiyun #define OP_LCSR_WRITE		0x00000200000ULL
265*4882a593Smuzhiyun #define OP_LCSR_ADDR		0x001ffc00000ULL
266*4882a593Smuzhiyun #define OP_LCSR_SRC_LMEXTN	0x40000000000ULL
267*4882a593Smuzhiyun #define OP_LCSR_DST_LMEXTN	0x80000000000ULL
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun enum lcsr_wr_src {
270*4882a593Smuzhiyun 	LCSR_WR_AREG,
271*4882a593Smuzhiyun 	LCSR_WR_BREG,
272*4882a593Smuzhiyun 	LCSR_WR_IMM,
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun #define OP_CARB_BASE		0x0e000000000ULL
276*4882a593Smuzhiyun #define OP_CARB_OR		0x00000010000ULL
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #define NFP_CSR_CTX_PTR		0x20
279*4882a593Smuzhiyun #define NFP_CSR_ACT_LM_ADDR0	0x64
280*4882a593Smuzhiyun #define NFP_CSR_ACT_LM_ADDR1	0x6c
281*4882a593Smuzhiyun #define NFP_CSR_ACT_LM_ADDR2	0x94
282*4882a593Smuzhiyun #define NFP_CSR_ACT_LM_ADDR3	0x9c
283*4882a593Smuzhiyun #define NFP_CSR_PSEUDO_RND_NUM	0x148
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun /* Software register representation, independent of operand type */
286*4882a593Smuzhiyun #define NN_REG_TYPE	GENMASK(31, 24)
287*4882a593Smuzhiyun #define NN_REG_LM_IDX	GENMASK(23, 22)
288*4882a593Smuzhiyun #define NN_REG_LM_IDX_HI	BIT(23)
289*4882a593Smuzhiyun #define NN_REG_LM_IDX_LO	BIT(22)
290*4882a593Smuzhiyun #define NN_REG_LM_MOD	GENMASK(21, 20)
291*4882a593Smuzhiyun #define NN_REG_VAL	GENMASK(7, 0)
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun enum nfp_bpf_reg_type {
294*4882a593Smuzhiyun 	NN_REG_GPR_A =	BIT(0),
295*4882a593Smuzhiyun 	NN_REG_GPR_B =	BIT(1),
296*4882a593Smuzhiyun 	NN_REG_GPR_BOTH = NN_REG_GPR_A | NN_REG_GPR_B,
297*4882a593Smuzhiyun 	NN_REG_NNR =	BIT(2),
298*4882a593Smuzhiyun 	NN_REG_XFER =	BIT(3),
299*4882a593Smuzhiyun 	NN_REG_IMM =	BIT(4),
300*4882a593Smuzhiyun 	NN_REG_NONE =	BIT(5),
301*4882a593Smuzhiyun 	NN_REG_LMEM =	BIT(6),
302*4882a593Smuzhiyun };
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun enum nfp_bpf_lm_mode {
305*4882a593Smuzhiyun 	NN_LM_MOD_NONE = 0,
306*4882a593Smuzhiyun 	NN_LM_MOD_INC,
307*4882a593Smuzhiyun 	NN_LM_MOD_DEC,
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #define reg_both(x)	__enc_swreg((x), NN_REG_GPR_BOTH)
311*4882a593Smuzhiyun #define reg_a(x)	__enc_swreg((x), NN_REG_GPR_A)
312*4882a593Smuzhiyun #define reg_b(x)	__enc_swreg((x), NN_REG_GPR_B)
313*4882a593Smuzhiyun #define reg_nnr(x)	__enc_swreg((x), NN_REG_NNR)
314*4882a593Smuzhiyun #define reg_xfer(x)	__enc_swreg((x), NN_REG_XFER)
315*4882a593Smuzhiyun #define reg_imm(x)	__enc_swreg((x), NN_REG_IMM)
316*4882a593Smuzhiyun #define reg_none()	__enc_swreg(0, NN_REG_NONE)
317*4882a593Smuzhiyun #define reg_lm(x, off)	__enc_swreg_lm((x), NN_LM_MOD_NONE, (off))
318*4882a593Smuzhiyun #define reg_lm_inc(x)	__enc_swreg_lm((x), NN_LM_MOD_INC, 0)
319*4882a593Smuzhiyun #define reg_lm_dec(x)	__enc_swreg_lm((x), NN_LM_MOD_DEC, 0)
320*4882a593Smuzhiyun #define __reg_lm(x, mod, off)	__enc_swreg_lm((x), (mod), (off))
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun typedef __u32 __bitwise swreg;
323*4882a593Smuzhiyun 
__enc_swreg(u16 id,u8 type)324*4882a593Smuzhiyun static inline swreg __enc_swreg(u16 id, u8 type)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun 	return (__force swreg)(id | FIELD_PREP(NN_REG_TYPE, type));
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun 
__enc_swreg_lm(u8 id,enum nfp_bpf_lm_mode mode,u8 off)329*4882a593Smuzhiyun static inline swreg __enc_swreg_lm(u8 id, enum nfp_bpf_lm_mode mode, u8 off)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	WARN_ON(id > 3 || (off && mode != NN_LM_MOD_NONE));
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	return (__force swreg)(FIELD_PREP(NN_REG_TYPE, NN_REG_LMEM) |
334*4882a593Smuzhiyun 			       FIELD_PREP(NN_REG_LM_IDX, id) |
335*4882a593Smuzhiyun 			       FIELD_PREP(NN_REG_LM_MOD, mode) |
336*4882a593Smuzhiyun 			       off);
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun 
swreg_raw(swreg reg)339*4882a593Smuzhiyun static inline u32 swreg_raw(swreg reg)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun 	return (__force u32)reg;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
swreg_type(swreg reg)344*4882a593Smuzhiyun static inline enum nfp_bpf_reg_type swreg_type(swreg reg)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun 	return FIELD_GET(NN_REG_TYPE, swreg_raw(reg));
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun 
swreg_value(swreg reg)349*4882a593Smuzhiyun static inline u16 swreg_value(swreg reg)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun 	return FIELD_GET(NN_REG_VAL, swreg_raw(reg));
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun 
swreg_lm_idx(swreg reg)354*4882a593Smuzhiyun static inline bool swreg_lm_idx(swreg reg)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun 	return FIELD_GET(NN_REG_LM_IDX_LO, swreg_raw(reg));
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun 
swreg_lmextn(swreg reg)359*4882a593Smuzhiyun static inline bool swreg_lmextn(swreg reg)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun 	return FIELD_GET(NN_REG_LM_IDX_HI, swreg_raw(reg));
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun 
swreg_lm_mode(swreg reg)364*4882a593Smuzhiyun static inline enum nfp_bpf_lm_mode swreg_lm_mode(swreg reg)
365*4882a593Smuzhiyun {
366*4882a593Smuzhiyun 	return FIELD_GET(NN_REG_LM_MOD, swreg_raw(reg));
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun struct nfp_insn_ur_regs {
370*4882a593Smuzhiyun 	enum alu_dst_ab dst_ab;
371*4882a593Smuzhiyun 	u16 dst;
372*4882a593Smuzhiyun 	u16 areg, breg;
373*4882a593Smuzhiyun 	bool swap;
374*4882a593Smuzhiyun 	bool wr_both;
375*4882a593Smuzhiyun 	bool dst_lmextn;
376*4882a593Smuzhiyun 	bool src_lmextn;
377*4882a593Smuzhiyun };
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun struct nfp_insn_re_regs {
380*4882a593Smuzhiyun 	enum alu_dst_ab dst_ab;
381*4882a593Smuzhiyun 	u8 dst;
382*4882a593Smuzhiyun 	u8 areg, breg;
383*4882a593Smuzhiyun 	bool swap;
384*4882a593Smuzhiyun 	bool wr_both;
385*4882a593Smuzhiyun 	bool i8;
386*4882a593Smuzhiyun 	bool dst_lmextn;
387*4882a593Smuzhiyun 	bool src_lmextn;
388*4882a593Smuzhiyun };
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun int swreg_to_unrestricted(swreg dst, swreg lreg, swreg rreg,
391*4882a593Smuzhiyun 			  struct nfp_insn_ur_regs *reg);
392*4882a593Smuzhiyun int swreg_to_restricted(swreg dst, swreg lreg, swreg rreg,
393*4882a593Smuzhiyun 			struct nfp_insn_re_regs *reg, bool has_imm8);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun #define NFP_USTORE_PREFETCH_WINDOW	8
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun int nfp_ustore_check_valid_no_ecc(u64 insn);
398*4882a593Smuzhiyun u64 nfp_ustore_calc_ecc_insn(u64 insn);
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #define NFP_IND_ME_REFL_WR_SIG_INIT	3
401*4882a593Smuzhiyun #define NFP_IND_ME_CTX_PTR_BASE_MASK	GENMASK(9, 0)
402*4882a593Smuzhiyun #define NFP_IND_NUM_CONTEXTS		8
403*4882a593Smuzhiyun 
nfp_get_ind_csr_ctx_ptr_offs(u32 read_offset)404*4882a593Smuzhiyun static inline u32 nfp_get_ind_csr_ctx_ptr_offs(u32 read_offset)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun 	return (read_offset & ~NFP_IND_ME_CTX_PTR_BASE_MASK) | NFP_CSR_CTX_PTR;
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun enum mul_type {
410*4882a593Smuzhiyun 	MUL_TYPE_START		= 0x00,
411*4882a593Smuzhiyun 	MUL_TYPE_STEP_24x8	= 0x01,
412*4882a593Smuzhiyun 	MUL_TYPE_STEP_16x16	= 0x02,
413*4882a593Smuzhiyun 	MUL_TYPE_STEP_32x32	= 0x03,
414*4882a593Smuzhiyun };
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun enum mul_step {
417*4882a593Smuzhiyun 	MUL_STEP_1		= 0x00,
418*4882a593Smuzhiyun 	MUL_STEP_NONE		= MUL_STEP_1,
419*4882a593Smuzhiyun 	MUL_STEP_2		= 0x01,
420*4882a593Smuzhiyun 	MUL_STEP_3		= 0x02,
421*4882a593Smuzhiyun 	MUL_STEP_4		= 0x03,
422*4882a593Smuzhiyun 	MUL_LAST		= 0x04,
423*4882a593Smuzhiyun 	MUL_LAST_2		= 0x05,
424*4882a593Smuzhiyun };
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun #define OP_MUL_BASE		0x0f800000000ULL
427*4882a593Smuzhiyun #define OP_MUL_A_SRC		0x000000003ffULL
428*4882a593Smuzhiyun #define OP_MUL_B_SRC		0x000000ffc00ULL
429*4882a593Smuzhiyun #define OP_MUL_STEP		0x00000700000ULL
430*4882a593Smuzhiyun #define OP_MUL_DST_AB		0x00000800000ULL
431*4882a593Smuzhiyun #define OP_MUL_SW		0x00040000000ULL
432*4882a593Smuzhiyun #define OP_MUL_TYPE		0x00180000000ULL
433*4882a593Smuzhiyun #define OP_MUL_WR_AB		0x20000000000ULL
434*4882a593Smuzhiyun #define OP_MUL_SRC_LMEXTN	0x40000000000ULL
435*4882a593Smuzhiyun #define OP_MUL_DST_LMEXTN	0x80000000000ULL
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun #endif
438