xref: /OK3568_Linux_fs/kernel/drivers/crypto/rockchip/rk_crypto_utils.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun /* Copyright (c) 2022 Rockchip Electronics Co. Ltd. */
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #ifndef __RK_CRYPTO_UTILS_H__
6*4882a593Smuzhiyun #define __RK_CRYPTO_UTILS_H__
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/dma-mapping.h>
9*4882a593Smuzhiyun #include <linux/scatterlist.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include "rk_crypto_core.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* Default 256 x 4K = 1MByte */
14*4882a593Smuzhiyun #define RK_DEFAULT_LLI_CNT	256
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun struct crypto_lli_desc {
17*4882a593Smuzhiyun 	u32 src_addr;
18*4882a593Smuzhiyun 	u32 src_len;
19*4882a593Smuzhiyun 	u32 dst_addr;
20*4882a593Smuzhiyun 	u32 dst_len;
21*4882a593Smuzhiyun 	u32 user_define;
22*4882a593Smuzhiyun 	u32 reserve;
23*4882a593Smuzhiyun 	u32 dma_ctrl;
24*4882a593Smuzhiyun 	u32 next_addr;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct rk_hw_desc {
28*4882a593Smuzhiyun 	struct device			*dev;
29*4882a593Smuzhiyun 	struct crypto_lli_desc		*lli_aad;
30*4882a593Smuzhiyun 	struct crypto_lli_desc		*lli_head;
31*4882a593Smuzhiyun 	struct crypto_lli_desc		*lli_tail;
32*4882a593Smuzhiyun 	dma_addr_t			lli_head_dma;
33*4882a593Smuzhiyun 	dma_addr_t			lli_aad_dma;
34*4882a593Smuzhiyun 	u32				total;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun void rk_crypto_write_regs(struct rk_crypto_dev *rk_dev, u32 base_addr, const u8 *data, u32 bytes);
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun void rk_crypto_clear_regs(struct rk_crypto_dev *rk_dev, u32 base_addr, u32 words);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun void rk_crypto_read_regs(struct rk_crypto_dev *rk_dev, u32 base_addr, u8 *data, u32 bytes);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun bool rk_crypto_check_align(struct scatterlist *src_sg, size_t src_nents,
44*4882a593Smuzhiyun 			   struct scatterlist *dst_sg, size_t dst_nents,
45*4882a593Smuzhiyun 			   int align_mask);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun bool rk_crypto_check_dmafd(struct scatterlist *sgl, size_t nents);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun u64 rk_crypto_hw_desc_maxlen(struct scatterlist *sg, u64 len, u32 *max_nents);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun int rk_crypto_hw_desc_alloc(struct device *dev, struct rk_hw_desc *hw_desc);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun int rk_crypto_hw_desc_init(struct rk_hw_desc *hw_desc,
54*4882a593Smuzhiyun 			   struct scatterlist *src_sg,
55*4882a593Smuzhiyun 			   struct scatterlist *dst_sg,
56*4882a593Smuzhiyun 			   u64 len);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun void rk_crypto_hw_desc_free(struct rk_hw_desc *hw_desc);
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun void rk_crypto_dump_hw_desc(struct rk_hw_desc *hw_desc);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64