xref: /openbmc/linux/drivers/crypto/caam/sg_sw_qm2.h (revision 059d73ee)
1618b5dc4SHoria Geantă /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2297b9cebSHoria Geantă /*
3297b9cebSHoria Geantă  * Copyright 2015-2016 Freescale Semiconductor, Inc.
4297b9cebSHoria Geantă  * Copyright 2017 NXP
5297b9cebSHoria Geantă  */
6297b9cebSHoria Geantă 
7297b9cebSHoria Geantă #ifndef _SG_SW_QM2_H_
8297b9cebSHoria Geantă #define _SG_SW_QM2_H_
9297b9cebSHoria Geantă 
10c89105c9SRoy Pledge #include <soc/fsl/dpaa2-fd.h>
11297b9cebSHoria Geantă 
dma_to_qm_sg_one(struct dpaa2_sg_entry * qm_sg_ptr,dma_addr_t dma,u32 len,u16 offset)12297b9cebSHoria Geantă static inline void dma_to_qm_sg_one(struct dpaa2_sg_entry *qm_sg_ptr,
13297b9cebSHoria Geantă 				    dma_addr_t dma, u32 len, u16 offset)
14297b9cebSHoria Geantă {
15297b9cebSHoria Geantă 	dpaa2_sg_set_addr(qm_sg_ptr, dma);
16297b9cebSHoria Geantă 	dpaa2_sg_set_format(qm_sg_ptr, dpaa2_sg_single);
17297b9cebSHoria Geantă 	dpaa2_sg_set_final(qm_sg_ptr, false);
18297b9cebSHoria Geantă 	dpaa2_sg_set_len(qm_sg_ptr, len);
19297b9cebSHoria Geantă 	dpaa2_sg_set_bpid(qm_sg_ptr, 0);
20297b9cebSHoria Geantă 	dpaa2_sg_set_offset(qm_sg_ptr, offset);
21297b9cebSHoria Geantă }
22297b9cebSHoria Geantă 
23297b9cebSHoria Geantă /*
24297b9cebSHoria Geantă  * convert scatterlist to h/w link table format
25297b9cebSHoria Geantă  * but does not have final bit; instead, returns last entry
26297b9cebSHoria Geantă  */
27297b9cebSHoria Geantă static inline struct dpaa2_sg_entry *
sg_to_qm_sg(struct scatterlist * sg,int len,struct dpaa2_sg_entry * qm_sg_ptr,u16 offset)28059d73eeSHoria Geantă sg_to_qm_sg(struct scatterlist *sg, int len,
29297b9cebSHoria Geantă 	    struct dpaa2_sg_entry *qm_sg_ptr, u16 offset)
30297b9cebSHoria Geantă {
31059d73eeSHoria Geantă 	int ent_len;
32059d73eeSHoria Geantă 
33059d73eeSHoria Geantă 	while (len) {
34059d73eeSHoria Geantă 		ent_len = min_t(int, sg_dma_len(sg), len);
35059d73eeSHoria Geantă 
36059d73eeSHoria Geantă 		dma_to_qm_sg_one(qm_sg_ptr, sg_dma_address(sg), ent_len,
37059d73eeSHoria Geantă 				 offset);
38297b9cebSHoria Geantă 		qm_sg_ptr++;
39297b9cebSHoria Geantă 		sg = sg_next(sg);
40059d73eeSHoria Geantă 		len -= ent_len;
41297b9cebSHoria Geantă 	}
42297b9cebSHoria Geantă 	return qm_sg_ptr - 1;
43297b9cebSHoria Geantă }
44297b9cebSHoria Geantă 
45297b9cebSHoria Geantă /*
46297b9cebSHoria Geantă  * convert scatterlist to h/w link table format
47297b9cebSHoria Geantă  * scatterlist must have been previously dma mapped
48297b9cebSHoria Geantă  */
sg_to_qm_sg_last(struct scatterlist * sg,int len,struct dpaa2_sg_entry * qm_sg_ptr,u16 offset)49059d73eeSHoria Geantă static inline void sg_to_qm_sg_last(struct scatterlist *sg, int len,
50297b9cebSHoria Geantă 				    struct dpaa2_sg_entry *qm_sg_ptr,
51297b9cebSHoria Geantă 				    u16 offset)
52297b9cebSHoria Geantă {
53059d73eeSHoria Geantă 	qm_sg_ptr = sg_to_qm_sg(sg, len, qm_sg_ptr, offset);
54297b9cebSHoria Geantă 	dpaa2_sg_set_final(qm_sg_ptr, true);
55297b9cebSHoria Geantă }
56297b9cebSHoria Geantă 
57297b9cebSHoria Geantă #endif /* _SG_SW_QM2_H_ */
58