xref: /arm-trusted-firmware/include/drivers/nxp/crypto/caam/sec_hw_specific.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2017-2021 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #ifndef _SEC_HW_SPECIFIC_H_
9*91f16700Schasinglulu #define _SEC_HW_SPECIFIC_H_
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include "caam.h"
12*91f16700Schasinglulu #include "sec_jr_driver.h"
13*91f16700Schasinglulu 
14*91f16700Schasinglulu  /* DEFINES AND MACROS */
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /* Used to retry resetting a job ring in SEC hardware. */
17*91f16700Schasinglulu #define SEC_TIMEOUT 100000
18*91f16700Schasinglulu 
19*91f16700Schasinglulu /*
20*91f16700Schasinglulu  * Offset to the registers of a job ring.
21*91f16700Schasinglulu  *Is different for each job ring.
22*91f16700Schasinglulu  */
23*91f16700Schasinglulu #define CHAN_BASE(jr)   ((phys_addr_t)(jr)->register_base_addr)
24*91f16700Schasinglulu 
25*91f16700Schasinglulu #define unlikely(x)	 __builtin_expect(!!(x), 0)
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #define SEC_JOB_RING_IS_FULL(pi, ci, ring_max_size, ring_threshold)    \
28*91f16700Schasinglulu 	((((pi) + 1 + ((ring_max_size) - (ring_threshold))) &	\
29*91f16700Schasinglulu 	  (ring_max_size - 1))  == ((ci)))
30*91f16700Schasinglulu 
31*91f16700Schasinglulu #define SEC_CIRCULAR_COUNTER(x, max)   (((x) + 1) & (max - 1))
32*91f16700Schasinglulu 
33*91f16700Schasinglulu  /* Struct representing various job ring registers */
34*91f16700Schasinglulu struct jobring_regs {
35*91f16700Schasinglulu #ifdef NXP_SEC_BE
36*91f16700Schasinglulu 	unsigned int irba_h;
37*91f16700Schasinglulu 	unsigned int irba_l;
38*91f16700Schasinglulu #else
39*91f16700Schasinglulu 	unsigned int irba_l;
40*91f16700Schasinglulu 	unsigned int irba_h;
41*91f16700Schasinglulu #endif
42*91f16700Schasinglulu 	unsigned int rsvd1;
43*91f16700Schasinglulu 	unsigned int irs;
44*91f16700Schasinglulu 	unsigned int rsvd2;
45*91f16700Schasinglulu 	unsigned int irsa;
46*91f16700Schasinglulu 	unsigned int rsvd3;
47*91f16700Schasinglulu 	unsigned int irja;
48*91f16700Schasinglulu #ifdef NXP_SEC_BE
49*91f16700Schasinglulu 	unsigned int orba_h;
50*91f16700Schasinglulu 	unsigned int orba_l;
51*91f16700Schasinglulu #else
52*91f16700Schasinglulu 	unsigned int orba_l;
53*91f16700Schasinglulu 	unsigned int orba_h;
54*91f16700Schasinglulu #endif
55*91f16700Schasinglulu 	unsigned int rsvd4;
56*91f16700Schasinglulu 	unsigned int ors;
57*91f16700Schasinglulu 	unsigned int rsvd5;
58*91f16700Schasinglulu 	unsigned int orjr;
59*91f16700Schasinglulu 	unsigned int rsvd6;
60*91f16700Schasinglulu 	unsigned int orsf;
61*91f16700Schasinglulu 	unsigned int rsvd7;
62*91f16700Schasinglulu 	unsigned int jrsta;
63*91f16700Schasinglulu 	unsigned int rsvd8;
64*91f16700Schasinglulu 	unsigned int jrint;
65*91f16700Schasinglulu 	unsigned int jrcfg0;
66*91f16700Schasinglulu 	unsigned int jrcfg1;
67*91f16700Schasinglulu 	unsigned int rsvd9;
68*91f16700Schasinglulu 	unsigned int irri;
69*91f16700Schasinglulu 	unsigned int rsvd10;
70*91f16700Schasinglulu 	unsigned int orwi;
71*91f16700Schasinglulu 	unsigned int rsvd11;
72*91f16700Schasinglulu 	unsigned int jrcr;
73*91f16700Schasinglulu };
74*91f16700Schasinglulu 
75*91f16700Schasinglulu  /* Offsets representing common SEC Registers */
76*91f16700Schasinglulu #define SEC_REG_MCFGR_OFFSET		0x0004
77*91f16700Schasinglulu #define SEC_REG_SCFGR_OFFSET		0x000C
78*91f16700Schasinglulu #define SEC_REG_JR0ICIDR_MS_OFFSET	0x0010
79*91f16700Schasinglulu #define SEC_REG_JR0ICIDR_LS_OFFSET	0x0014
80*91f16700Schasinglulu #define SEC_REG_JR1ICIDR_MS_OFFSET	0x0018
81*91f16700Schasinglulu #define SEC_REG_JR1ICIDR_LS_OFFSET	0x001C
82*91f16700Schasinglulu #define SEC_REG_JR2ICIDR_MS_OFFSET	0x0020
83*91f16700Schasinglulu #define SEC_REG_JR2ICIDR_LS_OFFSET	0x0024
84*91f16700Schasinglulu #define SEC_REG_JR3ICIDR_MS_OFFSET	0x0028
85*91f16700Schasinglulu #define SEC_REG_JR3ICIDR_LS_OFFSET	0x002C
86*91f16700Schasinglulu #define SEC_REG_JRSTARTR_OFFSET		0x005C
87*91f16700Schasinglulu #define SEC_REG_CTPR_MS_OFFSET		0x0FA8
88*91f16700Schasinglulu 
89*91f16700Schasinglulu  /* Offsets  representing various RNG registers */
90*91f16700Schasinglulu #define RNG_REG_RTMCTL_OFFSET		0x0600
91*91f16700Schasinglulu #define RNG_REG_RTSDCTL_OFFSET		0x0610
92*91f16700Schasinglulu #define RNG_REG_RTFRQMIN_OFFSET		0x0618
93*91f16700Schasinglulu #define RNG_REG_RTFRQMAX_OFFSET		0x061C
94*91f16700Schasinglulu #define RNG_REG_RDSTA_OFFSET		0x06C0
95*91f16700Schasinglulu #define ALG_AAI_SH_SHIFT		4
96*91f16700Schasinglulu 
97*91f16700Schasinglulu  /* SEC Registers Bitmasks */
98*91f16700Schasinglulu #define	MCFGR_PS_SHIFT			16
99*91f16700Schasinglulu #define	MCFGR_AWCACHE_SHIFT			 8
100*91f16700Schasinglulu #define	MCFGR_AWCACHE_MASK	(0xF << MCFGR_AWCACHE_SHIFT)
101*91f16700Schasinglulu #define	MCFGR_ARCACHE_SHIFT			12
102*91f16700Schasinglulu #define	MCFGR_ARCACHE_MASK	(0xF << MCFGR_ARCACHE_SHIFT)
103*91f16700Schasinglulu 
104*91f16700Schasinglulu #define SCFGR_RNGSH0		0x00000200
105*91f16700Schasinglulu #define	SCFGR_VIRT_EN		0x00008000
106*91f16700Schasinglulu 
107*91f16700Schasinglulu #define JRICID_MS_LICID		0x80000000
108*91f16700Schasinglulu #define JRICID_MS_LAMTD		0x00020000
109*91f16700Schasinglulu #define JRICID_MS_AMTDT		0x00010000
110*91f16700Schasinglulu #define JRICID_MS_TZ		0x00008000
111*91f16700Schasinglulu #define JRICID_LS_SDID_MASK	0x00000FFF
112*91f16700Schasinglulu #define JRICID_LS_NSEQID_MASK	0x0FFF0000
113*91f16700Schasinglulu #define JRICID_LS_NSEQID_SHIFT		16
114*91f16700Schasinglulu #define JRICID_LS_SEQID_MASK	0x00000FFF
115*91f16700Schasinglulu 
116*91f16700Schasinglulu #define JRSTARTR_STARTJR0	0x00000001
117*91f16700Schasinglulu #define JRSTARTR_STARTJR1	0x00000002
118*91f16700Schasinglulu #define JRSTARTR_STARTJR2	0x00000004
119*91f16700Schasinglulu #define JRSTARTR_STARTJR3	0x00000008
120*91f16700Schasinglulu 
121*91f16700Schasinglulu #define CTPR_VIRT_EN_POR	0x00000002
122*91f16700Schasinglulu #define CTPR_VIRT_EN_INC	0x00000001
123*91f16700Schasinglulu 
124*91f16700Schasinglulu  /* RNG RDSTA bitmask */
125*91f16700Schasinglulu #define RNG_STATE0_HANDLE_INSTANTIATED	0x00000001
126*91f16700Schasinglulu #define RTMCTL_PRGM 0x00010000	/* 1 -> program mode, 0 -> run mode */
127*91f16700Schasinglulu  /* use von Neumann data in both entropy shifter and statistical checker */
128*91f16700Schasinglulu #define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_SC	 0
129*91f16700Schasinglulu  /* use raw data in both entropy shifter and statistical checker */
130*91f16700Schasinglulu #define RTMCTL_SAMP_MODE_RAW_ES_SC			 1
131*91f16700Schasinglulu  /* use von Neumann data in entropy shifter, raw data in statistical checker */
132*91f16700Schasinglulu #define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_RAW_SC 2
133*91f16700Schasinglulu  /* invalid combination */
134*91f16700Schasinglulu #define RTMCTL_SAMP_MODE_INVALID			   3
135*91f16700Schasinglulu #define RTSDCTL_ENT_DLY_MIN	3200
136*91f16700Schasinglulu #define RTSDCTL_ENT_DLY_MAX	12800
137*91f16700Schasinglulu #define RTSDCTL_ENT_DLY_SHIFT	16
138*91f16700Schasinglulu #define RTSDCTL_ENT_DLY_MASK	(U(0xffff) << RTSDCTL_ENT_DLY_SHIFT)
139*91f16700Schasinglulu #define RTFRQMAX_DISABLE	   (1 << 20)
140*91f16700Schasinglulu 
141*91f16700Schasinglulu  /* Constants for error handling on job ring */
142*91f16700Schasinglulu #define JR_REG_JRINT_ERR_TYPE_SHIFT	8
143*91f16700Schasinglulu #define JR_REG_JRINT_ERR_ORWI_SHIFT	16
144*91f16700Schasinglulu #define JR_REG_JRINIT_JRE_SHIFT			1
145*91f16700Schasinglulu 
146*91f16700Schasinglulu #define JRINT_JRE			(1 << JR_REG_JRINIT_JRE_SHIFT)
147*91f16700Schasinglulu #define JRINT_ERR_WRITE_STATUS		(1 << JR_REG_JRINT_ERR_TYPE_SHIFT)
148*91f16700Schasinglulu #define JRINT_ERR_BAD_INPUT_BASE	(3 << JR_REG_JRINT_ERR_TYPE_SHIFT)
149*91f16700Schasinglulu #define JRINT_ERR_BAD_OUTPUT_BASE	(4 << JR_REG_JRINT_ERR_TYPE_SHIFT)
150*91f16700Schasinglulu #define JRINT_ERR_WRITE_2_IRBA		(5 << JR_REG_JRINT_ERR_TYPE_SHIFT)
151*91f16700Schasinglulu #define JRINT_ERR_WRITE_2_ORBA		(6 << JR_REG_JRINT_ERR_TYPE_SHIFT)
152*91f16700Schasinglulu #define JRINT_ERR_RES_B4_HALT		(7 << JR_REG_JRINT_ERR_TYPE_SHIFT)
153*91f16700Schasinglulu #define JRINT_ERR_REM_TOO_MANY		(8 << JR_REG_JRINT_ERR_TYPE_SHIFT)
154*91f16700Schasinglulu #define JRINT_ERR_ADD_TOO_MANY		(9 << JR_REG_JRINT_ERR_TYPE_SHIFT)
155*91f16700Schasinglulu #define JRINT_ERR_HALT_MASK		0x0C
156*91f16700Schasinglulu #define JRINT_ERR_HALT_INPROGRESS	0x04
157*91f16700Schasinglulu #define JRINT_ERR_HALT_COMPLETE		0x08
158*91f16700Schasinglulu 
159*91f16700Schasinglulu #define JR_REG_JRCR_VAL_RESET		0x00000001
160*91f16700Schasinglulu 
161*91f16700Schasinglulu #define JR_REG_JRCFG_LO_ICTT_SHIFT	0x10
162*91f16700Schasinglulu #define JR_REG_JRCFG_LO_ICDCT_SHIFT	0x08
163*91f16700Schasinglulu #define JR_REG_JRCFG_LO_ICEN_EN		0x02
164*91f16700Schasinglulu #define JR_REG_JRCFG_LO_IMSK_EN		0x01
165*91f16700Schasinglulu 
166*91f16700Schasinglulu  /* Constants for Descriptor Processing errors */
167*91f16700Schasinglulu #define SEC_HW_ERR_SSRC_NO_SRC			0x00
168*91f16700Schasinglulu #define SEC_HW_ERR_SSRC_CCB_ERR			0x02
169*91f16700Schasinglulu #define SEC_HW_ERR_SSRC_JMP_HALT_U	0x03
170*91f16700Schasinglulu #define SEC_HW_ERR_SSRC_DECO		0x04
171*91f16700Schasinglulu #define SEC_HW_ERR_SSRC_JR		0x06
172*91f16700Schasinglulu #define SEC_HW_ERR_SSRC_JMP_HALT_COND   0x07
173*91f16700Schasinglulu 
174*91f16700Schasinglulu #define SEC_HW_ERR_DECO_HFN_THRESHOLD   0xF1
175*91f16700Schasinglulu #define SEC_HW_ERR_CCB_ICV_CHECK_FAIL   0x0A
176*91f16700Schasinglulu 
177*91f16700Schasinglulu  /* Macros for extracting error codes for the job ring */
178*91f16700Schasinglulu 
179*91f16700Schasinglulu #define JR_REG_JRINT_ERR_TYPE_EXTRACT(value)			\
180*91f16700Schasinglulu 				((value) & 0x00000F00)
181*91f16700Schasinglulu 
182*91f16700Schasinglulu #define JR_REG_JRINT_ERR_ORWI_EXTRACT(value)			\
183*91f16700Schasinglulu 				(((value) & 0x3FFF0000) >>	\
184*91f16700Schasinglulu 				 JR_REG_JRINT_ERR_ORWI_SHIFT)
185*91f16700Schasinglulu 
186*91f16700Schasinglulu #define JR_REG_JRINT_JRE_EXTRACT(value)				\
187*91f16700Schasinglulu 				((value) & JRINT_JRE)
188*91f16700Schasinglulu 
189*91f16700Schasinglulu  /* Macros for manipulating JR registers */
190*91f16700Schasinglulu typedef struct {
191*91f16700Schasinglulu #ifdef NXP_SEC_BE
192*91f16700Schasinglulu 		uint32_t high;
193*91f16700Schasinglulu 		uint32_t low;
194*91f16700Schasinglulu #else
195*91f16700Schasinglulu 		uint32_t low;
196*91f16700Schasinglulu 		uint32_t high;
197*91f16700Schasinglulu #endif
198*91f16700Schasinglulu } ptr_addr_t;
199*91f16700Schasinglulu 
200*91f16700Schasinglulu #if defined(CONFIG_PHYS_64BIT)
201*91f16700Schasinglulu #define sec_read_addr(a)		sec_in64((a))
202*91f16700Schasinglulu #define sec_write_addr(a, v)	sec_out64((a), (v))
203*91f16700Schasinglulu #else
204*91f16700Schasinglulu #define sec_read_addr(a)		sec_in32((a))
205*91f16700Schasinglulu #define sec_write_addr(a, v)		sec_out32((a), (v))
206*91f16700Schasinglulu #endif
207*91f16700Schasinglulu 
208*91f16700Schasinglulu #define JR_REG(name, jr)	(CHAN_BASE(jr) + JR_REG_##name##_OFFSET)
209*91f16700Schasinglulu #define JR_REG_LO(name, jr)	(CHAN_BASE(jr) + JR_REG_##name##_OFFSET_LO)
210*91f16700Schasinglulu 
211*91f16700Schasinglulu #define GET_JR_REG(name, jr)	(sec_in32(JR_REG(name, (jr))))
212*91f16700Schasinglulu #define GET_JR_REG_LO(name, jr)	(sec_in32(JR_REG_LO(name, (jr))))
213*91f16700Schasinglulu 
214*91f16700Schasinglulu #define SET_JR_REG(name, jr, val)		\
215*91f16700Schasinglulu 		(sec_out32(JR_REG(name, (jr)), (val)))
216*91f16700Schasinglulu 
217*91f16700Schasinglulu #define SET_JR_REG_LO(name, jr, val)	\
218*91f16700Schasinglulu 		(sec_out32(JR_REG_LO(name, (jr)), (val)))
219*91f16700Schasinglulu 
220*91f16700Schasinglulu  /* STRUCTURES AND OTHER TYPEDEFS */
221*91f16700Schasinglulu  /*  Lists the possible states for a job ring. */
222*91f16700Schasinglulu typedef enum sec_job_ring_state_e {
223*91f16700Schasinglulu 	SEC_JOB_RING_STATE_STARTED,	/* Job ring is initialized */
224*91f16700Schasinglulu 	SEC_JOB_RING_STATE_RESET,	/* Job ring reset is in progress */
225*91f16700Schasinglulu } sec_job_ring_state_t;
226*91f16700Schasinglulu 
227*91f16700Schasinglulu struct sec_job_ring_t {
228*91f16700Schasinglulu 	/*
229*91f16700Schasinglulu 	 * Consumer index for job ring (jobs array).
230*91f16700Schasinglulu 	 * @note: cidx and pidx are accessed from
231*91f16700Schasinglulu 	 * different threads.
232*91f16700Schasinglulu 	 * Place the cidx and pidx inside the structure
233*91f16700Schasinglulu 	 *  so that they lay on different cachelines, to
234*91f16700Schasinglulu 	 * avoid false sharing between threads when the
235*91f16700Schasinglulu 	 * threads run on different cores!
236*91f16700Schasinglulu 	 */
237*91f16700Schasinglulu 	uint32_t cidx;
238*91f16700Schasinglulu 
239*91f16700Schasinglulu 	/* Producer index for job ring (jobs array) */
240*91f16700Schasinglulu 	uint32_t pidx;
241*91f16700Schasinglulu 
242*91f16700Schasinglulu 	/*  Ring of input descriptors. Size of array is power of 2 to allow
243*91f16700Schasinglulu 	 * fast update of producer/consumer indexes with  bitwise operations.
244*91f16700Schasinglulu 	 */
245*91f16700Schasinglulu 	phys_addr_t *input_ring;
246*91f16700Schasinglulu 
247*91f16700Schasinglulu 	/*  Ring of output descriptors. */
248*91f16700Schasinglulu 	struct sec_outring_entry *output_ring;
249*91f16700Schasinglulu 
250*91f16700Schasinglulu 	/* The file descriptor used for polling for interrupts notifications */
251*91f16700Schasinglulu 	uint32_t irq_fd;
252*91f16700Schasinglulu 
253*91f16700Schasinglulu 	/* Model used by SEC Driver to receive  notifications from SEC.
254*91f16700Schasinglulu 	 *  Can be either of the three:
255*91f16700Schasinglulu 	 * #SEC_NOTIFICATION_TYPE_IRQ or
256*91f16700Schasinglulu 	 * #SEC_NOTIFICATION_TYPE_POLL
257*91f16700Schasinglulu 	 */
258*91f16700Schasinglulu 	uint32_t jr_mode;
259*91f16700Schasinglulu 	/* Base address for SEC's register memory for this job ring. */
260*91f16700Schasinglulu 	void *register_base_addr;
261*91f16700Schasinglulu 	/* notifies if coelescing is enabled for the job ring */
262*91f16700Schasinglulu 	uint8_t coalescing_en;
263*91f16700Schasinglulu 	/* The state of this job ring */
264*91f16700Schasinglulu 	sec_job_ring_state_t jr_state;
265*91f16700Schasinglulu };
266*91f16700Schasinglulu 
267*91f16700Schasinglulu  /* Forward structure declaration */
268*91f16700Schasinglulu typedef struct sec_job_ring_t sec_job_ring_t;
269*91f16700Schasinglulu 
270*91f16700Schasinglulu struct sec_outring_entry {
271*91f16700Schasinglulu 	phys_addr_t desc;	/* Pointer to completed descriptor */
272*91f16700Schasinglulu 	uint32_t status;	/* Status for completed descriptor */
273*91f16700Schasinglulu } __packed;
274*91f16700Schasinglulu 
275*91f16700Schasinglulu  /* Lists the states possible for the SEC user space driver. */
276*91f16700Schasinglulu typedef enum sec_driver_state_e {
277*91f16700Schasinglulu 	SEC_DRIVER_STATE_IDLE,	/*< Driver not initialized */
278*91f16700Schasinglulu 	SEC_DRIVER_STATE_STARTED,	/*< Driver initialized and */
279*91f16700Schasinglulu 	SEC_DRIVER_STATE_RELEASE,	/*< Driver release is in progress */
280*91f16700Schasinglulu } sec_driver_state_t;
281*91f16700Schasinglulu 
282*91f16700Schasinglulu  /* Union describing the possible error codes that */
283*91f16700Schasinglulu  /* can be set in the descriptor status word */
284*91f16700Schasinglulu 
285*91f16700Schasinglulu union hw_error_code {
286*91f16700Schasinglulu 	uint32_t error;
287*91f16700Schasinglulu 	union {
288*91f16700Schasinglulu 		struct {
289*91f16700Schasinglulu 			uint32_t ssrc:4;
290*91f16700Schasinglulu 			uint32_t ssed_val:28;
291*91f16700Schasinglulu 		} __packed value;
292*91f16700Schasinglulu 		struct {
293*91f16700Schasinglulu 			uint32_t ssrc:4;
294*91f16700Schasinglulu 			uint32_t res:28;
295*91f16700Schasinglulu 		} __packed no_status_src;
296*91f16700Schasinglulu 		struct {
297*91f16700Schasinglulu 			uint32_t ssrc:4;
298*91f16700Schasinglulu 			uint32_t jmp:1;
299*91f16700Schasinglulu 			uint32_t res:11;
300*91f16700Schasinglulu 			uint32_t desc_idx:8;
301*91f16700Schasinglulu 			uint32_t cha_id:4;
302*91f16700Schasinglulu 			uint32_t err_id:4;
303*91f16700Schasinglulu 		} __packed ccb_status_src;
304*91f16700Schasinglulu 		struct {
305*91f16700Schasinglulu 			uint32_t ssrc:4;
306*91f16700Schasinglulu 			uint32_t jmp:1;
307*91f16700Schasinglulu 			uint32_t res:11;
308*91f16700Schasinglulu 			uint32_t desc_idx:8;
309*91f16700Schasinglulu 			uint32_t offset:8;
310*91f16700Schasinglulu 		} __packed jmp_halt_user_src;
311*91f16700Schasinglulu 		struct {
312*91f16700Schasinglulu 			uint32_t ssrc:4;
313*91f16700Schasinglulu 			uint32_t jmp:1;
314*91f16700Schasinglulu 			uint32_t res:11;
315*91f16700Schasinglulu 			uint32_t desc_idx:8;
316*91f16700Schasinglulu 			uint32_t desc_err:8;
317*91f16700Schasinglulu 		} __packed deco_src;
318*91f16700Schasinglulu 		struct {
319*91f16700Schasinglulu 			uint32_t ssrc:4;
320*91f16700Schasinglulu 			uint32_t res:17;
321*91f16700Schasinglulu 			uint32_t naddr:3;
322*91f16700Schasinglulu 			uint32_t desc_err:8;
323*91f16700Schasinglulu 		} __packed jr_src;
324*91f16700Schasinglulu 		struct {
325*91f16700Schasinglulu 			uint32_t ssrc:4;
326*91f16700Schasinglulu 			uint32_t jmp:1;
327*91f16700Schasinglulu 			uint32_t res:11;
328*91f16700Schasinglulu 			uint32_t desc_idx:8;
329*91f16700Schasinglulu 			uint32_t cond:8;
330*91f16700Schasinglulu 		} __packed jmp_halt_cond_src;
331*91f16700Schasinglulu 	} __packed error_desc;
332*91f16700Schasinglulu } __packed;
333*91f16700Schasinglulu 
334*91f16700Schasinglulu  /* FUNCTION PROTOTYPES */
335*91f16700Schasinglulu 
336*91f16700Schasinglulu /*
337*91f16700Schasinglulu  * @brief Initialize a job ring/channel in SEC device.
338*91f16700Schasinglulu  * Write configuration register/s to properly initialize a job ring.
339*91f16700Schasinglulu  *
340*91f16700Schasinglulu  * @param [in] job_ring     The job ring
341*91f16700Schasinglulu  *
342*91f16700Schasinglulu  * @retval 0 for success
343*91f16700Schasinglulu  * @retval other for error
344*91f16700Schasinglulu  */
345*91f16700Schasinglulu int hw_reset_job_ring(sec_job_ring_t *job_ring);
346*91f16700Schasinglulu 
347*91f16700Schasinglulu /*
348*91f16700Schasinglulu  * @brief Reset a job ring/channel in SEC device.
349*91f16700Schasinglulu  * Write configuration register/s to reset a job ring.
350*91f16700Schasinglulu  *
351*91f16700Schasinglulu  * @param [in] job_ring     The job ring
352*91f16700Schasinglulu  *
353*91f16700Schasinglulu  * @retval 0 for success
354*91f16700Schasinglulu  * @retval -1 in case job ring reset failed
355*91f16700Schasinglulu  */
356*91f16700Schasinglulu int hw_shutdown_job_ring(sec_job_ring_t *job_ring);
357*91f16700Schasinglulu 
358*91f16700Schasinglulu /*
359*91f16700Schasinglulu  * @brief Handle a job ring/channel error in SEC device.
360*91f16700Schasinglulu  * Identify the error type and clear error bits if required.
361*91f16700Schasinglulu  *
362*91f16700Schasinglulu  * @param [in]  job_ring    The job ring
363*91f16700Schasinglulu  * @param [in]  sec_error_code  error code as first read from SEC engine
364*91f16700Schasinglulu  */
365*91f16700Schasinglulu 
366*91f16700Schasinglulu void hw_handle_job_ring_error(sec_job_ring_t *job_ring,
367*91f16700Schasinglulu 			      uint32_t sec_error_code);
368*91f16700Schasinglulu /*
369*91f16700Schasinglulu  * @brief Handle a job ring error in the device.
370*91f16700Schasinglulu  * Identify the error type and printout a explanatory
371*91f16700Schasinglulu  * messages.
372*91f16700Schasinglulu  *
373*91f16700Schasinglulu  * @param [in]  job_ring    The job ring
374*91f16700Schasinglulu  *
375*91f16700Schasinglulu  */
376*91f16700Schasinglulu 
377*91f16700Schasinglulu int hw_job_ring_error(sec_job_ring_t *job_ring);
378*91f16700Schasinglulu 
379*91f16700Schasinglulu /* @brief Set interrupt coalescing parameters on the Job Ring.
380*91f16700Schasinglulu  * @param [in]  job_ring       The job ring
381*91f16700Schasinglulu  * @param [in]  irq_coalesing_timer
382*91f16700Schasinglulu  *                             Interrupt coalescing timer threshold.
383*91f16700Schasinglulu  *                     This value determines the maximum
384*91f16700Schasinglulu  *                     amount of time after processing a descriptor
385*91f16700Schasinglulu  *                     before raising an interrupt.
386*91f16700Schasinglulu  * @param [in]  irq_coalescing_count
387*91f16700Schasinglulu  *                             Interrupt coalescing count threshold.
388*91f16700Schasinglulu  *                     This value determines how many descriptors
389*91f16700Schasinglulu  *                     are completed before raising an interrupt.
390*91f16700Schasinglulu  */
391*91f16700Schasinglulu 
392*91f16700Schasinglulu int hw_job_ring_set_coalescing_param(sec_job_ring_t *job_ring,
393*91f16700Schasinglulu 				     uint16_t irq_coalescing_timer,
394*91f16700Schasinglulu 				     uint8_t irq_coalescing_count);
395*91f16700Schasinglulu 
396*91f16700Schasinglulu /* @brief Enable interrupt coalescing on a job ring
397*91f16700Schasinglulu  * @param [in]  job_ring       The job ring
398*91f16700Schasinglulu  */
399*91f16700Schasinglulu 
400*91f16700Schasinglulu int hw_job_ring_enable_coalescing(sec_job_ring_t *job_ring);
401*91f16700Schasinglulu 
402*91f16700Schasinglulu /*
403*91f16700Schasinglulu  * @brief Disable interrupt coalescing on a job ring
404*91f16700Schasinglulu  * @param [in]  job_ring       The job ring
405*91f16700Schasinglulu  */
406*91f16700Schasinglulu 
407*91f16700Schasinglulu int hw_job_ring_disable_coalescing(sec_job_ring_t *job_ring);
408*91f16700Schasinglulu 
409*91f16700Schasinglulu /*
410*91f16700Schasinglulu  * @brief Poll the HW for already processed jobs in the JR
411*91f16700Schasinglulu  * and notify the available jobs to UA.
412*91f16700Schasinglulu  *
413*91f16700Schasinglulu  * @param [in]  job_ring            The job ring to poll.
414*91f16700Schasinglulu  * @param [in]  limit               The maximum number of jobs to notify.
415*91f16700Schasinglulu  *                                  If set to negative value, all available
416*91f16700Schasinglulu  *                                  jobs are notified.
417*91f16700Schasinglulu  *
418*91f16700Schasinglulu  * @retval >=0 for No of jobs notified to UA.
419*91f16700Schasinglulu  * @retval -1 for error
420*91f16700Schasinglulu  */
421*91f16700Schasinglulu 
422*91f16700Schasinglulu int hw_poll_job_ring(struct sec_job_ring_t *job_ring, int32_t limit);
423*91f16700Schasinglulu 
424*91f16700Schasinglulu /* @brief Poll the HW for already processed jobs in the JR
425*91f16700Schasinglulu  * and silently discard the available jobs or notify them to UA
426*91f16700Schasinglulu  * with indicated error code.
427*91f16700Schasinglulu 
428*91f16700Schasinglulu  * @param [in,out]  job_ring        The job ring to poll.
429*91f16700Schasinglulu  * @param [in]  do_notify           Can be #TRUE or #FALSE.
430*91f16700Schasinglulu  *                                 Indicates if descriptors to be discarded
431*91f16700Schasinglulu  *                                  or notified to UA with given error_code.
432*91f16700Schasinglulu  * @param [in]  error_code          The detailed SEC error code.
433*91f16700Schasinglulu  * @param [out] notified_descs        Number of notified descriptors.
434*91f16700Schasinglulu  *                                 Can be NULL if do_notify is #FALSE
435*91f16700Schasinglulu  */
436*91f16700Schasinglulu void hw_flush_job_ring(struct sec_job_ring_t *job_ring,
437*91f16700Schasinglulu 		       uint32_t do_notify,
438*91f16700Schasinglulu 		       uint32_t error_code, uint32_t *notified_descs);
439*91f16700Schasinglulu 
440*91f16700Schasinglulu /*
441*91f16700Schasinglulu  * @brief Flush job rings of any processed descs.
442*91f16700Schasinglulu  * The processed descs are silently dropped,
443*91f16700Schasinglulu  *  WITHOUT being notified to UA.
444*91f16700Schasinglulu  */
445*91f16700Schasinglulu void flush_job_rings(void);
446*91f16700Schasinglulu 
447*91f16700Schasinglulu /*
448*91f16700Schasinglulu  * @brief Handle desc that generated error in SEC engine.
449*91f16700Schasinglulu  * Identify the exact type of error and handle the error.
450*91f16700Schasinglulu  * Depending on the error type, the job ring could be reset.
451*91f16700Schasinglulu  * All descs that are submitted for processing on this job ring
452*91f16700Schasinglulu  * are notified to User Application with error status and detailed error code.
453*91f16700Schasinglulu 
454*91f16700Schasinglulu  * @param [in]  job_ring            Job ring
455*91f16700Schasinglulu  * @param [in]  sec_error_code      Error code read from job ring's Channel
456*91f16700Schasinglulu  *                                 Status Register
457*91f16700Schasinglulu  * @param [out] notified_descs      Number of notified descs. Can be NULL if
458*91f16700Schasinglulu  *                                 do_notify is #FALSE
459*91f16700Schasinglulu  * @param [out] do_driver_shutdown  If set to #TRUE, then UA is returned code
460*91f16700Schasinglulu  *                                 #SEC_PROCESSING_ERROR
461*91f16700Schasinglulu  *                                  which is indication that UA must call
462*91f16700Schasinglulu  *                                  sec_release() after this.
463*91f16700Schasinglulu  */
464*91f16700Schasinglulu void sec_handle_desc_error(struct sec_job_ring_t *job_ring,
465*91f16700Schasinglulu 			   uint32_t sec_error_code,
466*91f16700Schasinglulu 			   uint32_t *notified_descs,
467*91f16700Schasinglulu 			   uint32_t *do_driver_shutdown);
468*91f16700Schasinglulu 
469*91f16700Schasinglulu /*
470*91f16700Schasinglulu  * @brief Release the software and hardware resources tied to a job ring.
471*91f16700Schasinglulu  * @param [in] job_ring The job ring
472*91f16700Schasinglulu  * @retval  0 for success
473*91f16700Schasinglulu  * @retval  -1 for error
474*91f16700Schasinglulu  */
475*91f16700Schasinglulu int shutdown_job_ring(struct sec_job_ring_t *job_ring);
476*91f16700Schasinglulu 
477*91f16700Schasinglulu /*
478*91f16700Schasinglulu  * @brief Enable irqs on associated job ring.
479*91f16700Schasinglulu  * @param [in] job_ring The job ring
480*91f16700Schasinglulu  * @retval  0 for success
481*91f16700Schasinglulu  * @retval  -1 for error
482*91f16700Schasinglulu  */
483*91f16700Schasinglulu int jr_enable_irqs(struct sec_job_ring_t *job_ring);
484*91f16700Schasinglulu 
485*91f16700Schasinglulu /*
486*91f16700Schasinglulu  * @brief Disable irqs on associated job ring.
487*91f16700Schasinglulu  * @param [in] job_ring The job ring
488*91f16700Schasinglulu  * @retval  0 for success
489*91f16700Schasinglulu  * @retval  -1 for error
490*91f16700Schasinglulu  */
491*91f16700Schasinglulu int jr_disable_irqs(struct sec_job_ring_t *job_ring);
492*91f16700Schasinglulu 
493*91f16700Schasinglulu  /*
494*91f16700Schasinglulu   * IRJA - Input Ring Jobs Added Register shows
495*91f16700Schasinglulu   * how many new jobs were added to the Input Ring.
496*91f16700Schasinglulu   */
497*91f16700Schasinglulu static inline void hw_enqueue_desc_on_job_ring(struct jobring_regs *regs,
498*91f16700Schasinglulu 					       int num)
499*91f16700Schasinglulu {
500*91f16700Schasinglulu 	sec_out32(&regs->irja, num);
501*91f16700Schasinglulu }
502*91f16700Schasinglulu 
503*91f16700Schasinglulu #endif /* _SEC_HW_SPECIFIC_H_ */
504