162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2015-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * Copyright 2017-2018 NXP 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _CAAMALG_QI2_H_ 862306a36Sopenharmony_ci#define _CAAMALG_QI2_H_ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <crypto/internal/skcipher.h> 1162306a36Sopenharmony_ci#include <linux/compiler_attributes.h> 1262306a36Sopenharmony_ci#include <soc/fsl/dpaa2-io.h> 1362306a36Sopenharmony_ci#include <soc/fsl/dpaa2-fd.h> 1462306a36Sopenharmony_ci#include <linux/threads.h> 1562306a36Sopenharmony_ci#include <linux/netdevice.h> 1662306a36Sopenharmony_ci#include "dpseci.h" 1762306a36Sopenharmony_ci#include "desc_constr.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define DPAA2_CAAM_STORE_SIZE 16 2062306a36Sopenharmony_ci/* NAPI weight *must* be a multiple of the store size. */ 2162306a36Sopenharmony_ci#define DPAA2_CAAM_NAPI_WEIGHT 512 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* The congestion entrance threshold was chosen so that on LS2088 2462306a36Sopenharmony_ci * we support the maximum throughput for the available memory 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci#define DPAA2_SEC_CONG_ENTRY_THRESH (128 * 1024 * 1024) 2762306a36Sopenharmony_ci#define DPAA2_SEC_CONG_EXIT_THRESH (DPAA2_SEC_CONG_ENTRY_THRESH * 9 / 10) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/** 3062306a36Sopenharmony_ci * dpaa2_caam_priv - driver private data 3162306a36Sopenharmony_ci * @dpseci_id: DPSECI object unique ID 3262306a36Sopenharmony_ci * @major_ver: DPSECI major version 3362306a36Sopenharmony_ci * @minor_ver: DPSECI minor version 3462306a36Sopenharmony_ci * @dpseci_attr: DPSECI attributes 3562306a36Sopenharmony_ci * @sec_attr: SEC engine attributes 3662306a36Sopenharmony_ci * @rx_queue_attr: array of Rx queue attributes 3762306a36Sopenharmony_ci * @tx_queue_attr: array of Tx queue attributes 3862306a36Sopenharmony_ci * @cscn_mem: pointer to memory region containing the congestion SCN 3962306a36Sopenharmony_ci * it's size is larger than to accommodate alignment 4062306a36Sopenharmony_ci * @cscn_dma: dma address used by the QMAN to write CSCN messages 4162306a36Sopenharmony_ci * @dev: device associated with the DPSECI object 4262306a36Sopenharmony_ci * @mc_io: pointer to MC portal's I/O object 4362306a36Sopenharmony_ci * @domain: IOMMU domain 4462306a36Sopenharmony_ci * @ppriv: per CPU pointers to privata data 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_cistruct dpaa2_caam_priv { 4762306a36Sopenharmony_ci int dpsec_id; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci u16 major_ver; 5062306a36Sopenharmony_ci u16 minor_ver; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci struct dpseci_attr dpseci_attr; 5362306a36Sopenharmony_ci struct dpseci_sec_attr sec_attr; 5462306a36Sopenharmony_ci struct dpseci_rx_queue_attr rx_queue_attr[DPSECI_MAX_QUEUE_NUM]; 5562306a36Sopenharmony_ci struct dpseci_tx_queue_attr tx_queue_attr[DPSECI_MAX_QUEUE_NUM]; 5662306a36Sopenharmony_ci int num_pairs; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* congestion */ 5962306a36Sopenharmony_ci void *cscn_mem; 6062306a36Sopenharmony_ci dma_addr_t cscn_dma; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci struct device *dev; 6362306a36Sopenharmony_ci struct fsl_mc_io *mc_io; 6462306a36Sopenharmony_ci struct iommu_domain *domain; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci struct dpaa2_caam_priv_per_cpu __percpu *ppriv; 6762306a36Sopenharmony_ci struct dentry *dfs_root; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/** 7162306a36Sopenharmony_ci * dpaa2_caam_priv_per_cpu - per CPU private data 7262306a36Sopenharmony_ci * @napi: napi structure 7362306a36Sopenharmony_ci * @net_dev: netdev used by napi 7462306a36Sopenharmony_ci * @req_fqid: (virtual) request (Tx / enqueue) FQID 7562306a36Sopenharmony_ci * @rsp_fqid: (virtual) response (Rx / dequeue) FQID 7662306a36Sopenharmony_ci * @prio: internal queue number - index for dpaa2_caam_priv.*_queue_attr 7762306a36Sopenharmony_ci * @nctx: notification context of response FQ 7862306a36Sopenharmony_ci * @store: where dequeued frames are stored 7962306a36Sopenharmony_ci * @priv: backpointer to dpaa2_caam_priv 8062306a36Sopenharmony_ci * @dpio: portal used for data path operations 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_cistruct dpaa2_caam_priv_per_cpu { 8362306a36Sopenharmony_ci struct napi_struct napi; 8462306a36Sopenharmony_ci struct net_device net_dev; 8562306a36Sopenharmony_ci int req_fqid; 8662306a36Sopenharmony_ci int rsp_fqid; 8762306a36Sopenharmony_ci int prio; 8862306a36Sopenharmony_ci struct dpaa2_io_notification_ctx nctx; 8962306a36Sopenharmony_ci struct dpaa2_io_store *store; 9062306a36Sopenharmony_ci struct dpaa2_caam_priv *priv; 9162306a36Sopenharmony_ci struct dpaa2_io *dpio; 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* Length of a single buffer in the QI driver memory cache */ 9562306a36Sopenharmony_ci#define CAAM_QI_MEMCACHE_SIZE 512 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* 9862306a36Sopenharmony_ci * aead_edesc - s/w-extended aead descriptor 9962306a36Sopenharmony_ci * @src_nents: number of segments in input scatterlist 10062306a36Sopenharmony_ci * @dst_nents: number of segments in output scatterlist 10162306a36Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table 10262306a36Sopenharmony_ci * @qm_sg_bytes: length of dma mapped h/w link table 10362306a36Sopenharmony_ci * @qm_sg_dma: bus physical mapped address of h/w link table 10462306a36Sopenharmony_ci * @assoclen: associated data length, in CAAM endianness 10562306a36Sopenharmony_ci * @assoclen_dma: bus physical mapped address of req->assoclen 10662306a36Sopenharmony_ci * @sgt: the h/w link table, followed by IV 10762306a36Sopenharmony_ci */ 10862306a36Sopenharmony_cistruct aead_edesc { 10962306a36Sopenharmony_ci int src_nents; 11062306a36Sopenharmony_ci int dst_nents; 11162306a36Sopenharmony_ci dma_addr_t iv_dma; 11262306a36Sopenharmony_ci int qm_sg_bytes; 11362306a36Sopenharmony_ci dma_addr_t qm_sg_dma; 11462306a36Sopenharmony_ci unsigned int assoclen; 11562306a36Sopenharmony_ci dma_addr_t assoclen_dma; 11662306a36Sopenharmony_ci struct dpaa2_sg_entry sgt[]; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci/* 12062306a36Sopenharmony_ci * skcipher_edesc - s/w-extended skcipher descriptor 12162306a36Sopenharmony_ci * @src_nents: number of segments in input scatterlist 12262306a36Sopenharmony_ci * @dst_nents: number of segments in output scatterlist 12362306a36Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table 12462306a36Sopenharmony_ci * @qm_sg_bytes: length of dma mapped qm_sg space 12562306a36Sopenharmony_ci * @qm_sg_dma: I/O virtual address of h/w link table 12662306a36Sopenharmony_ci * @sgt: the h/w link table, followed by IV 12762306a36Sopenharmony_ci */ 12862306a36Sopenharmony_cistruct skcipher_edesc { 12962306a36Sopenharmony_ci int src_nents; 13062306a36Sopenharmony_ci int dst_nents; 13162306a36Sopenharmony_ci dma_addr_t iv_dma; 13262306a36Sopenharmony_ci int qm_sg_bytes; 13362306a36Sopenharmony_ci dma_addr_t qm_sg_dma; 13462306a36Sopenharmony_ci struct dpaa2_sg_entry sgt[]; 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/* 13862306a36Sopenharmony_ci * ahash_edesc - s/w-extended ahash descriptor 13962306a36Sopenharmony_ci * @qm_sg_dma: I/O virtual address of h/w link table 14062306a36Sopenharmony_ci * @src_nents: number of segments in input scatterlist 14162306a36Sopenharmony_ci * @qm_sg_bytes: length of dma mapped qm_sg space 14262306a36Sopenharmony_ci * @sgt: pointer to h/w link table 14362306a36Sopenharmony_ci */ 14462306a36Sopenharmony_cistruct ahash_edesc { 14562306a36Sopenharmony_ci dma_addr_t qm_sg_dma; 14662306a36Sopenharmony_ci int src_nents; 14762306a36Sopenharmony_ci int qm_sg_bytes; 14862306a36Sopenharmony_ci struct dpaa2_sg_entry sgt[]; 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/** 15262306a36Sopenharmony_ci * caam_flc - Flow Context (FLC) 15362306a36Sopenharmony_ci * @flc: Flow Context options 15462306a36Sopenharmony_ci * @sh_desc: Shared Descriptor 15562306a36Sopenharmony_ci */ 15662306a36Sopenharmony_cistruct caam_flc { 15762306a36Sopenharmony_ci u32 flc[16]; 15862306a36Sopenharmony_ci u32 sh_desc[MAX_SDLEN]; 15962306a36Sopenharmony_ci} __aligned(CRYPTO_DMA_ALIGN); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cienum optype { 16262306a36Sopenharmony_ci ENCRYPT = 0, 16362306a36Sopenharmony_ci DECRYPT, 16462306a36Sopenharmony_ci NUM_OP 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/** 16862306a36Sopenharmony_ci * caam_request - the request structure the driver application should fill while 16962306a36Sopenharmony_ci * submitting a job to driver. 17062306a36Sopenharmony_ci * @fd_flt: Frame list table defining input and output 17162306a36Sopenharmony_ci * fd_flt[0] - FLE pointing to output buffer 17262306a36Sopenharmony_ci * fd_flt[1] - FLE pointing to input buffer 17362306a36Sopenharmony_ci * @fd_flt_dma: DMA address for the frame list table 17462306a36Sopenharmony_ci * @flc: Flow Context 17562306a36Sopenharmony_ci * @flc_dma: I/O virtual address of Flow Context 17662306a36Sopenharmony_ci * @cbk: Callback function to invoke when job is completed 17762306a36Sopenharmony_ci * @ctx: arbit context attached with request by the application 17862306a36Sopenharmony_ci * @edesc: extended descriptor; points to one of {skcipher,aead}_edesc 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_cistruct caam_request { 18162306a36Sopenharmony_ci struct dpaa2_fl_entry fd_flt[2] __aligned(CRYPTO_DMA_ALIGN); 18262306a36Sopenharmony_ci dma_addr_t fd_flt_dma; 18362306a36Sopenharmony_ci struct caam_flc *flc; 18462306a36Sopenharmony_ci dma_addr_t flc_dma; 18562306a36Sopenharmony_ci void (*cbk)(void *ctx, u32 err); 18662306a36Sopenharmony_ci void *ctx; 18762306a36Sopenharmony_ci void *edesc; 18862306a36Sopenharmony_ci struct skcipher_request fallback_req; 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci/** 19262306a36Sopenharmony_ci * dpaa2_caam_enqueue() - enqueue a crypto request 19362306a36Sopenharmony_ci * @dev: device associated with the DPSECI object 19462306a36Sopenharmony_ci * @req: pointer to caam_request 19562306a36Sopenharmony_ci */ 19662306a36Sopenharmony_ciint dpaa2_caam_enqueue(struct device *dev, struct caam_request *req); 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#endif /* _CAAMALG_QI2_H_ */ 199