xref: /rk3399_ARM-atf/include/drivers/nxp/crypto/caam/sec_hw_specific.h (revision 5d772a448e78c74cce8c06800332704b5656cbc8)
1050a99a6SPankaj Gupta /*
2050a99a6SPankaj Gupta  * Copyright 2017-2021 NXP
3050a99a6SPankaj Gupta  *
4050a99a6SPankaj Gupta  * SPDX-License-Identifier: BSD-3-Clause
5050a99a6SPankaj Gupta  *
6050a99a6SPankaj Gupta  */
7050a99a6SPankaj Gupta 
8050a99a6SPankaj Gupta #ifndef _SEC_HW_SPECIFIC_H_
9050a99a6SPankaj Gupta #define _SEC_HW_SPECIFIC_H_
10050a99a6SPankaj Gupta 
11050a99a6SPankaj Gupta #include "caam.h"
12050a99a6SPankaj Gupta #include "sec_jr_driver.h"
13050a99a6SPankaj Gupta 
14050a99a6SPankaj Gupta  /* DEFINES AND MACROS */
15050a99a6SPankaj Gupta 
16050a99a6SPankaj Gupta /* Used to retry resetting a job ring in SEC hardware. */
17050a99a6SPankaj Gupta #define SEC_TIMEOUT 100000
18050a99a6SPankaj Gupta 
19050a99a6SPankaj Gupta /*
20050a99a6SPankaj Gupta  * Offset to the registers of a job ring.
21050a99a6SPankaj Gupta  *Is different for each job ring.
22050a99a6SPankaj Gupta  */
23050a99a6SPankaj Gupta #define CHAN_BASE(jr)   ((phys_addr_t)(jr)->register_base_addr)
24050a99a6SPankaj Gupta 
25050a99a6SPankaj Gupta #define unlikely(x)	 __builtin_expect(!!(x), 0)
26050a99a6SPankaj Gupta 
27050a99a6SPankaj Gupta #define SEC_JOB_RING_IS_FULL(pi, ci, ring_max_size, ring_threshold)    \
28050a99a6SPankaj Gupta 	((((pi) + 1 + ((ring_max_size) - (ring_threshold))) &	\
29050a99a6SPankaj Gupta 	  (ring_max_size - 1))  == ((ci)))
30050a99a6SPankaj Gupta 
31050a99a6SPankaj Gupta #define SEC_CIRCULAR_COUNTER(x, max)   (((x) + 1) & (max - 1))
32050a99a6SPankaj Gupta 
33050a99a6SPankaj Gupta  /* Struct representing various job ring registers */
34050a99a6SPankaj Gupta struct jobring_regs {
35050a99a6SPankaj Gupta #ifdef NXP_SEC_BE
36050a99a6SPankaj Gupta 	unsigned int irba_h;
37050a99a6SPankaj Gupta 	unsigned int irba_l;
38050a99a6SPankaj Gupta #else
39050a99a6SPankaj Gupta 	unsigned int irba_l;
40050a99a6SPankaj Gupta 	unsigned int irba_h;
41050a99a6SPankaj Gupta #endif
42050a99a6SPankaj Gupta 	unsigned int rsvd1;
43050a99a6SPankaj Gupta 	unsigned int irs;
44050a99a6SPankaj Gupta 	unsigned int rsvd2;
45050a99a6SPankaj Gupta 	unsigned int irsa;
46050a99a6SPankaj Gupta 	unsigned int rsvd3;
47050a99a6SPankaj Gupta 	unsigned int irja;
48050a99a6SPankaj Gupta #ifdef NXP_SEC_BE
49050a99a6SPankaj Gupta 	unsigned int orba_h;
50050a99a6SPankaj Gupta 	unsigned int orba_l;
51050a99a6SPankaj Gupta #else
52050a99a6SPankaj Gupta 	unsigned int orba_l;
53050a99a6SPankaj Gupta 	unsigned int orba_h;
54050a99a6SPankaj Gupta #endif
55050a99a6SPankaj Gupta 	unsigned int rsvd4;
56050a99a6SPankaj Gupta 	unsigned int ors;
57050a99a6SPankaj Gupta 	unsigned int rsvd5;
58050a99a6SPankaj Gupta 	unsigned int orjr;
59050a99a6SPankaj Gupta 	unsigned int rsvd6;
60050a99a6SPankaj Gupta 	unsigned int orsf;
61050a99a6SPankaj Gupta 	unsigned int rsvd7;
62050a99a6SPankaj Gupta 	unsigned int jrsta;
63050a99a6SPankaj Gupta 	unsigned int rsvd8;
64050a99a6SPankaj Gupta 	unsigned int jrint;
65050a99a6SPankaj Gupta 	unsigned int jrcfg0;
66050a99a6SPankaj Gupta 	unsigned int jrcfg1;
67050a99a6SPankaj Gupta 	unsigned int rsvd9;
68050a99a6SPankaj Gupta 	unsigned int irri;
69050a99a6SPankaj Gupta 	unsigned int rsvd10;
70050a99a6SPankaj Gupta 	unsigned int orwi;
71050a99a6SPankaj Gupta 	unsigned int rsvd11;
72050a99a6SPankaj Gupta 	unsigned int jrcr;
73050a99a6SPankaj Gupta };
74050a99a6SPankaj Gupta 
75050a99a6SPankaj Gupta  /* Offsets representing common SEC Registers */
76050a99a6SPankaj Gupta #define SEC_REG_MCFGR_OFFSET		0x0004
77050a99a6SPankaj Gupta #define SEC_REG_SCFGR_OFFSET		0x000C
78050a99a6SPankaj Gupta #define SEC_REG_JR0ICIDR_MS_OFFSET	0x0010
79050a99a6SPankaj Gupta #define SEC_REG_JR0ICIDR_LS_OFFSET	0x0014
80050a99a6SPankaj Gupta #define SEC_REG_JR1ICIDR_MS_OFFSET	0x0018
81050a99a6SPankaj Gupta #define SEC_REG_JR1ICIDR_LS_OFFSET	0x001C
82050a99a6SPankaj Gupta #define SEC_REG_JR2ICIDR_MS_OFFSET	0x0020
83050a99a6SPankaj Gupta #define SEC_REG_JR2ICIDR_LS_OFFSET	0x0024
84050a99a6SPankaj Gupta #define SEC_REG_JR3ICIDR_MS_OFFSET	0x0028
85050a99a6SPankaj Gupta #define SEC_REG_JR3ICIDR_LS_OFFSET	0x002C
86050a99a6SPankaj Gupta #define SEC_REG_JRSTARTR_OFFSET		0x005C
87050a99a6SPankaj Gupta #define SEC_REG_CTPR_MS_OFFSET		0x0FA8
88050a99a6SPankaj Gupta 
89050a99a6SPankaj Gupta  /* Offsets  representing various RNG registers */
90050a99a6SPankaj Gupta #define RNG_REG_RTMCTL_OFFSET		0x0600
91050a99a6SPankaj Gupta #define RNG_REG_RTSDCTL_OFFSET		0x0610
92050a99a6SPankaj Gupta #define RNG_REG_RTFRQMIN_OFFSET		0x0618
93050a99a6SPankaj Gupta #define RNG_REG_RTFRQMAX_OFFSET		0x061C
94050a99a6SPankaj Gupta #define RNG_REG_RDSTA_OFFSET		0x06C0
95050a99a6SPankaj Gupta #define ALG_AAI_SH_SHIFT		4
96050a99a6SPankaj Gupta 
97050a99a6SPankaj Gupta  /* SEC Registers Bitmasks */
98050a99a6SPankaj Gupta #define	MCFGR_PS_SHIFT			16
99050a99a6SPankaj Gupta #define	MCFGR_AWCACHE_SHIFT			 8
100050a99a6SPankaj Gupta #define	MCFGR_AWCACHE_MASK	(0xF << MCFGR_AWCACHE_SHIFT)
101050a99a6SPankaj Gupta #define	MCFGR_ARCACHE_SHIFT			12
102050a99a6SPankaj Gupta #define	MCFGR_ARCACHE_MASK	(0xF << MCFGR_ARCACHE_SHIFT)
103050a99a6SPankaj Gupta 
104050a99a6SPankaj Gupta #define SCFGR_RNGSH0		0x00000200
105050a99a6SPankaj Gupta #define	SCFGR_VIRT_EN		0x00008000
106050a99a6SPankaj Gupta 
107050a99a6SPankaj Gupta #define JRICID_MS_LICID		0x80000000
108050a99a6SPankaj Gupta #define JRICID_MS_LAMTD		0x00020000
109050a99a6SPankaj Gupta #define JRICID_MS_AMTDT		0x00010000
110050a99a6SPankaj Gupta #define JRICID_MS_TZ		0x00008000
111050a99a6SPankaj Gupta #define JRICID_LS_SDID_MASK	0x00000FFF
112050a99a6SPankaj Gupta #define JRICID_LS_NSEQID_MASK	0x0FFF0000
113050a99a6SPankaj Gupta #define JRICID_LS_NSEQID_SHIFT		16
114050a99a6SPankaj Gupta #define JRICID_LS_SEQID_MASK	0x00000FFF
115050a99a6SPankaj Gupta 
116050a99a6SPankaj Gupta #define JRSTARTR_STARTJR0	0x00000001
117050a99a6SPankaj Gupta #define JRSTARTR_STARTJR1	0x00000002
118050a99a6SPankaj Gupta #define JRSTARTR_STARTJR2	0x00000004
119050a99a6SPankaj Gupta #define JRSTARTR_STARTJR3	0x00000008
120050a99a6SPankaj Gupta 
121050a99a6SPankaj Gupta #define CTPR_VIRT_EN_POR	0x00000002
122050a99a6SPankaj Gupta #define CTPR_VIRT_EN_INC	0x00000001
123050a99a6SPankaj Gupta 
124050a99a6SPankaj Gupta  /* RNG RDSTA bitmask */
125050a99a6SPankaj Gupta #define RNG_STATE0_HANDLE_INSTANTIATED	0x00000001
126*cacde83bSVincent Jardin #define RNG_STATE1_HANDLE_INSTANTIATED	0x00000002
127050a99a6SPankaj Gupta #define RTMCTL_PRGM 0x00010000	/* 1 -> program mode, 0 -> run mode */
128050a99a6SPankaj Gupta  /* use von Neumann data in both entropy shifter and statistical checker */
129050a99a6SPankaj Gupta #define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_SC	 0
130050a99a6SPankaj Gupta  /* use raw data in both entropy shifter and statistical checker */
131050a99a6SPankaj Gupta #define RTMCTL_SAMP_MODE_RAW_ES_SC			 1
132050a99a6SPankaj Gupta  /* use von Neumann data in entropy shifter, raw data in statistical checker */
133050a99a6SPankaj Gupta #define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_RAW_SC 2
134050a99a6SPankaj Gupta  /* invalid combination */
135050a99a6SPankaj Gupta #define RTMCTL_SAMP_MODE_INVALID			   3
136050a99a6SPankaj Gupta #define RTSDCTL_ENT_DLY_MIN	3200
137050a99a6SPankaj Gupta #define RTSDCTL_ENT_DLY_MAX	12800
138050a99a6SPankaj Gupta #define RTSDCTL_ENT_DLY_SHIFT	16
139050a99a6SPankaj Gupta #define RTSDCTL_ENT_DLY_MASK	(U(0xffff) << RTSDCTL_ENT_DLY_SHIFT)
140050a99a6SPankaj Gupta #define RTFRQMAX_DISABLE	   (1 << 20)
141050a99a6SPankaj Gupta 
142050a99a6SPankaj Gupta  /* Constants for error handling on job ring */
143050a99a6SPankaj Gupta #define JR_REG_JRINT_ERR_TYPE_SHIFT	8
144050a99a6SPankaj Gupta #define JR_REG_JRINT_ERR_ORWI_SHIFT	16
145050a99a6SPankaj Gupta #define JR_REG_JRINIT_JRE_SHIFT			1
146050a99a6SPankaj Gupta 
147050a99a6SPankaj Gupta #define JRINT_JRE			(1 << JR_REG_JRINIT_JRE_SHIFT)
148050a99a6SPankaj Gupta #define JRINT_ERR_WRITE_STATUS		(1 << JR_REG_JRINT_ERR_TYPE_SHIFT)
149050a99a6SPankaj Gupta #define JRINT_ERR_BAD_INPUT_BASE	(3 << JR_REG_JRINT_ERR_TYPE_SHIFT)
150050a99a6SPankaj Gupta #define JRINT_ERR_BAD_OUTPUT_BASE	(4 << JR_REG_JRINT_ERR_TYPE_SHIFT)
151050a99a6SPankaj Gupta #define JRINT_ERR_WRITE_2_IRBA		(5 << JR_REG_JRINT_ERR_TYPE_SHIFT)
152050a99a6SPankaj Gupta #define JRINT_ERR_WRITE_2_ORBA		(6 << JR_REG_JRINT_ERR_TYPE_SHIFT)
153050a99a6SPankaj Gupta #define JRINT_ERR_RES_B4_HALT		(7 << JR_REG_JRINT_ERR_TYPE_SHIFT)
154050a99a6SPankaj Gupta #define JRINT_ERR_REM_TOO_MANY		(8 << JR_REG_JRINT_ERR_TYPE_SHIFT)
155050a99a6SPankaj Gupta #define JRINT_ERR_ADD_TOO_MANY		(9 << JR_REG_JRINT_ERR_TYPE_SHIFT)
156050a99a6SPankaj Gupta #define JRINT_ERR_HALT_MASK		0x0C
157050a99a6SPankaj Gupta #define JRINT_ERR_HALT_INPROGRESS	0x04
158050a99a6SPankaj Gupta #define JRINT_ERR_HALT_COMPLETE		0x08
159050a99a6SPankaj Gupta 
160050a99a6SPankaj Gupta #define JR_REG_JRCR_VAL_RESET		0x00000001
161050a99a6SPankaj Gupta 
162050a99a6SPankaj Gupta #define JR_REG_JRCFG_LO_ICTT_SHIFT	0x10
163050a99a6SPankaj Gupta #define JR_REG_JRCFG_LO_ICDCT_SHIFT	0x08
164050a99a6SPankaj Gupta #define JR_REG_JRCFG_LO_ICEN_EN		0x02
165050a99a6SPankaj Gupta #define JR_REG_JRCFG_LO_IMSK_EN		0x01
166050a99a6SPankaj Gupta 
167050a99a6SPankaj Gupta  /* Constants for Descriptor Processing errors */
168050a99a6SPankaj Gupta #define SEC_HW_ERR_SSRC_NO_SRC			0x00
169050a99a6SPankaj Gupta #define SEC_HW_ERR_SSRC_CCB_ERR			0x02
170050a99a6SPankaj Gupta #define SEC_HW_ERR_SSRC_JMP_HALT_U	0x03
171050a99a6SPankaj Gupta #define SEC_HW_ERR_SSRC_DECO		0x04
172050a99a6SPankaj Gupta #define SEC_HW_ERR_SSRC_JR		0x06
173050a99a6SPankaj Gupta #define SEC_HW_ERR_SSRC_JMP_HALT_COND   0x07
174050a99a6SPankaj Gupta 
175050a99a6SPankaj Gupta #define SEC_HW_ERR_DECO_HFN_THRESHOLD   0xF1
176050a99a6SPankaj Gupta #define SEC_HW_ERR_CCB_ICV_CHECK_FAIL   0x0A
177050a99a6SPankaj Gupta 
178050a99a6SPankaj Gupta  /* Macros for extracting error codes for the job ring */
179050a99a6SPankaj Gupta 
180050a99a6SPankaj Gupta #define JR_REG_JRINT_ERR_TYPE_EXTRACT(value)			\
181050a99a6SPankaj Gupta 				((value) & 0x00000F00)
182050a99a6SPankaj Gupta 
183050a99a6SPankaj Gupta #define JR_REG_JRINT_ERR_ORWI_EXTRACT(value)			\
184050a99a6SPankaj Gupta 				(((value) & 0x3FFF0000) >>	\
185050a99a6SPankaj Gupta 				 JR_REG_JRINT_ERR_ORWI_SHIFT)
186050a99a6SPankaj Gupta 
187050a99a6SPankaj Gupta #define JR_REG_JRINT_JRE_EXTRACT(value)				\
188050a99a6SPankaj Gupta 				((value) & JRINT_JRE)
189050a99a6SPankaj Gupta 
190050a99a6SPankaj Gupta  /* Macros for manipulating JR registers */
191fa7fdfabSJiafei Pan typedef struct {
192050a99a6SPankaj Gupta #ifdef NXP_SEC_BE
193050a99a6SPankaj Gupta 		uint32_t high;
194050a99a6SPankaj Gupta 		uint32_t low;
195050a99a6SPankaj Gupta #else
196050a99a6SPankaj Gupta 		uint32_t low;
197050a99a6SPankaj Gupta 		uint32_t high;
198050a99a6SPankaj Gupta #endif
199050a99a6SPankaj Gupta } ptr_addr_t;
200050a99a6SPankaj Gupta 
201050a99a6SPankaj Gupta #if defined(CONFIG_PHYS_64BIT)
202050a99a6SPankaj Gupta #define sec_read_addr(a)		sec_in64((a))
203050a99a6SPankaj Gupta #define sec_write_addr(a, v)	sec_out64((a), (v))
204050a99a6SPankaj Gupta #else
205050a99a6SPankaj Gupta #define sec_read_addr(a)		sec_in32((a))
206050a99a6SPankaj Gupta #define sec_write_addr(a, v)		sec_out32((a), (v))
207050a99a6SPankaj Gupta #endif
208050a99a6SPankaj Gupta 
209050a99a6SPankaj Gupta #define JR_REG(name, jr)	(CHAN_BASE(jr) + JR_REG_##name##_OFFSET)
210050a99a6SPankaj Gupta #define JR_REG_LO(name, jr)	(CHAN_BASE(jr) + JR_REG_##name##_OFFSET_LO)
211050a99a6SPankaj Gupta 
212050a99a6SPankaj Gupta #define GET_JR_REG(name, jr)	(sec_in32(JR_REG(name, (jr))))
213050a99a6SPankaj Gupta #define GET_JR_REG_LO(name, jr)	(sec_in32(JR_REG_LO(name, (jr))))
214050a99a6SPankaj Gupta 
215050a99a6SPankaj Gupta #define SET_JR_REG(name, jr, val)		\
216050a99a6SPankaj Gupta 		(sec_out32(JR_REG(name, (jr)), (val)))
217050a99a6SPankaj Gupta 
218050a99a6SPankaj Gupta #define SET_JR_REG_LO(name, jr, val)	\
219050a99a6SPankaj Gupta 		(sec_out32(JR_REG_LO(name, (jr)), (val)))
220050a99a6SPankaj Gupta 
221050a99a6SPankaj Gupta  /* STRUCTURES AND OTHER TYPEDEFS */
222050a99a6SPankaj Gupta  /*  Lists the possible states for a job ring. */
223050a99a6SPankaj Gupta typedef enum sec_job_ring_state_e {
224050a99a6SPankaj Gupta 	SEC_JOB_RING_STATE_STARTED,	/* Job ring is initialized */
2251b491eeaSElyes Haouas 	SEC_JOB_RING_STATE_RESET,	/* Job ring reset is in progress */
226050a99a6SPankaj Gupta } sec_job_ring_state_t;
227050a99a6SPankaj Gupta 
228050a99a6SPankaj Gupta struct sec_job_ring_t {
229050a99a6SPankaj Gupta 	/*
230050a99a6SPankaj Gupta 	 * Consumer index for job ring (jobs array).
231050a99a6SPankaj Gupta 	 * @note: cidx and pidx are accessed from
232050a99a6SPankaj Gupta 	 * different threads.
233050a99a6SPankaj Gupta 	 * Place the cidx and pidx inside the structure
234050a99a6SPankaj Gupta 	 *  so that they lay on different cachelines, to
235050a99a6SPankaj Gupta 	 * avoid false sharing between threads when the
236050a99a6SPankaj Gupta 	 * threads run on different cores!
237050a99a6SPankaj Gupta 	 */
238050a99a6SPankaj Gupta 	uint32_t cidx;
239050a99a6SPankaj Gupta 
240050a99a6SPankaj Gupta 	/* Producer index for job ring (jobs array) */
241050a99a6SPankaj Gupta 	uint32_t pidx;
242050a99a6SPankaj Gupta 
243050a99a6SPankaj Gupta 	/*  Ring of input descriptors. Size of array is power of 2 to allow
244050a99a6SPankaj Gupta 	 * fast update of producer/consumer indexes with  bitwise operations.
245050a99a6SPankaj Gupta 	 */
246050a99a6SPankaj Gupta 	phys_addr_t *input_ring;
247050a99a6SPankaj Gupta 
248050a99a6SPankaj Gupta 	/*  Ring of output descriptors. */
249050a99a6SPankaj Gupta 	struct sec_outring_entry *output_ring;
250050a99a6SPankaj Gupta 
251050a99a6SPankaj Gupta 	/* The file descriptor used for polling for interrupts notifications */
252050a99a6SPankaj Gupta 	uint32_t irq_fd;
253050a99a6SPankaj Gupta 
254050a99a6SPankaj Gupta 	/* Model used by SEC Driver to receive  notifications from SEC.
255050a99a6SPankaj Gupta 	 *  Can be either of the three:
256050a99a6SPankaj Gupta 	 * #SEC_NOTIFICATION_TYPE_IRQ or
257050a99a6SPankaj Gupta 	 * #SEC_NOTIFICATION_TYPE_POLL
258050a99a6SPankaj Gupta 	 */
259050a99a6SPankaj Gupta 	uint32_t jr_mode;
260050a99a6SPankaj Gupta 	/* Base address for SEC's register memory for this job ring. */
261050a99a6SPankaj Gupta 	void *register_base_addr;
262050a99a6SPankaj Gupta 	/* notifies if coelescing is enabled for the job ring */
263050a99a6SPankaj Gupta 	uint8_t coalescing_en;
264050a99a6SPankaj Gupta 	/* The state of this job ring */
265050a99a6SPankaj Gupta 	sec_job_ring_state_t jr_state;
266050a99a6SPankaj Gupta };
267050a99a6SPankaj Gupta 
268050a99a6SPankaj Gupta  /* Forward structure declaration */
269050a99a6SPankaj Gupta typedef struct sec_job_ring_t sec_job_ring_t;
270050a99a6SPankaj Gupta 
271050a99a6SPankaj Gupta struct sec_outring_entry {
272050a99a6SPankaj Gupta 	phys_addr_t desc;	/* Pointer to completed descriptor */
273050a99a6SPankaj Gupta 	uint32_t status;	/* Status for completed descriptor */
274050a99a6SPankaj Gupta } __packed;
275050a99a6SPankaj Gupta 
276050a99a6SPankaj Gupta  /* Lists the states possible for the SEC user space driver. */
277050a99a6SPankaj Gupta typedef enum sec_driver_state_e {
278050a99a6SPankaj Gupta 	SEC_DRIVER_STATE_IDLE,	/*< Driver not initialized */
279050a99a6SPankaj Gupta 	SEC_DRIVER_STATE_STARTED,	/*< Driver initialized and */
280050a99a6SPankaj Gupta 	SEC_DRIVER_STATE_RELEASE,	/*< Driver release is in progress */
281050a99a6SPankaj Gupta } sec_driver_state_t;
282050a99a6SPankaj Gupta 
283050a99a6SPankaj Gupta  /* Union describing the possible error codes that */
284050a99a6SPankaj Gupta  /* can be set in the descriptor status word */
285050a99a6SPankaj Gupta 
286050a99a6SPankaj Gupta union hw_error_code {
287050a99a6SPankaj Gupta 	uint32_t error;
288050a99a6SPankaj Gupta 	union {
289050a99a6SPankaj Gupta 		struct {
290050a99a6SPankaj Gupta 			uint32_t ssrc:4;
291050a99a6SPankaj Gupta 			uint32_t ssed_val:28;
292050a99a6SPankaj Gupta 		} __packed value;
293050a99a6SPankaj Gupta 		struct {
294050a99a6SPankaj Gupta 			uint32_t ssrc:4;
295050a99a6SPankaj Gupta 			uint32_t res:28;
296050a99a6SPankaj Gupta 		} __packed no_status_src;
297050a99a6SPankaj Gupta 		struct {
298050a99a6SPankaj Gupta 			uint32_t ssrc:4;
299050a99a6SPankaj Gupta 			uint32_t jmp:1;
300050a99a6SPankaj Gupta 			uint32_t res:11;
301050a99a6SPankaj Gupta 			uint32_t desc_idx:8;
302050a99a6SPankaj Gupta 			uint32_t cha_id:4;
303050a99a6SPankaj Gupta 			uint32_t err_id:4;
304050a99a6SPankaj Gupta 		} __packed ccb_status_src;
305050a99a6SPankaj Gupta 		struct {
306050a99a6SPankaj Gupta 			uint32_t ssrc:4;
307050a99a6SPankaj Gupta 			uint32_t jmp:1;
308050a99a6SPankaj Gupta 			uint32_t res:11;
309050a99a6SPankaj Gupta 			uint32_t desc_idx:8;
310050a99a6SPankaj Gupta 			uint32_t offset:8;
311050a99a6SPankaj Gupta 		} __packed jmp_halt_user_src;
312050a99a6SPankaj Gupta 		struct {
313050a99a6SPankaj Gupta 			uint32_t ssrc:4;
314050a99a6SPankaj Gupta 			uint32_t jmp:1;
315050a99a6SPankaj Gupta 			uint32_t res:11;
316050a99a6SPankaj Gupta 			uint32_t desc_idx:8;
317050a99a6SPankaj Gupta 			uint32_t desc_err:8;
318050a99a6SPankaj Gupta 		} __packed deco_src;
319050a99a6SPankaj Gupta 		struct {
320050a99a6SPankaj Gupta 			uint32_t ssrc:4;
321050a99a6SPankaj Gupta 			uint32_t res:17;
322050a99a6SPankaj Gupta 			uint32_t naddr:3;
323050a99a6SPankaj Gupta 			uint32_t desc_err:8;
324050a99a6SPankaj Gupta 		} __packed jr_src;
325050a99a6SPankaj Gupta 		struct {
326050a99a6SPankaj Gupta 			uint32_t ssrc:4;
327050a99a6SPankaj Gupta 			uint32_t jmp:1;
328050a99a6SPankaj Gupta 			uint32_t res:11;
329050a99a6SPankaj Gupta 			uint32_t desc_idx:8;
330050a99a6SPankaj Gupta 			uint32_t cond:8;
331050a99a6SPankaj Gupta 		} __packed jmp_halt_cond_src;
332050a99a6SPankaj Gupta 	} __packed error_desc;
333050a99a6SPankaj Gupta } __packed;
334050a99a6SPankaj Gupta 
335050a99a6SPankaj Gupta  /* FUNCTION PROTOTYPES */
336050a99a6SPankaj Gupta 
337050a99a6SPankaj Gupta /*
338050a99a6SPankaj Gupta  * @brief Initialize a job ring/channel in SEC device.
339050a99a6SPankaj Gupta  * Write configuration register/s to properly initialize a job ring.
340050a99a6SPankaj Gupta  *
341050a99a6SPankaj Gupta  * @param [in] job_ring     The job ring
342050a99a6SPankaj Gupta  *
343050a99a6SPankaj Gupta  * @retval 0 for success
344050a99a6SPankaj Gupta  * @retval other for error
345050a99a6SPankaj Gupta  */
346050a99a6SPankaj Gupta int hw_reset_job_ring(sec_job_ring_t *job_ring);
347050a99a6SPankaj Gupta 
348050a99a6SPankaj Gupta /*
349050a99a6SPankaj Gupta  * @brief Reset a job ring/channel in SEC device.
350050a99a6SPankaj Gupta  * Write configuration register/s to reset a job ring.
351050a99a6SPankaj Gupta  *
352050a99a6SPankaj Gupta  * @param [in] job_ring     The job ring
353050a99a6SPankaj Gupta  *
354050a99a6SPankaj Gupta  * @retval 0 for success
355050a99a6SPankaj Gupta  * @retval -1 in case job ring reset failed
356050a99a6SPankaj Gupta  */
357050a99a6SPankaj Gupta int hw_shutdown_job_ring(sec_job_ring_t *job_ring);
358050a99a6SPankaj Gupta 
359050a99a6SPankaj Gupta /*
360050a99a6SPankaj Gupta  * @brief Handle a job ring/channel error in SEC device.
361050a99a6SPankaj Gupta  * Identify the error type and clear error bits if required.
362050a99a6SPankaj Gupta  *
363050a99a6SPankaj Gupta  * @param [in]  job_ring    The job ring
364050a99a6SPankaj Gupta  * @param [in]  sec_error_code  error code as first read from SEC engine
365050a99a6SPankaj Gupta  */
366050a99a6SPankaj Gupta 
367050a99a6SPankaj Gupta void hw_handle_job_ring_error(sec_job_ring_t *job_ring,
368050a99a6SPankaj Gupta 			      uint32_t sec_error_code);
369050a99a6SPankaj Gupta /*
370050a99a6SPankaj Gupta  * @brief Handle a job ring error in the device.
371050a99a6SPankaj Gupta  * Identify the error type and printout a explanatory
372050a99a6SPankaj Gupta  * messages.
373050a99a6SPankaj Gupta  *
374050a99a6SPankaj Gupta  * @param [in]  job_ring    The job ring
375050a99a6SPankaj Gupta  *
376050a99a6SPankaj Gupta  */
377050a99a6SPankaj Gupta 
378050a99a6SPankaj Gupta int hw_job_ring_error(sec_job_ring_t *job_ring);
379050a99a6SPankaj Gupta 
380050a99a6SPankaj Gupta /* @brief Set interrupt coalescing parameters on the Job Ring.
381050a99a6SPankaj Gupta  * @param [in]  job_ring       The job ring
382050a99a6SPankaj Gupta  * @param [in]  irq_coalesing_timer
383050a99a6SPankaj Gupta  *                             Interrupt coalescing timer threshold.
384050a99a6SPankaj Gupta  *                     This value determines the maximum
385050a99a6SPankaj Gupta  *                     amount of time after processing a descriptor
386050a99a6SPankaj Gupta  *                     before raising an interrupt.
387050a99a6SPankaj Gupta  * @param [in]  irq_coalescing_count
388050a99a6SPankaj Gupta  *                             Interrupt coalescing count threshold.
389050a99a6SPankaj Gupta  *                     This value determines how many descriptors
390050a99a6SPankaj Gupta  *                     are completed before raising an interrupt.
391050a99a6SPankaj Gupta  */
392050a99a6SPankaj Gupta 
393050a99a6SPankaj Gupta int hw_job_ring_set_coalescing_param(sec_job_ring_t *job_ring,
394050a99a6SPankaj Gupta 				     uint16_t irq_coalescing_timer,
395050a99a6SPankaj Gupta 				     uint8_t irq_coalescing_count);
396050a99a6SPankaj Gupta 
397050a99a6SPankaj Gupta /* @brief Enable interrupt coalescing on a job ring
398050a99a6SPankaj Gupta  * @param [in]  job_ring       The job ring
399050a99a6SPankaj Gupta  */
400050a99a6SPankaj Gupta 
401050a99a6SPankaj Gupta int hw_job_ring_enable_coalescing(sec_job_ring_t *job_ring);
402050a99a6SPankaj Gupta 
403050a99a6SPankaj Gupta /*
404050a99a6SPankaj Gupta  * @brief Disable interrupt coalescing on a job ring
405050a99a6SPankaj Gupta  * @param [in]  job_ring       The job ring
406050a99a6SPankaj Gupta  */
407050a99a6SPankaj Gupta 
408050a99a6SPankaj Gupta int hw_job_ring_disable_coalescing(sec_job_ring_t *job_ring);
409050a99a6SPankaj Gupta 
410050a99a6SPankaj Gupta /*
411050a99a6SPankaj Gupta  * @brief Poll the HW for already processed jobs in the JR
412050a99a6SPankaj Gupta  * and notify the available jobs to UA.
413050a99a6SPankaj Gupta  *
414050a99a6SPankaj Gupta  * @param [in]  job_ring            The job ring to poll.
415050a99a6SPankaj Gupta  * @param [in]  limit               The maximum number of jobs to notify.
416050a99a6SPankaj Gupta  *                                  If set to negative value, all available
417050a99a6SPankaj Gupta  *                                  jobs are notified.
418050a99a6SPankaj Gupta  *
419050a99a6SPankaj Gupta  * @retval >=0 for No of jobs notified to UA.
420050a99a6SPankaj Gupta  * @retval -1 for error
421050a99a6SPankaj Gupta  */
422050a99a6SPankaj Gupta 
423050a99a6SPankaj Gupta int hw_poll_job_ring(struct sec_job_ring_t *job_ring, int32_t limit);
424050a99a6SPankaj Gupta 
425050a99a6SPankaj Gupta /* @brief Poll the HW for already processed jobs in the JR
426050a99a6SPankaj Gupta  * and silently discard the available jobs or notify them to UA
427050a99a6SPankaj Gupta  * with indicated error code.
428050a99a6SPankaj Gupta 
429050a99a6SPankaj Gupta  * @param [in,out]  job_ring        The job ring to poll.
430050a99a6SPankaj Gupta  * @param [in]  do_notify           Can be #TRUE or #FALSE.
431050a99a6SPankaj Gupta  *                                 Indicates if descriptors to be discarded
432050a99a6SPankaj Gupta  *                                  or notified to UA with given error_code.
433050a99a6SPankaj Gupta  * @param [in]  error_code          The detailed SEC error code.
434050a99a6SPankaj Gupta  * @param [out] notified_descs        Number of notified descriptors.
435050a99a6SPankaj Gupta  *                                 Can be NULL if do_notify is #FALSE
436050a99a6SPankaj Gupta  */
437050a99a6SPankaj Gupta void hw_flush_job_ring(struct sec_job_ring_t *job_ring,
438050a99a6SPankaj Gupta 		       uint32_t do_notify,
439050a99a6SPankaj Gupta 		       uint32_t error_code, uint32_t *notified_descs);
440050a99a6SPankaj Gupta 
441050a99a6SPankaj Gupta /*
442050a99a6SPankaj Gupta  * @brief Flush job rings of any processed descs.
443050a99a6SPankaj Gupta  * The processed descs are silently dropped,
444050a99a6SPankaj Gupta  *  WITHOUT being notified to UA.
445050a99a6SPankaj Gupta  */
446050a99a6SPankaj Gupta void flush_job_rings(void);
447050a99a6SPankaj Gupta 
448050a99a6SPankaj Gupta /*
449050a99a6SPankaj Gupta  * @brief Handle desc that generated error in SEC engine.
450050a99a6SPankaj Gupta  * Identify the exact type of error and handle the error.
451050a99a6SPankaj Gupta  * Depending on the error type, the job ring could be reset.
452050a99a6SPankaj Gupta  * All descs that are submitted for processing on this job ring
453050a99a6SPankaj Gupta  * are notified to User Application with error status and detailed error code.
454050a99a6SPankaj Gupta 
455050a99a6SPankaj Gupta  * @param [in]  job_ring            Job ring
456050a99a6SPankaj Gupta  * @param [in]  sec_error_code      Error code read from job ring's Channel
457050a99a6SPankaj Gupta  *                                 Status Register
458050a99a6SPankaj Gupta  * @param [out] notified_descs      Number of notified descs. Can be NULL if
459050a99a6SPankaj Gupta  *                                 do_notify is #FALSE
460050a99a6SPankaj Gupta  * @param [out] do_driver_shutdown  If set to #TRUE, then UA is returned code
461050a99a6SPankaj Gupta  *                                 #SEC_PROCESSING_ERROR
462050a99a6SPankaj Gupta  *                                  which is indication that UA must call
463050a99a6SPankaj Gupta  *                                  sec_release() after this.
464050a99a6SPankaj Gupta  */
465050a99a6SPankaj Gupta void sec_handle_desc_error(struct sec_job_ring_t *job_ring,
466050a99a6SPankaj Gupta 			   uint32_t sec_error_code,
467050a99a6SPankaj Gupta 			   uint32_t *notified_descs,
468050a99a6SPankaj Gupta 			   uint32_t *do_driver_shutdown);
469050a99a6SPankaj Gupta 
470050a99a6SPankaj Gupta /*
471050a99a6SPankaj Gupta  * @brief Release the software and hardware resources tied to a job ring.
472050a99a6SPankaj Gupta  * @param [in] job_ring The job ring
473050a99a6SPankaj Gupta  * @retval  0 for success
474050a99a6SPankaj Gupta  * @retval  -1 for error
475050a99a6SPankaj Gupta  */
476050a99a6SPankaj Gupta int shutdown_job_ring(struct sec_job_ring_t *job_ring);
477050a99a6SPankaj Gupta 
478050a99a6SPankaj Gupta /*
479050a99a6SPankaj Gupta  * @brief Enable irqs on associated job ring.
480050a99a6SPankaj Gupta  * @param [in] job_ring The job ring
481050a99a6SPankaj Gupta  * @retval  0 for success
482050a99a6SPankaj Gupta  * @retval  -1 for error
483050a99a6SPankaj Gupta  */
484050a99a6SPankaj Gupta int jr_enable_irqs(struct sec_job_ring_t *job_ring);
485050a99a6SPankaj Gupta 
486050a99a6SPankaj Gupta /*
487050a99a6SPankaj Gupta  * @brief Disable irqs on associated job ring.
488050a99a6SPankaj Gupta  * @param [in] job_ring The job ring
489050a99a6SPankaj Gupta  * @retval  0 for success
490050a99a6SPankaj Gupta  * @retval  -1 for error
491050a99a6SPankaj Gupta  */
492050a99a6SPankaj Gupta int jr_disable_irqs(struct sec_job_ring_t *job_ring);
493050a99a6SPankaj Gupta 
494050a99a6SPankaj Gupta  /*
495050a99a6SPankaj Gupta   * IRJA - Input Ring Jobs Added Register shows
496050a99a6SPankaj Gupta   * how many new jobs were added to the Input Ring.
497050a99a6SPankaj Gupta   */
hw_enqueue_desc_on_job_ring(struct jobring_regs * regs,int num)498050a99a6SPankaj Gupta static inline void hw_enqueue_desc_on_job_ring(struct jobring_regs *regs,
499050a99a6SPankaj Gupta 					       int num)
500050a99a6SPankaj Gupta {
501050a99a6SPankaj Gupta 	sec_out32(&regs->irja, num);
502050a99a6SPankaj Gupta }
503050a99a6SPankaj Gupta 
504050a99a6SPankaj Gupta #endif /* _SEC_HW_SPECIFIC_H_ */
505