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