162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * CAAM/SEC 4.x driver backend 462306a36Sopenharmony_ci * Private/internal definitions between modules 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright 2008-2011 Freescale Semiconductor, Inc. 762306a36Sopenharmony_ci * Copyright 2019, 2023 NXP 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef INTERN_H 1162306a36Sopenharmony_ci#define INTERN_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "ctrl.h" 1462306a36Sopenharmony_ci#include <crypto/engine.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Currently comes from Kconfig param as a ^2 (driver-required) */ 1762306a36Sopenharmony_ci#define JOBR_DEPTH (1 << CONFIG_CRYPTO_DEV_FSL_CAAM_RINGSIZE) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Maximum size for crypto-engine software queue based on Job Ring 2162306a36Sopenharmony_ci * size (JOBR_DEPTH) and a THRESHOLD (reserved for the non-crypto-API 2262306a36Sopenharmony_ci * requests that are not passed through crypto-engine) 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#define THRESHOLD 15 2562306a36Sopenharmony_ci#define CRYPTO_ENGINE_MAX_QLEN (JOBR_DEPTH - THRESHOLD) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* Kconfig params for interrupt coalescing if selected (else zero) */ 2862306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_INTC 2962306a36Sopenharmony_ci#define JOBR_INTC JRCFG_ICEN 3062306a36Sopenharmony_ci#define JOBR_INTC_TIME_THLD CONFIG_CRYPTO_DEV_FSL_CAAM_INTC_TIME_THLD 3162306a36Sopenharmony_ci#define JOBR_INTC_COUNT_THLD CONFIG_CRYPTO_DEV_FSL_CAAM_INTC_COUNT_THLD 3262306a36Sopenharmony_ci#else 3362306a36Sopenharmony_ci#define JOBR_INTC 0 3462306a36Sopenharmony_ci#define JOBR_INTC_TIME_THLD 0 3562306a36Sopenharmony_ci#define JOBR_INTC_COUNT_THLD 0 3662306a36Sopenharmony_ci#endif 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Storage for tracking each in-process entry moving across a ring 4062306a36Sopenharmony_ci * Each entry on an output ring needs one of these 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_cistruct caam_jrentry_info { 4362306a36Sopenharmony_ci void (*callbk)(struct device *dev, u32 *desc, u32 status, void *arg); 4462306a36Sopenharmony_ci void *cbkarg; /* Argument per ring entry */ 4562306a36Sopenharmony_ci u32 *desc_addr_virt; /* Stored virt addr for postprocessing */ 4662306a36Sopenharmony_ci dma_addr_t desc_addr_dma; /* Stored bus addr for done matching */ 4762306a36Sopenharmony_ci u32 desc_size; /* Stored size for postprocessing, header derived */ 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistruct caam_jr_state { 5162306a36Sopenharmony_ci dma_addr_t inpbusaddr; 5262306a36Sopenharmony_ci dma_addr_t outbusaddr; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct caam_jr_dequeue_params { 5662306a36Sopenharmony_ci struct device *dev; 5762306a36Sopenharmony_ci int enable_itr; 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* Private sub-storage for a single JobR */ 6162306a36Sopenharmony_cistruct caam_drv_private_jr { 6262306a36Sopenharmony_ci struct list_head list_node; /* Job Ring device list */ 6362306a36Sopenharmony_ci struct device *dev; 6462306a36Sopenharmony_ci int ridx; 6562306a36Sopenharmony_ci struct caam_job_ring __iomem *rregs; /* JobR's register space */ 6662306a36Sopenharmony_ci struct tasklet_struct irqtask; 6762306a36Sopenharmony_ci struct caam_jr_dequeue_params tasklet_params; 6862306a36Sopenharmony_ci int irq; /* One per queue */ 6962306a36Sopenharmony_ci bool hwrng; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* Number of scatterlist crypt transforms active on the JobR */ 7262306a36Sopenharmony_ci atomic_t tfm_count ____cacheline_aligned; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* Job ring info */ 7562306a36Sopenharmony_ci struct caam_jrentry_info *entinfo; /* Alloc'ed 1 per ring entry */ 7662306a36Sopenharmony_ci spinlock_t inplock ____cacheline_aligned; /* Input ring index lock */ 7762306a36Sopenharmony_ci u32 inpring_avail; /* Number of free entries in input ring */ 7862306a36Sopenharmony_ci int head; /* entinfo (s/w ring) head index */ 7962306a36Sopenharmony_ci void *inpring; /* Base of input ring, alloc 8062306a36Sopenharmony_ci * DMA-safe */ 8162306a36Sopenharmony_ci int out_ring_read_index; /* Output index "tail" */ 8262306a36Sopenharmony_ci int tail; /* entinfo (s/w ring) tail index */ 8362306a36Sopenharmony_ci void *outring; /* Base of output ring, DMA-safe */ 8462306a36Sopenharmony_ci struct crypto_engine *engine; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci struct caam_jr_state state; /* State of the JR during PM */ 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistruct caam_ctl_state { 9062306a36Sopenharmony_ci struct masterid deco_mid[16]; 9162306a36Sopenharmony_ci struct masterid jr_mid[4]; 9262306a36Sopenharmony_ci u32 mcr; 9362306a36Sopenharmony_ci u32 scfgr; 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* 9762306a36Sopenharmony_ci * Driver-private storage for a single CAAM block instance 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_cistruct caam_drv_private { 10062306a36Sopenharmony_ci /* Physical-presence section */ 10162306a36Sopenharmony_ci struct caam_ctrl __iomem *ctrl; /* controller region */ 10262306a36Sopenharmony_ci struct caam_deco __iomem *deco; /* DECO/CCB views */ 10362306a36Sopenharmony_ci struct caam_assurance __iomem *assure; 10462306a36Sopenharmony_ci struct caam_queue_if __iomem *qi; /* QI control region */ 10562306a36Sopenharmony_ci struct caam_job_ring __iomem *jr[4]; /* JobR's register space */ 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci struct iommu_domain *domain; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci /* 11062306a36Sopenharmony_ci * Detected geometry block. Filled in from device tree if powerpc, 11162306a36Sopenharmony_ci * or from register-based version detection code 11262306a36Sopenharmony_ci */ 11362306a36Sopenharmony_ci u8 total_jobrs; /* Total Job Rings in device */ 11462306a36Sopenharmony_ci u8 qi_present; /* Nonzero if QI present in device */ 11562306a36Sopenharmony_ci u8 blob_present; /* Nonzero if BLOB support present in device */ 11662306a36Sopenharmony_ci u8 mc_en; /* Nonzero if MC f/w is active */ 11762306a36Sopenharmony_ci u8 optee_en; /* Nonzero if OP-TEE f/w is active */ 11862306a36Sopenharmony_ci bool pr_support; /* RNG prediction resistance available */ 11962306a36Sopenharmony_ci int secvio_irq; /* Security violation interrupt number */ 12062306a36Sopenharmony_ci int virt_en; /* Virtualization enabled in CAAM */ 12162306a36Sopenharmony_ci int era; /* CAAM Era (internal HW revision) */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci#define RNG4_MAX_HANDLES 2 12462306a36Sopenharmony_ci /* RNG4 block */ 12562306a36Sopenharmony_ci u32 rng4_sh_init; /* This bitmap shows which of the State 12662306a36Sopenharmony_ci Handles of the RNG4 block are initialized 12762306a36Sopenharmony_ci by this driver */ 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci struct clk_bulk_data *clks; 13062306a36Sopenharmony_ci int num_clks; 13162306a36Sopenharmony_ci /* 13262306a36Sopenharmony_ci * debugfs entries for developer view into driver/device 13362306a36Sopenharmony_ci * variables at runtime. 13462306a36Sopenharmony_ci */ 13562306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 13662306a36Sopenharmony_ci struct dentry *ctl; /* controller dir */ 13762306a36Sopenharmony_ci struct debugfs_blob_wrapper ctl_kek_wrap, ctl_tkek_wrap, ctl_tdsk_wrap; 13862306a36Sopenharmony_ci#endif 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci int caam_off_during_pm; /* If the CAAM is reset after suspend */ 14162306a36Sopenharmony_ci struct caam_ctl_state state; /* State of the CTL during PM */ 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ciint caam_algapi_init(struct device *dev); 14762306a36Sopenharmony_civoid caam_algapi_exit(void); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci#else 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic inline int caam_algapi_init(struct device *dev) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci return 0; 15462306a36Sopenharmony_ci} 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic inline void caam_algapi_exit(void) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci} 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API */ 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ciint caam_algapi_hash_init(struct device *dev); 16562306a36Sopenharmony_civoid caam_algapi_hash_exit(void); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci#else 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic inline int caam_algapi_hash_init(struct device *dev) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci return 0; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline void caam_algapi_hash_exit(void) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API */ 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ciint caam_pkc_init(struct device *dev); 18362306a36Sopenharmony_civoid caam_pkc_exit(void); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci#else 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistatic inline int caam_pkc_init(struct device *dev) 18862306a36Sopenharmony_ci{ 18962306a36Sopenharmony_ci return 0; 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic inline void caam_pkc_exit(void) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci} 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API */ 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ciint caam_rng_init(struct device *dev); 20162306a36Sopenharmony_civoid caam_rng_exit(struct device *dev); 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci#else 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic inline int caam_rng_init(struct device *dev) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci return 0; 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic inline void caam_rng_exit(struct device *dev) {} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API */ 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_PRNG_API 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ciint caam_prng_register(struct device *dev); 21762306a36Sopenharmony_civoid caam_prng_unregister(void *data); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci#else 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistatic inline int caam_prng_register(struct device *dev) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci return 0; 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic inline void caam_prng_unregister(void *data) {} 22762306a36Sopenharmony_ci#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_PRNG_API */ 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci#ifdef CONFIG_CAAM_QI 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ciint caam_qi_algapi_init(struct device *dev); 23262306a36Sopenharmony_civoid caam_qi_algapi_exit(void); 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#else 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic inline int caam_qi_algapi_init(struct device *dev) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci return 0; 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic inline void caam_qi_algapi_exit(void) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci#endif /* CONFIG_CAAM_QI */ 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistatic inline u64 caam_get_dma_mask(struct device *dev) 24862306a36Sopenharmony_ci{ 24962306a36Sopenharmony_ci struct device_node *nprop = dev->of_node; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci if (caam_ptr_sz != sizeof(u64)) 25262306a36Sopenharmony_ci return DMA_BIT_MASK(32); 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci if (caam_dpaa2) 25562306a36Sopenharmony_ci return DMA_BIT_MASK(49); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci if (of_device_is_compatible(nprop, "fsl,sec-v5.0-job-ring") || 25862306a36Sopenharmony_ci of_device_is_compatible(nprop, "fsl,sec-v5.0")) 25962306a36Sopenharmony_ci return DMA_BIT_MASK(40); 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci return DMA_BIT_MASK(36); 26262306a36Sopenharmony_ci} 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci#endif /* INTERN_H */ 266