aboutsummaryrefslogtreecommitdiff
path: root/drivers/nxp/crypto/caam/include/sec_hw_specific.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nxp/crypto/caam/include/sec_hw_specific.h')
-rw-r--r--drivers/nxp/crypto/caam/include/sec_hw_specific.h506
1 files changed, 0 insertions, 506 deletions
diff --git a/drivers/nxp/crypto/caam/include/sec_hw_specific.h b/drivers/nxp/crypto/caam/include/sec_hw_specific.h
deleted file mode 100644
index a82a1a019b..0000000000
--- a/drivers/nxp/crypto/caam/include/sec_hw_specific.h
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright 2017-2020 NXP
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef _SEC_HW_SPECIFIC_H_
-#define _SEC_HW_SPECIFIC_H_
-
-#include "caam.h"
-#include "sec_jr_driver.h"
-
- /* DEFINES AND MACROS */
-
-/* Used to retry resetting a job ring in SEC hardware. */
-#define SEC_TIMEOUT 100000
-
-/*
- * Offset to the registers of a job ring.
- *Is different for each job ring.
- */
-#define CHAN_BASE(jr) ((phys_addr_t)(jr)->register_base_addr)
-
-#define unlikely(x) __builtin_expect(!!(x), 0)
-
-#define SEC_JOB_RING_IS_FULL(pi, ci, ring_max_size, ring_threshold) \
- ((((pi) + 1 + ((ring_max_size) - (ring_threshold))) & \
- (ring_max_size - 1)) == ((ci)))
-
-#define SEC_CIRCULAR_COUNTER(x, max) (((x) + 1) & (max - 1))
-
- /* Struct representing various job ring registers */
-struct jobring_regs {
-#ifdef NXP_SEC_BE
- unsigned int irba_h;
- unsigned int irba_l;
-#else
- unsigned int irba_l;
- unsigned int irba_h;
-#endif
- unsigned int rsvd1;
- unsigned int irs;
- unsigned int rsvd2;
- unsigned int irsa;
- unsigned int rsvd3;
- unsigned int irja;
-#ifdef NXP_SEC_BE
- unsigned int orba_h;
- unsigned int orba_l;
-#else
- unsigned int orba_l;
- unsigned int orba_h;
-#endif
- unsigned int rsvd4;
- unsigned int ors;
- unsigned int rsvd5;
- unsigned int orjr;
- unsigned int rsvd6;
- unsigned int orsf;
- unsigned int rsvd7;
- unsigned int jrsta;
- unsigned int rsvd8;
- unsigned int jrint;
- unsigned int jrcfg0;
- unsigned int jrcfg1;
- unsigned int rsvd9;
- unsigned int irri;
- unsigned int rsvd10;
- unsigned int orwi;
- unsigned int rsvd11;
- unsigned int jrcr;
-};
-
- /* Offsets representing common SEC Registers */
-#define SEC_REG_MCFGR_OFFSET 0x0004
-#define SEC_REG_SCFGR_OFFSET 0x000C
-#define SEC_REG_JR0ICIDR_MS_OFFSET 0x0010
-#define SEC_REG_JR0ICIDR_LS_OFFSET 0x0014
-#define SEC_REG_JR1ICIDR_MS_OFFSET 0x0018
-#define SEC_REG_JR1ICIDR_LS_OFFSET 0x001C
-#define SEC_REG_JR2ICIDR_MS_OFFSET 0x0020
-#define SEC_REG_JR2ICIDR_LS_OFFSET 0x0024
-#define SEC_REG_JR3ICIDR_MS_OFFSET 0x0028
-#define SEC_REG_JR3ICIDR_LS_OFFSET 0x002C
-#define SEC_REG_JRSTARTR_OFFSET 0x005C
-#define SEC_REG_CTPR_MS_OFFSET 0x0FA8
-
- /* Offsets representing various RNG registers */
-#define RNG_REG_RTMCTL_OFFSET 0x0600
-#define RNG_REG_RTSDCTL_OFFSET 0x0610
-#define RNG_REG_RTFRQMIN_OFFSET 0x0618
-#define RNG_REG_RTFRQMAX_OFFSET 0x061C
-#define RNG_REG_RDSTA_OFFSET 0x06C0
-#define ALG_AAI_SH_SHIFT 4
-
- /* SEC Registers Bitmasks */
-#define MCFGR_PS_SHIFT 16
-#define MCFGR_AWCACHE_SHIFT 8
-#define MCFGR_AWCACHE_MASK (0xF << MCFGR_AWCACHE_SHIFT)
-#define MCFGR_ARCACHE_SHIFT 12
-#define MCFGR_ARCACHE_MASK (0xF << MCFGR_ARCACHE_SHIFT)
-
-#define SCFGR_RNGSH0 0x00000200
-#define SCFGR_VIRT_EN 0x00008000
-
-#define JRICID_MS_LICID 0x80000000
-#define JRICID_MS_LAMTD 0x00020000
-#define JRICID_MS_AMTDT 0x00010000
-#define JRICID_MS_TZ 0x00008000
-#define JRICID_LS_SDID_MASK 0x00000FFF
-#define JRICID_LS_NSEQID_MASK 0x0FFF0000
-#define JRICID_LS_NSEQID_SHIFT 16
-#define JRICID_LS_SEQID_MASK 0x00000FFF
-
-#define JRSTARTR_STARTJR0 0x00000001
-#define JRSTARTR_STARTJR1 0x00000002
-#define JRSTARTR_STARTJR2 0x00000004
-#define JRSTARTR_STARTJR3 0x00000008
-
-#define CTPR_VIRT_EN_POR 0x00000002
-#define CTPR_VIRT_EN_INC 0x00000001
-
- /* RNG RDSTA bitmask */
-#define RNG_STATE0_HANDLE_INSTANTIATED 0x00000001
-#define RTMCTL_PRGM 0x00010000 /* 1 -> program mode, 0 -> run mode */
- /* use von Neumann data in both entropy shifter and statistical checker */
-#define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_SC 0
- /* use raw data in both entropy shifter and statistical checker */
-#define RTMCTL_SAMP_MODE_RAW_ES_SC 1
- /* use von Neumann data in entropy shifter, raw data in statistical checker */
-#define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_RAW_SC 2
- /* invalid combination */
-#define RTMCTL_SAMP_MODE_INVALID 3
-#define RTSDCTL_ENT_DLY_MIN 3200
-#define RTSDCTL_ENT_DLY_MAX 12800
-#define RTSDCTL_ENT_DLY_SHIFT 16
-#define RTSDCTL_ENT_DLY_MASK (U(0xffff) << RTSDCTL_ENT_DLY_SHIFT)
-#define RTFRQMAX_DISABLE (1 << 20)
-
- /* Constants for error handling on job ring */
-#define JR_REG_JRINT_ERR_TYPE_SHIFT 8
-#define JR_REG_JRINT_ERR_ORWI_SHIFT 16
-#define JR_REG_JRINIT_JRE_SHIFT 1
-
-#define JRINT_JRE (1 << JR_REG_JRINIT_JRE_SHIFT)
-#define JRINT_ERR_WRITE_STATUS (1 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_BAD_INPUT_BASE (3 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_BAD_OUTPUT_BASE (4 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_WRITE_2_IRBA (5 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_WRITE_2_ORBA (6 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_RES_B4_HALT (7 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_REM_TOO_MANY (8 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_ADD_TOO_MANY (9 << JR_REG_JRINT_ERR_TYPE_SHIFT)
-#define JRINT_ERR_HALT_MASK 0x0C
-#define JRINT_ERR_HALT_INPROGRESS 0x04
-#define JRINT_ERR_HALT_COMPLETE 0x08
-
-#define JR_REG_JRCR_VAL_RESET 0x00000001
-
-#define JR_REG_JRCFG_LO_ICTT_SHIFT 0x10
-#define JR_REG_JRCFG_LO_ICDCT_SHIFT 0x08
-#define JR_REG_JRCFG_LO_ICEN_EN 0x02
-#define JR_REG_JRCFG_LO_IMSK_EN 0x01
-
- /* Constants for Descriptor Processing errors */
-#define SEC_HW_ERR_SSRC_NO_SRC 0x00
-#define SEC_HW_ERR_SSRC_CCB_ERR 0x02
-#define SEC_HW_ERR_SSRC_JMP_HALT_U 0x03
-#define SEC_HW_ERR_SSRC_DECO 0x04
-#define SEC_HW_ERR_SSRC_JR 0x06
-#define SEC_HW_ERR_SSRC_JMP_HALT_COND 0x07
-
-#define SEC_HW_ERR_DECO_HFN_THRESHOLD 0xF1
-#define SEC_HW_ERR_CCB_ICV_CHECK_FAIL 0x0A
-
- /* Macros for extracting error codes for the job ring */
-
-#define JR_REG_JRINT_ERR_TYPE_EXTRACT(value) \
- ((value) & 0x00000F00)
-
-#define JR_REG_JRINT_ERR_ORWI_EXTRACT(value) \
- (((value) & 0x3FFF0000) >> \
- JR_REG_JRINT_ERR_ORWI_SHIFT)
-
-#define JR_REG_JRINT_JRE_EXTRACT(value) \
- ((value) & JRINT_JRE)
-
- /* Macros for manipulating JR registers */
-typedef union {
- uint64_t m_whole;
- struct {
-#ifdef NXP_SEC_BE
- uint32_t high;
- uint32_t low;
-#else
- uint32_t low;
- uint32_t high;
-#endif
- } m_halves;
-} ptr_addr_t;
-
-#if defined(CONFIG_PHYS_64BIT)
-#define sec_read_addr(a) sec_in64((a))
-#define sec_write_addr(a, v) sec_out64((a), (v))
-#else
-#define sec_read_addr(a) sec_in32((a))
-#define sec_write_addr(a, v) sec_out32((a), (v))
-#endif
-
-#define JR_REG(name, jr) (CHAN_BASE(jr) + JR_REG_##name##_OFFSET)
-#define JR_REG_LO(name, jr) (CHAN_BASE(jr) + JR_REG_##name##_OFFSET_LO)
-
-#define GET_JR_REG(name, jr) (sec_in32(JR_REG(name, (jr))))
-#define GET_JR_REG_LO(name, jr) (sec_in32(JR_REG_LO(name, (jr))))
-
-#define SET_JR_REG(name, jr, val) \
- (sec_out32(JR_REG(name, (jr)), (val)))
-
-#define SET_JR_REG_LO(name, jr, val) \
- (sec_out32(JR_REG_LO(name, (jr)), (val)))
-
- /* STRUCTURES AND OTHER TYPEDEFS */
- /* Lists the possible states for a job ring. */
-typedef enum sec_job_ring_state_e {
- SEC_JOB_RING_STATE_STARTED, /* Job ring is initialized */
- SEC_JOB_RING_STATE_RESET, /* Job ring reset is in progres */
-} sec_job_ring_state_t;
-
-struct sec_job_ring_t {
- /*
- * Consumer index for job ring (jobs array).
- * @note: cidx and pidx are accessed from
- * different threads.
- * Place the cidx and pidx inside the structure
- * so that they lay on different cachelines, to
- * avoid false sharing between threads when the
- * threads run on different cores!
- */
- uint32_t cidx;
-
- /* Producer index for job ring (jobs array) */
- uint32_t pidx;
-
- /* Ring of input descriptors. Size of array is power of 2 to allow
- * fast update of producer/consumer indexes with bitwise operations.
- */
- phys_addr_t *input_ring;
-
- /* Ring of output descriptors. */
- struct sec_outring_entry *output_ring;
-
- /* The file descriptor used for polling for interrupts notifications */
- uint32_t irq_fd;
-
- /* Model used by SEC Driver to receive notifications from SEC.
- * Can be either of the three:
- * #SEC_NOTIFICATION_TYPE_IRQ or
- * #SEC_NOTIFICATION_TYPE_POLL
- */
- uint32_t jr_mode;
- /* Base address for SEC's register memory for this job ring. */
- void *register_base_addr;
- /* notifies if coelescing is enabled for the job ring */
- uint8_t coalescing_en;
- /* The state of this job ring */
- sec_job_ring_state_t jr_state;
-};
-
- /* Forward structure declaration */
-typedef struct sec_job_ring_t sec_job_ring_t;
-
-struct sec_outring_entry {
- phys_addr_t desc; /* Pointer to completed descriptor */
- uint32_t status; /* Status for completed descriptor */
-} __packed;
-
- /* Lists the states possible for the SEC user space driver. */
-typedef enum sec_driver_state_e {
- SEC_DRIVER_STATE_IDLE, /*< Driver not initialized */
- SEC_DRIVER_STATE_STARTED, /*< Driver initialized and */
- SEC_DRIVER_STATE_RELEASE, /*< Driver release is in progress */
-} sec_driver_state_t;
-
- /* Union describing the possible error codes that */
- /* can be set in the descriptor status word */
-
-union hw_error_code {
- uint32_t error;
- union {
- struct {
- uint32_t ssrc:4;
- uint32_t ssed_val:28;
- } __packed value;
- struct {
- uint32_t ssrc:4;
- uint32_t res:28;
- } __packed no_status_src;
- struct {
- uint32_t ssrc:4;
- uint32_t jmp:1;
- uint32_t res:11;
- uint32_t desc_idx:8;
- uint32_t cha_id:4;
- uint32_t err_id:4;
- } __packed ccb_status_src;
- struct {
- uint32_t ssrc:4;
- uint32_t jmp:1;
- uint32_t res:11;
- uint32_t desc_idx:8;
- uint32_t offset:8;
- } __packed jmp_halt_user_src;
- struct {
- uint32_t ssrc:4;
- uint32_t jmp:1;
- uint32_t res:11;
- uint32_t desc_idx:8;
- uint32_t desc_err:8;
- } __packed deco_src;
- struct {
- uint32_t ssrc:4;
- uint32_t res:17;
- uint32_t naddr:3;
- uint32_t desc_err:8;
- } __packed jr_src;
- struct {
- uint32_t ssrc:4;
- uint32_t jmp:1;
- uint32_t res:11;
- uint32_t desc_idx:8;
- uint32_t cond:8;
- } __packed jmp_halt_cond_src;
- } __packed error_desc;
-} __packed;
-
- /* FUNCTION PROTOTYPES */
-
-/*
- * @brief Initialize a job ring/channel in SEC device.
- * Write configuration register/s to properly initialize a job ring.
- *
- * @param [in] job_ring The job ring
- *
- * @retval 0 for success
- * @retval other for error
- */
-int hw_reset_job_ring(sec_job_ring_t *job_ring);
-
-/*
- * @brief Reset a job ring/channel in SEC device.
- * Write configuration register/s to reset a job ring.
- *
- * @param [in] job_ring The job ring
- *
- * @retval 0 for success
- * @retval -1 in case job ring reset failed
- */
-int hw_shutdown_job_ring(sec_job_ring_t *job_ring);
-
-/*
- * @brief Handle a job ring/channel error in SEC device.
- * Identify the error type and clear error bits if required.
- *
- * @param [in] job_ring The job ring
- * @param [in] sec_error_code error code as first read from SEC engine
- */
-
-void hw_handle_job_ring_error(sec_job_ring_t *job_ring,
- uint32_t sec_error_code);
-/*
- * @brief Handle a job ring error in the device.
- * Identify the error type and printout a explanatory
- * messages.
- *
- * @param [in] job_ring The job ring
- *
- */
-
-int hw_job_ring_error(sec_job_ring_t *job_ring);
-
-/* @brief Set interrupt coalescing parameters on the Job Ring.
- * @param [in] job_ring The job ring
- * @param [in] irq_coalesing_timer
- * Interrupt coalescing timer threshold.
- * This value determines the maximum
- * amount of time after processing a descriptor
- * before raising an interrupt.
- * @param [in] irq_coalescing_count
- * Interrupt coalescing count threshold.
- * This value determines how many descriptors
- * are completed before raising an interrupt.
- */
-
-int hw_job_ring_set_coalescing_param(sec_job_ring_t *job_ring,
- uint16_t irq_coalescing_timer,
- uint8_t irq_coalescing_count);
-
-/* @brief Enable interrupt coalescing on a job ring
- * @param [in] job_ring The job ring
- */
-
-int hw_job_ring_enable_coalescing(sec_job_ring_t *job_ring);
-
-/*
- * @brief Disable interrupt coalescing on a job ring
- * @param [in] job_ring The job ring
- */
-
-int hw_job_ring_disable_coalescing(sec_job_ring_t *job_ring);
-
-/*
- * @brief Poll the HW for already processed jobs in the JR
- * and notify the available jobs to UA.
- *
- * @param [in] job_ring The job ring to poll.
- * @param [in] limit The maximum number of jobs to notify.
- * If set to negative value, all available
- * jobs are notified.
- *
- * @retval >=0 for No of jobs notified to UA.
- * @retval -1 for error
- */
-
-int hw_poll_job_ring(struct sec_job_ring_t *job_ring, int32_t limit);
-
-/* @brief Poll the HW for already processed jobs in the JR
- * and silently discard the available jobs or notify them to UA
- * with indicated error code.
-
- * @param [in,out] job_ring The job ring to poll.
- * @param [in] do_notify Can be #TRUE or #FALSE.
- * Indicates if descriptors to be discarded
- * or notified to UA with given error_code.
- * @param [in] error_code The detailed SEC error code.
- * @param [out] notified_descs Number of notified descriptors.
- * Can be NULL if do_notify is #FALSE
- */
-void hw_flush_job_ring(struct sec_job_ring_t *job_ring,
- uint32_t do_notify,
- uint32_t error_code, uint32_t *notified_descs);
-
-/*
- * @brief Flush job rings of any processed descs.
- * The processed descs are silently dropped,
- * WITHOUT being notified to UA.
- */
-void flush_job_rings(void);
-
-/*
- * @brief Handle desc that generated error in SEC engine.
- * Identify the exact type of error and handle the error.
- * Depending on the error type, the job ring could be reset.
- * All descs that are submitted for processing on this job ring
- * are notified to User Application with error status and detailed error code.
-
- * @param [in] job_ring Job ring
- * @param [in] sec_error_code Error code read from job ring's Channel
- * Status Register
- * @param [out] notified_descs Number of notified descs. Can be NULL if
- * do_notify is #FALSE
- * @param [out] do_driver_shutdown If set to #TRUE, then UA is returned code
- * #SEC_PROCESSING_ERROR
- * which is indication that UA must call
- * sec_release() after this.
- */
-void sec_handle_desc_error(struct sec_job_ring_t *job_ring,
- uint32_t sec_error_code,
- uint32_t *notified_descs,
- uint32_t *do_driver_shutdown);
-
-/*
- * @brief Release the software and hardware resources tied to a job ring.
- * @param [in] job_ring The job ring
- * @retval 0 for success
- * @retval -1 for error
- */
-int shutdown_job_ring(struct sec_job_ring_t *job_ring);
-
-/*
- * @brief Enable irqs on associated job ring.
- * @param [in] job_ring The job ring
- * @retval 0 for success
- * @retval -1 for error
- */
-int jr_enable_irqs(struct sec_job_ring_t *job_ring);
-
-/*
- * @brief Disable irqs on associated job ring.
- * @param [in] job_ring The job ring
- * @retval 0 for success
- * @retval -1 for error
- */
-int jr_disable_irqs(struct sec_job_ring_t *job_ring);
-
- /*
- * IRJA - Input Ring Jobs Added Register shows
- * how many new jobs were added to the Input Ring.
- */
-static inline void hw_enqueue_desc_on_job_ring(struct jobring_regs *regs,
- int num)
-{
- sec_out32(&regs->irja, num);
-}
-
-#endif /* _SEC_HW_SPECIFIC_H_ */