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