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)28*059d73eeSHoria Geantă sg_to_qm_sg(struct scatterlist *sg, int len,
29297b9cebSHoria Geantă struct dpaa2_sg_entry *qm_sg_ptr, u16 offset)
30297b9cebSHoria Geantă {
31*059d73eeSHoria Geantă int ent_len;
32*059d73eeSHoria Geantă
33*059d73eeSHoria Geantă while (len) {
34*059d73eeSHoria Geantă ent_len = min_t(int, sg_dma_len(sg), len);
35*059d73eeSHoria Geantă
36*059d73eeSHoria Geantă dma_to_qm_sg_one(qm_sg_ptr, sg_dma_address(sg), ent_len,
37*059d73eeSHoria Geantă offset);
38297b9cebSHoria Geantă qm_sg_ptr++;
39297b9cebSHoria Geantă sg = sg_next(sg);
40*059d73eeSHoria 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)49*059d73eeSHoria 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ă {
53*059d73eeSHoria 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