1 /* SPDX-License-Identifier: GPL-2.0
2  * Marvell OcteonTX CPT driver
3  *
4  * Copyright (C) 2019 Marvell International Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 
11 #ifndef __OTX_CPT_HW_TYPES_H
12 #define __OTX_CPT_HW_TYPES_H
13 
14 #include <linux/types.h>
15 
16 /* Device IDs */
17 #define OTX_CPT_PCI_PF_DEVICE_ID 0xa040
18 #define OTX_CPT_PCI_VF_DEVICE_ID 0xa041
19 
20 #define OTX_CPT_PCI_PF_SUBSYS_ID 0xa340
21 #define OTX_CPT_PCI_VF_SUBSYS_ID 0xa341
22 
23 /* Configuration and status registers are in BAR0 on OcteonTX platform */
24 #define OTX_CPT_PF_PCI_CFG_BAR	0
25 #define OTX_CPT_VF_PCI_CFG_BAR	0
26 
27 #define OTX_CPT_BAR_E_CPTX_VFX_BAR0_OFFSET(a, b) \
28 	(0x000020000000ll + 0x1000000000ll * (a) + 0x100000ll * (b))
29 #define OTX_CPT_BAR_E_CPTX_VFX_BAR0_SIZE	0x400000
30 
31 /* Mailbox interrupts offset */
32 #define OTX_CPT_PF_MBOX_INT	3
33 #define OTX_CPT_PF_INT_VEC_E_MBOXX(x, a) ((x) + (a))
34 /* Number of MSIX supported in PF */
35 #define OTX_CPT_PF_MSIX_VECTORS 4
36 /* Maximum supported microcode groups */
37 #define OTX_CPT_MAX_ENGINE_GROUPS 8
38 
39 /* CPT instruction size in bytes */
40 #define OTX_CPT_INST_SIZE 64
41 /* CPT queue next chunk pointer size in bytes */
42 #define OTX_CPT_NEXT_CHUNK_PTR_SIZE 8
43 
44 /* OcteonTX CPT VF MSIX vectors and their offsets */
45 #define OTX_CPT_VF_MSIX_VECTORS 2
46 #define OTX_CPT_VF_INTR_MBOX_MASK BIT(0)
47 #define OTX_CPT_VF_INTR_DOVF_MASK BIT(1)
48 #define OTX_CPT_VF_INTR_IRDE_MASK BIT(2)
49 #define OTX_CPT_VF_INTR_NWRP_MASK BIT(3)
50 #define OTX_CPT_VF_INTR_SERR_MASK BIT(4)
51 
52 /* OcteonTX CPT PF registers */
53 #define OTX_CPT_PF_CONSTANTS		(0x0ll)
54 #define OTX_CPT_PF_RESET		(0x100ll)
55 #define OTX_CPT_PF_DIAG			(0x120ll)
56 #define OTX_CPT_PF_BIST_STATUS		(0x160ll)
57 #define OTX_CPT_PF_ECC0_CTL		(0x200ll)
58 #define OTX_CPT_PF_ECC0_FLIP		(0x210ll)
59 #define OTX_CPT_PF_ECC0_INT		(0x220ll)
60 #define OTX_CPT_PF_ECC0_INT_W1S		(0x230ll)
61 #define OTX_CPT_PF_ECC0_ENA_W1S		(0x240ll)
62 #define OTX_CPT_PF_ECC0_ENA_W1C		(0x250ll)
63 #define OTX_CPT_PF_MBOX_INTX(b)		(0x400ll | (u64)(b) << 3)
64 #define OTX_CPT_PF_MBOX_INT_W1SX(b)	(0x420ll | (u64)(b) << 3)
65 #define OTX_CPT_PF_MBOX_ENA_W1CX(b)	(0x440ll | (u64)(b) << 3)
66 #define OTX_CPT_PF_MBOX_ENA_W1SX(b)	(0x460ll | (u64)(b) << 3)
67 #define OTX_CPT_PF_EXEC_INT		(0x500ll)
68 #define OTX_CPT_PF_EXEC_INT_W1S		(0x520ll)
69 #define OTX_CPT_PF_EXEC_ENA_W1C		(0x540ll)
70 #define OTX_CPT_PF_EXEC_ENA_W1S		(0x560ll)
71 #define OTX_CPT_PF_GX_EN(b)		(0x600ll | (u64)(b) << 3)
72 #define OTX_CPT_PF_EXEC_INFO		(0x700ll)
73 #define OTX_CPT_PF_EXEC_BUSY		(0x800ll)
74 #define OTX_CPT_PF_EXEC_INFO0		(0x900ll)
75 #define OTX_CPT_PF_EXEC_INFO1		(0x910ll)
76 #define OTX_CPT_PF_INST_REQ_PC		(0x10000ll)
77 #define OTX_CPT_PF_INST_LATENCY_PC	(0x10020ll)
78 #define OTX_CPT_PF_RD_REQ_PC		(0x10040ll)
79 #define OTX_CPT_PF_RD_LATENCY_PC	(0x10060ll)
80 #define OTX_CPT_PF_RD_UC_PC		(0x10080ll)
81 #define OTX_CPT_PF_ACTIVE_CYCLES_PC	(0x10100ll)
82 #define OTX_CPT_PF_EXE_CTL		(0x4000000ll)
83 #define OTX_CPT_PF_EXE_STATUS		(0x4000008ll)
84 #define OTX_CPT_PF_EXE_CLK		(0x4000010ll)
85 #define OTX_CPT_PF_EXE_DBG_CTL		(0x4000018ll)
86 #define OTX_CPT_PF_EXE_DBG_DATA		(0x4000020ll)
87 #define OTX_CPT_PF_EXE_BIST_STATUS	(0x4000028ll)
88 #define OTX_CPT_PF_EXE_REQ_TIMER	(0x4000030ll)
89 #define OTX_CPT_PF_EXE_MEM_CTL		(0x4000038ll)
90 #define OTX_CPT_PF_EXE_PERF_CTL		(0x4001000ll)
91 #define OTX_CPT_PF_EXE_DBG_CNTX(b)	(0x4001100ll | (u64)(b) << 3)
92 #define OTX_CPT_PF_EXE_PERF_EVENT_CNT	(0x4001180ll)
93 #define OTX_CPT_PF_EXE_EPCI_INBX_CNT(b)	(0x4001200ll | (u64)(b) << 3)
94 #define OTX_CPT_PF_EXE_EPCI_OUTBX_CNT(b) (0x4001240ll | (u64)(b) << 3)
95 #define OTX_CPT_PF_ENGX_UCODE_BASE(b)	(0x4002000ll | (u64)(b) << 3)
96 #define OTX_CPT_PF_QX_CTL(b)		(0x8000000ll | (u64)(b) << 20)
97 #define OTX_CPT_PF_QX_GMCTL(b)		(0x8000020ll | (u64)(b) << 20)
98 #define OTX_CPT_PF_QX_CTL2(b)		(0x8000100ll | (u64)(b) << 20)
99 #define OTX_CPT_PF_VFX_MBOXX(b, c)	(0x8001000ll | (u64)(b) << 20 | \
100 					 (u64)(c) << 8)
101 
102 /* OcteonTX CPT VF registers */
103 #define OTX_CPT_VQX_CTL(b)		(0x100ll | (u64)(b) << 20)
104 #define OTX_CPT_VQX_SADDR(b)		(0x200ll | (u64)(b) << 20)
105 #define OTX_CPT_VQX_DONE_WAIT(b)	(0x400ll | (u64)(b) << 20)
106 #define OTX_CPT_VQX_INPROG(b)		(0x410ll | (u64)(b) << 20)
107 #define OTX_CPT_VQX_DONE(b)		(0x420ll | (u64)(b) << 20)
108 #define OTX_CPT_VQX_DONE_ACK(b)		(0x440ll | (u64)(b) << 20)
109 #define OTX_CPT_VQX_DONE_INT_W1S(b)	(0x460ll | (u64)(b) << 20)
110 #define OTX_CPT_VQX_DONE_INT_W1C(b)	(0x468ll | (u64)(b) << 20)
111 #define OTX_CPT_VQX_DONE_ENA_W1S(b)	(0x470ll | (u64)(b) << 20)
112 #define OTX_CPT_VQX_DONE_ENA_W1C(b)	(0x478ll | (u64)(b) << 20)
113 #define OTX_CPT_VQX_MISC_INT(b)		(0x500ll | (u64)(b) << 20)
114 #define OTX_CPT_VQX_MISC_INT_W1S(b)	(0x508ll | (u64)(b) << 20)
115 #define OTX_CPT_VQX_MISC_ENA_W1S(b)	(0x510ll | (u64)(b) << 20)
116 #define OTX_CPT_VQX_MISC_ENA_W1C(b)	(0x518ll | (u64)(b) << 20)
117 #define OTX_CPT_VQX_DOORBELL(b)		(0x600ll | (u64)(b) << 20)
118 #define OTX_CPT_VFX_PF_MBOXX(b, c)	(0x1000ll | ((b) << 20) | ((c) << 3))
119 
120 /*
121  * Enumeration otx_cpt_ucode_error_code_e
122  *
123  * Enumerates ucode errors
124  */
125 enum otx_cpt_ucode_error_code_e {
126 	CPT_NO_UCODE_ERROR = 0x00,
127 	ERR_OPCODE_UNSUPPORTED = 0x01,
128 
129 	/* Scatter gather */
130 	ERR_SCATTER_GATHER_WRITE_LENGTH = 0x02,
131 	ERR_SCATTER_GATHER_LIST = 0x03,
132 	ERR_SCATTER_GATHER_NOT_SUPPORTED = 0x04,
133 
134 };
135 
136 /*
137  * Enumeration otx_cpt_comp_e
138  *
139  * CPT OcteonTX Completion Enumeration
140  * Enumerates the values of CPT_RES_S[COMPCODE].
141  */
142 enum otx_cpt_comp_e {
143 	CPT_COMP_E_NOTDONE = 0x00,
144 	CPT_COMP_E_GOOD = 0x01,
145 	CPT_COMP_E_FAULT = 0x02,
146 	CPT_COMP_E_SWERR = 0x03,
147 	CPT_COMP_E_HWERR = 0x04,
148 	CPT_COMP_E_LAST_ENTRY = 0x05
149 };
150 
151 /*
152  * Enumeration otx_cpt_vf_int_vec_e
153  *
154  * CPT OcteonTX VF MSI-X Vector Enumeration
155  * Enumerates the MSI-X interrupt vectors.
156  */
157 enum otx_cpt_vf_int_vec_e {
158 	CPT_VF_INT_VEC_E_MISC = 0x00,
159 	CPT_VF_INT_VEC_E_DONE = 0x01
160 };
161 
162 /*
163  * Structure cpt_inst_s
164  *
165  * CPT Instruction Structure
166  * This structure specifies the instruction layout. Instructions are
167  * stored in memory as little-endian unless CPT()_PF_Q()_CTL[INST_BE] is set.
168  * cpt_inst_s_s
169  * Word 0
170  * doneint:1 Done interrupt.
171  *	0 = No interrupts related to this instruction.
172  *	1 = When the instruction completes, CPT()_VQ()_DONE[DONE] will be
173  *	incremented,and based on the rules described there an interrupt may
174  *	occur.
175  * Word 1
176  * res_addr [127: 64] Result IOVA.
177  *	If nonzero, specifies where to write CPT_RES_S.
178  *	If zero, no result structure will be written.
179  *	Address must be 16-byte aligned.
180  *	Bits <63:49> are ignored by hardware; software should use a
181  *	sign-extended bit <48> for forward compatibility.
182  * Word 2
183  *  grp:10 [171:162] If [WQ_PTR] is nonzero, the SSO guest-group to use when
184  *	CPT submits work SSO.
185  *	For the SSO to not discard the add-work request, FPA_PF_MAP() must map
186  *	[GRP] and CPT()_PF_Q()_GMCTL[GMID] as valid.
187  *  tt:2 [161:160] If [WQ_PTR] is nonzero, the SSO tag type to use when CPT
188  *	submits work to SSO
189  *  tag:32 [159:128] If [WQ_PTR] is nonzero, the SSO tag to use when CPT
190  *	submits work to SSO.
191  * Word 3
192  *  wq_ptr [255:192] If [WQ_PTR] is nonzero, it is a pointer to a
193  *	work-queue entry that CPT submits work to SSO after all context,
194  *	output data, and result write operations are visible to other
195  *	CNXXXX units and the cores. Bits <2:0> must be zero.
196  *	Bits <63:49> are ignored by hardware; software should
197  *	use a sign-extended bit <48> for forward compatibility.
198  *	Internal:
199  *	Bits <63:49>, <2:0> are ignored by hardware, treated as always 0x0.
200  * Word 4
201  *  ei0; [319:256] Engine instruction word 0. Passed to the AE/SE.
202  * Word 5
203  *  ei1; [383:320] Engine instruction word 1. Passed to the AE/SE.
204  * Word 6
205  *  ei2; [447:384] Engine instruction word 1. Passed to the AE/SE.
206  * Word 7
207  *  ei3; [511:448] Engine instruction word 1. Passed to the AE/SE.
208  *
209  */
210 union otx_cpt_inst_s {
211 	u64 u[8];
212 
213 	struct {
214 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
215 		u64 reserved_17_63:47;
216 		u64 doneint:1;
217 		u64 reserved_0_15:16;
218 #else /* Word 0 - Little Endian */
219 		u64 reserved_0_15:16;
220 		u64 doneint:1;
221 		u64 reserved_17_63:47;
222 #endif /* Word 0 - End */
223 		u64 res_addr;
224 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 2 - Big Endian */
225 		u64 reserved_172_191:20;
226 		u64 grp:10;
227 		u64 tt:2;
228 		u64 tag:32;
229 #else /* Word 2 - Little Endian */
230 		u64 tag:32;
231 		u64 tt:2;
232 		u64 grp:10;
233 		u64 reserved_172_191:20;
234 #endif /* Word 2 - End */
235 		u64 wq_ptr;
236 		u64 ei0;
237 		u64 ei1;
238 		u64 ei2;
239 		u64 ei3;
240 	} s;
241 };
242 
243 /*
244  * Structure cpt_res_s
245  *
246  * CPT Result Structure
247  * The CPT coprocessor writes the result structure after it completes a
248  * CPT_INST_S instruction. The result structure is exactly 16 bytes, and
249  * each instruction completion produces exactly one result structure.
250  *
251  * This structure is stored in memory as little-endian unless
252  * CPT()_PF_Q()_CTL[INST_BE] is set.
253  * cpt_res_s_s
254  * Word 0
255  *  doneint:1 [16:16] Done interrupt. This bit is copied from the
256  *	corresponding instruction's CPT_INST_S[DONEINT].
257  *  compcode:8 [7:0] Indicates completion/error status of the CPT coprocessor
258  *	for the	associated instruction, as enumerated by CPT_COMP_E.
259  *	Core software may write the memory location containing [COMPCODE] to
260  *	0x0 before ringing the doorbell, and then poll for completion by
261  *	checking for a nonzero value.
262  *	Once the core observes a nonzero [COMPCODE] value in this case,the CPT
263  *	coprocessor will have also completed L2/DRAM write operations.
264  * Word 1
265  *  reserved
266  *
267  */
268 union otx_cpt_res_s {
269 	u64 u[2];
270 	struct {
271 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
272 		u64 reserved_17_63:47;
273 		u64 doneint:1;
274 		u64 reserved_8_15:8;
275 		u64 compcode:8;
276 #else /* Word 0 - Little Endian */
277 		u64 compcode:8;
278 		u64 reserved_8_15:8;
279 		u64 doneint:1;
280 		u64 reserved_17_63:47;
281 #endif /* Word 0 - End */
282 		u64 reserved_64_127;
283 	} s;
284 };
285 
286 /*
287  * Register (NCB) otx_cpt#_pf_bist_status
288  *
289  * CPT PF Control Bist Status Register
290  * This register has the BIST status of memories. Each bit is the BIST result
291  * of an individual memory (per bit, 0 = pass and 1 = fail).
292  * otx_cptx_pf_bist_status_s
293  * Word0
294  *  bstatus [29:0](RO/H) BIST status. One bit per memory, enumerated by
295  *	CPT_RAMS_E.
296  */
297 union otx_cptx_pf_bist_status {
298 	u64 u;
299 	struct otx_cptx_pf_bist_status_s {
300 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
301 		u64 reserved_30_63:34;
302 		u64 bstatus:30;
303 #else /* Word 0 - Little Endian */
304 		u64 bstatus:30;
305 		u64 reserved_30_63:34;
306 #endif /* Word 0 - End */
307 	} s;
308 };
309 
310 /*
311  * Register (NCB) otx_cpt#_pf_constants
312  *
313  * CPT PF Constants Register
314  * This register contains implementation-related parameters of CPT in CNXXXX.
315  * otx_cptx_pf_constants_s
316  * Word 0
317  *  reserved_40_63:24 [63:40] Reserved.
318  *  epcis:8 [39:32](RO) Number of EPCI busses.
319  *  grps:8 [31:24](RO) Number of engine groups implemented.
320  *  ae:8 [23:16](RO/H) Number of AEs. In CNXXXX, for CPT0 returns 0x0,
321  *	for CPT1 returns 0x18, or less if there are fuse-disables.
322  *  se:8 [15:8](RO/H) Number of SEs. In CNXXXX, for CPT0 returns 0x30,
323  *	or less if there are fuse-disables, for CPT1 returns 0x0.
324  *  vq:8 [7:0](RO) Number of VQs.
325  */
326 union otx_cptx_pf_constants {
327 	u64 u;
328 	struct otx_cptx_pf_constants_s {
329 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
330 		u64 reserved_40_63:24;
331 		u64 epcis:8;
332 		u64 grps:8;
333 		u64 ae:8;
334 		u64 se:8;
335 		u64 vq:8;
336 #else /* Word 0 - Little Endian */
337 		u64 vq:8;
338 		u64 se:8;
339 		u64 ae:8;
340 		u64 grps:8;
341 		u64 epcis:8;
342 		u64 reserved_40_63:24;
343 #endif /* Word 0 - End */
344 	} s;
345 };
346 
347 /*
348  * Register (NCB) otx_cpt#_pf_exe_bist_status
349  *
350  * CPT PF Engine Bist Status Register
351  * This register has the BIST status of each engine.  Each bit is the
352  * BIST result of an individual engine (per bit, 0 = pass and 1 = fail).
353  * otx_cptx_pf_exe_bist_status_s
354  * Word0
355  *  reserved_48_63:16 [63:48] reserved
356  *  bstatus:48 [47:0](RO/H) BIST status. One bit per engine.
357  *
358  */
359 union otx_cptx_pf_exe_bist_status {
360 	u64 u;
361 	struct otx_cptx_pf_exe_bist_status_s {
362 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
363 		u64 reserved_48_63:16;
364 		u64 bstatus:48;
365 #else /* Word 0 - Little Endian */
366 		u64 bstatus:48;
367 		u64 reserved_48_63:16;
368 #endif /* Word 0 - End */
369 	} s;
370 };
371 
372 /*
373  * Register (NCB) otx_cpt#_pf_q#_ctl
374  *
375  * CPT Queue Control Register
376  * This register configures queues. This register should be changed only
377  * when quiescent (see CPT()_VQ()_INPROG[INFLIGHT]).
378  * otx_cptx_pf_qx_ctl_s
379  * Word0
380  *  reserved_60_63:4 [63:60] reserved.
381  *  aura:12; [59:48](R/W) Guest-aura for returning this queue's
382  *	instruction-chunk buffers to FPA. Only used when [INST_FREE] is set.
383  *	For the FPA to not discard the request, FPA_PF_MAP() must map
384  *	[AURA] and CPT()_PF_Q()_GMCTL[GMID] as valid.
385  *  reserved_45_47:3 [47:45] reserved.
386  *  size:13 [44:32](R/W) Command-buffer size, in number of 64-bit words per
387  *	command buffer segment. Must be 8*n + 1, where n is the number of
388  *	instructions per buffer segment.
389  *  reserved_11_31:21 [31:11] Reserved.
390  *  cont_err:1 [10:10](R/W) Continue on error.
391  *	0 = When CPT()_VQ()_MISC_INT[NWRP], CPT()_VQ()_MISC_INT[IRDE] or
392  *	CPT()_VQ()_MISC_INT[DOVF] are set by hardware or software via
393  *	CPT()_VQ()_MISC_INT_W1S, then CPT()_VQ()_CTL[ENA] is cleared.  Due to
394  *	pipelining, additional instructions may have been processed between the
395  *	instruction causing the error and the next instruction in the disabled
396  *	queue (the instruction at CPT()_VQ()_SADDR).
397  *	1 = Ignore errors and continue processing instructions.
398  *	For diagnostic use only.
399  *  inst_free:1 [9:9](R/W) Instruction FPA free. When set, when CPT reaches the
400  *	end of an instruction chunk, that chunk will be freed to the FPA.
401  *  inst_be:1 [8:8](R/W) Instruction big-endian control. When set, instructions,
402  *	instruction next chunk pointers, and result structures are stored in
403  *	big-endian format in memory.
404  *  iqb_ldwb:1 [7:7](R/W) Instruction load don't write back.
405  *	0 = The hardware issues NCB transient load (LDT) towards the cache,
406  *	which if the line hits and is dirty will cause the line to be
407  *	written back before being replaced.
408  *	1 = The hardware issues NCB LDWB read-and-invalidate command towards
409  *	the cache when fetching the last word of instructions; as a result the
410  *	line will not be written back when replaced.  This improves
411  *	performance, but software must not read the instructions after they are
412  *	posted to the hardware.	Reads that do not consume the last word of a
413  *	cache line always use LDI.
414  *  reserved_4_6:3 [6:4] Reserved.
415  *  grp:3; [3:1](R/W) Engine group.
416  *  pri:1; [0:0](R/W) Queue priority.
417  *	1 = This queue has higher priority. Round-robin between higher
418  *	priority queues.
419  *	0 = This queue has lower priority. Round-robin between lower
420  *	priority queues.
421  */
422 union otx_cptx_pf_qx_ctl {
423 	u64 u;
424 	struct otx_cptx_pf_qx_ctl_s {
425 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
426 		u64 reserved_60_63:4;
427 		u64 aura:12;
428 		u64 reserved_45_47:3;
429 		u64 size:13;
430 		u64 reserved_11_31:21;
431 		u64 cont_err:1;
432 		u64 inst_free:1;
433 		u64 inst_be:1;
434 		u64 iqb_ldwb:1;
435 		u64 reserved_4_6:3;
436 		u64 grp:3;
437 		u64 pri:1;
438 #else /* Word 0 - Little Endian */
439 		u64 pri:1;
440 		u64 grp:3;
441 		u64 reserved_4_6:3;
442 		u64 iqb_ldwb:1;
443 		u64 inst_be:1;
444 		u64 inst_free:1;
445 		u64 cont_err:1;
446 		u64 reserved_11_31:21;
447 		u64 size:13;
448 		u64 reserved_45_47:3;
449 		u64 aura:12;
450 		u64 reserved_60_63:4;
451 #endif /* Word 0 - End */
452 	} s;
453 };
454 
455 /*
456  * Register (NCB) otx_cpt#_vq#_saddr
457  *
458  * CPT Queue Starting Buffer Address Registers
459  * These registers set the instruction buffer starting address.
460  * otx_cptx_vqx_saddr_s
461  * Word0
462  *  reserved_49_63:15 [63:49] Reserved.
463  *  ptr:43 [48:6](R/W/H) Instruction buffer IOVA <48:6> (64-byte aligned).
464  *	When written, it is the initial buffer starting address; when read,
465  *	it is the next read pointer to be requested from L2C. The PTR field
466  *	is overwritten with the next pointer each time that the command buffer
467  *	segment is exhausted. New commands will then be read from the newly
468  *	specified command buffer pointer.
469  *  reserved_0_5:6 [5:0] Reserved.
470  *
471  */
472 union otx_cptx_vqx_saddr {
473 	u64 u;
474 	struct otx_cptx_vqx_saddr_s {
475 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
476 		u64 reserved_49_63:15;
477 		u64 ptr:43;
478 		u64 reserved_0_5:6;
479 #else /* Word 0 - Little Endian */
480 		u64 reserved_0_5:6;
481 		u64 ptr:43;
482 		u64 reserved_49_63:15;
483 #endif /* Word 0 - End */
484 	} s;
485 };
486 
487 /*
488  * Register (NCB) otx_cpt#_vq#_misc_ena_w1s
489  *
490  * CPT Queue Misc Interrupt Enable Set Register
491  * This register sets interrupt enable bits.
492  * otx_cptx_vqx_misc_ena_w1s_s
493  * Word0
494  * reserved_5_63:59 [63:5] Reserved.
495  * swerr:1 [4:4](R/W1S/H) Reads or sets enable for
496  *	CPT(0..1)_VQ(0..63)_MISC_INT[SWERR].
497  * nwrp:1 [3:3](R/W1S/H) Reads or sets enable for
498  *	CPT(0..1)_VQ(0..63)_MISC_INT[NWRP].
499  * irde:1 [2:2](R/W1S/H) Reads or sets enable for
500  *	CPT(0..1)_VQ(0..63)_MISC_INT[IRDE].
501  * dovf:1 [1:1](R/W1S/H) Reads or sets enable for
502  *	CPT(0..1)_VQ(0..63)_MISC_INT[DOVF].
503  * mbox:1 [0:0](R/W1S/H) Reads or sets enable for
504  *	CPT(0..1)_VQ(0..63)_MISC_INT[MBOX].
505  *
506  */
507 union otx_cptx_vqx_misc_ena_w1s {
508 	u64 u;
509 	struct otx_cptx_vqx_misc_ena_w1s_s {
510 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
511 		u64 reserved_5_63:59;
512 		u64 swerr:1;
513 		u64 nwrp:1;
514 		u64 irde:1;
515 		u64 dovf:1;
516 		u64 mbox:1;
517 #else /* Word 0 - Little Endian */
518 		u64 mbox:1;
519 		u64 dovf:1;
520 		u64 irde:1;
521 		u64 nwrp:1;
522 		u64 swerr:1;
523 		u64 reserved_5_63:59;
524 #endif /* Word 0 - End */
525 	} s;
526 };
527 
528 /*
529  * Register (NCB) otx_cpt#_vq#_doorbell
530  *
531  * CPT Queue Doorbell Registers
532  * Doorbells for the CPT instruction queues.
533  * otx_cptx_vqx_doorbell_s
534  * Word0
535  *  reserved_20_63:44 [63:20] Reserved.
536  *  dbell_cnt:20 [19:0](R/W/H) Number of instruction queue 64-bit words to add
537  *	to the CPT instruction doorbell count. Readback value is the the
538  *	current number of pending doorbell requests. If counter overflows
539  *	CPT()_VQ()_MISC_INT[DBELL_DOVF] is set. To reset the count back to
540  *	zero, write one to clear CPT()_VQ()_MISC_INT_ENA_W1C[DBELL_DOVF],
541  *	then write a value of 2^20 minus the read [DBELL_CNT], then write one
542  *	to CPT()_VQ()_MISC_INT_W1C[DBELL_DOVF] and
543  *	CPT()_VQ()_MISC_INT_ENA_W1S[DBELL_DOVF]. Must be a multiple of 8.
544  *	All CPT instructions are 8 words and require a doorbell count of
545  *	multiple of 8.
546  */
547 union otx_cptx_vqx_doorbell {
548 	u64 u;
549 	struct otx_cptx_vqx_doorbell_s {
550 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
551 		u64 reserved_20_63:44;
552 		u64 dbell_cnt:20;
553 #else /* Word 0 - Little Endian */
554 		u64 dbell_cnt:20;
555 		u64 reserved_20_63:44;
556 #endif /* Word 0 - End */
557 	} s;
558 };
559 
560 /*
561  * Register (NCB) otx_cpt#_vq#_inprog
562  *
563  * CPT Queue In Progress Count Registers
564  * These registers contain the per-queue instruction in flight registers.
565  * otx_cptx_vqx_inprog_s
566  * Word0
567  *  reserved_8_63:56 [63:8] Reserved.
568  *  inflight:8 [7:0](RO/H) Inflight count. Counts the number of instructions
569  *	for the VF for which CPT is fetching, executing or responding to
570  *	instructions. However this does not include any interrupts that are
571  *	awaiting software handling (CPT()_VQ()_DONE[DONE] != 0x0).
572  *	A queue may not be reconfigured until:
573  *	1. CPT()_VQ()_CTL[ENA] is cleared by software.
574  *	2. [INFLIGHT] is polled until equals to zero.
575  */
576 union otx_cptx_vqx_inprog {
577 	u64 u;
578 	struct otx_cptx_vqx_inprog_s {
579 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
580 		u64 reserved_8_63:56;
581 		u64 inflight:8;
582 #else /* Word 0 - Little Endian */
583 		u64 inflight:8;
584 		u64 reserved_8_63:56;
585 #endif /* Word 0 - End */
586 	} s;
587 };
588 
589 /*
590  * Register (NCB) otx_cpt#_vq#_misc_int
591  *
592  * CPT Queue Misc Interrupt Register
593  * These registers contain the per-queue miscellaneous interrupts.
594  * otx_cptx_vqx_misc_int_s
595  * Word 0
596  *  reserved_5_63:59 [63:5] Reserved.
597  *  swerr:1 [4:4](R/W1C/H) Software error from engines.
598  *  nwrp:1  [3:3](R/W1C/H) NCB result write response error.
599  *  irde:1  [2:2](R/W1C/H) Instruction NCB read response error.
600  *  dovf:1 [1:1](R/W1C/H) Doorbell overflow.
601  *  mbox:1 [0:0](R/W1C/H) PF to VF mailbox interrupt. Set when
602  *	CPT()_VF()_PF_MBOX(0) is written.
603  *
604  */
605 union otx_cptx_vqx_misc_int {
606 	u64 u;
607 	struct otx_cptx_vqx_misc_int_s {
608 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
609 		u64 reserved_5_63:59;
610 		u64 swerr:1;
611 		u64 nwrp:1;
612 		u64 irde:1;
613 		u64 dovf:1;
614 		u64 mbox:1;
615 #else /* Word 0 - Little Endian */
616 		u64 mbox:1;
617 		u64 dovf:1;
618 		u64 irde:1;
619 		u64 nwrp:1;
620 		u64 swerr:1;
621 		u64 reserved_5_63:59;
622 #endif /* Word 0 - End */
623 	} s;
624 };
625 
626 /*
627  * Register (NCB) otx_cpt#_vq#_done_ack
628  *
629  * CPT Queue Done Count Ack Registers
630  * This register is written by software to acknowledge interrupts.
631  * otx_cptx_vqx_done_ack_s
632  * Word0
633  *  reserved_20_63:44 [63:20] Reserved.
634  *  done_ack:20 [19:0](R/W/H) Number of decrements to CPT()_VQ()_DONE[DONE].
635  *	Reads CPT()_VQ()_DONE[DONE]. Written by software to acknowledge
636  *	interrupts. If CPT()_VQ()_DONE[DONE] is still nonzero the interrupt
637  *	will be re-sent if the conditions described in CPT()_VQ()_DONE[DONE]
638  *	are satisfied.
639  *
640  */
641 union otx_cptx_vqx_done_ack {
642 	u64 u;
643 	struct otx_cptx_vqx_done_ack_s {
644 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
645 		u64 reserved_20_63:44;
646 		u64 done_ack:20;
647 #else /* Word 0 - Little Endian */
648 		u64 done_ack:20;
649 		u64 reserved_20_63:44;
650 #endif /* Word 0 - End */
651 	} s;
652 };
653 
654 /*
655  * Register (NCB) otx_cpt#_vq#_done
656  *
657  * CPT Queue Done Count Registers
658  * These registers contain the per-queue instruction done count.
659  * cptx_vqx_done_s
660  * Word0
661  *  reserved_20_63:44 [63:20] Reserved.
662  *  done:20 [19:0](R/W/H) Done count. When CPT_INST_S[DONEINT] set and that
663  *	instruction completes, CPT()_VQ()_DONE[DONE] is incremented when the
664  *	instruction finishes. Write to this field are for diagnostic use only;
665  *	instead software writes CPT()_VQ()_DONE_ACK with the number of
666  *	decrements for this field.
667  *	Interrupts are sent as follows:
668  *	* When CPT()_VQ()_DONE[DONE] = 0, then no results are pending, the
669  *	interrupt coalescing timer is held to zero, and an interrupt is not
670  *	sent.
671  *	* When CPT()_VQ()_DONE[DONE] != 0, then the interrupt coalescing timer
672  *	counts. If the counter is >= CPT()_VQ()_DONE_WAIT[TIME_WAIT]*1024, or
673  *	CPT()_VQ()_DONE[DONE] >= CPT()_VQ()_DONE_WAIT[NUM_WAIT], i.e. enough
674  *	time has passed or enough results have arrived, then the interrupt is
675  *	sent.
676  *	* When CPT()_VQ()_DONE_ACK is written (or CPT()_VQ()_DONE is written
677  *	but this is not typical), the interrupt coalescing timer restarts.
678  *	Note after decrementing this interrupt equation is recomputed,
679  *	for example if CPT()_VQ()_DONE[DONE] >= CPT()_VQ()_DONE_WAIT[NUM_WAIT]
680  *	and because the timer is zero, the interrupt will be resent immediately.
681  *	(This covers the race case between software acknowledging an interrupt
682  *	and a result returning.)
683  *	* When CPT()_VQ()_DONE_ENA_W1S[DONE] = 0, interrupts are not sent,
684  *	but the counting described above still occurs.
685  *	Since CPT instructions complete out-of-order, if software is using
686  *	completion interrupts the suggested scheme is to request a DONEINT on
687  *	each request, and when an interrupt arrives perform a "greedy" scan for
688  *	completions; even if a later command is acknowledged first this will
689  *	not result in missing a completion.
690  *	Software is responsible for making sure [DONE] does not overflow;
691  *	for example by insuring there are not more than 2^20-1 instructions in
692  *	flight that may request interrupts.
693  *
694  */
695 union otx_cptx_vqx_done {
696 	u64 u;
697 	struct otx_cptx_vqx_done_s {
698 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
699 		u64 reserved_20_63:44;
700 		u64 done:20;
701 #else /* Word 0 - Little Endian */
702 		u64 done:20;
703 		u64 reserved_20_63:44;
704 #endif /* Word 0 - End */
705 	} s;
706 };
707 
708 /*
709  * Register (NCB) otx_cpt#_vq#_done_wait
710  *
711  * CPT Queue Done Interrupt Coalescing Wait Registers
712  * Specifies the per queue interrupt coalescing settings.
713  * cptx_vqx_done_wait_s
714  * Word0
715  *  reserved_48_63:16 [63:48] Reserved.
716  *  time_wait:16; [47:32](R/W) Time hold-off. When CPT()_VQ()_DONE[DONE] = 0
717  *	or CPT()_VQ()_DONE_ACK is written a timer is cleared. When the timer
718  *	reaches [TIME_WAIT]*1024 then interrupt coalescing ends.
719  *	see CPT()_VQ()_DONE[DONE]. If 0x0, time coalescing is disabled.
720  *  reserved_20_31:12 [31:20] Reserved.
721  *  num_wait:20 [19:0](R/W) Number of messages hold-off.
722  *	When CPT()_VQ()_DONE[DONE] >= [NUM_WAIT] then interrupt coalescing ends
723  *	see CPT()_VQ()_DONE[DONE]. If 0x0, same behavior as 0x1.
724  *
725  */
726 union otx_cptx_vqx_done_wait {
727 	u64 u;
728 	struct otx_cptx_vqx_done_wait_s {
729 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
730 		u64 reserved_48_63:16;
731 		u64 time_wait:16;
732 		u64 reserved_20_31:12;
733 		u64 num_wait:20;
734 #else /* Word 0 - Little Endian */
735 		u64 num_wait:20;
736 		u64 reserved_20_31:12;
737 		u64 time_wait:16;
738 		u64 reserved_48_63:16;
739 #endif /* Word 0 - End */
740 	} s;
741 };
742 
743 /*
744  * Register (NCB) otx_cpt#_vq#_done_ena_w1s
745  *
746  * CPT Queue Done Interrupt Enable Set Registers
747  * Write 1 to these registers will enable the DONEINT interrupt for the queue.
748  * cptx_vqx_done_ena_w1s_s
749  * Word0
750  *  reserved_1_63:63 [63:1] Reserved.
751  *  done:1 [0:0](R/W1S/H) Write 1 will enable DONEINT for this queue.
752  *	Write 0 has no effect. Read will return the enable bit.
753  */
754 union otx_cptx_vqx_done_ena_w1s {
755 	u64 u;
756 	struct otx_cptx_vqx_done_ena_w1s_s {
757 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
758 		u64 reserved_1_63:63;
759 		u64 done:1;
760 #else /* Word 0 - Little Endian */
761 		u64 done:1;
762 		u64 reserved_1_63:63;
763 #endif /* Word 0 - End */
764 	} s;
765 };
766 
767 /*
768  * Register (NCB) otx_cpt#_vq#_ctl
769  *
770  * CPT VF Queue Control Registers
771  * This register configures queues. This register should be changed (other than
772  * clearing [ENA]) only when quiescent (see CPT()_VQ()_INPROG[INFLIGHT]).
773  * cptx_vqx_ctl_s
774  * Word0
775  *  reserved_1_63:63 [63:1] Reserved.
776  *  ena:1 [0:0](R/W/H) Enables the logical instruction queue.
777  *	See also CPT()_PF_Q()_CTL[CONT_ERR] and	CPT()_VQ()_INPROG[INFLIGHT].
778  *	1 = Queue is enabled.
779  *	0 = Queue is disabled.
780  */
781 union otx_cptx_vqx_ctl {
782 	u64 u;
783 	struct otx_cptx_vqx_ctl_s {
784 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
785 		u64 reserved_1_63:63;
786 		u64 ena:1;
787 #else /* Word 0 - Little Endian */
788 		u64 ena:1;
789 		u64 reserved_1_63:63;
790 #endif /* Word 0 - End */
791 	} s;
792 };
793 
794 /*
795  * Error Address/Error Codes
796  *
797  * In the event of a severe error, microcode writes an 8-byte Error Code
798  * value (ECODE) to host memory at the Rptr address specified by the host
799  * system (in the 64-byte request).
800  *
801  * Word0
802  *  [63:56](R) 8-bit completion code
803  *  [55:48](R) Number of the core that reported the severe error
804  *  [47:0] Lower 6 bytes of M-Inst word2. Used to assist in uniquely
805  *  identifying which specific instruction caused the error. This assumes
806  *  that each instruction has a unique result location (RPTR), at least
807  *  for a given period of time.
808  */
809 union otx_cpt_error_code {
810 	u64 u;
811 	struct otx_cpt_error_code_s {
812 #if defined(__BIG_ENDIAN_BITFIELD) /* Word 0 - Big Endian */
813 		uint64_t ccode:8;
814 		uint64_t coreid:8;
815 		uint64_t rptr6:48;
816 #else /* Word 0 - Little Endian */
817 		uint64_t rptr6:48;
818 		uint64_t coreid:8;
819 		uint64_t ccode:8;
820 #endif /* Word 0 - End */
821 	} s;
822 };
823 
824 #endif /*__OTX_CPT_HW_TYPES_H */
825