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(®s->irja, num); 501*91f16700Schasinglulu } 502*91f16700Schasinglulu 503*91f16700Schasinglulu #endif /* _SEC_HW_SPECIFIC_H_ */ 504