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