1618b5dc4SHoria Geantă /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2b189817cSHoria Geantă /*
3b189817cSHoria Geantă * Copyright 2013-2016 Freescale Semiconductor, Inc.
4b189817cSHoria Geantă * Copyright 2016-2017 NXP
5b189817cSHoria Geantă */
6b189817cSHoria Geantă
7b189817cSHoria Geantă #ifndef __SG_SW_QM_H
8b189817cSHoria Geantă #define __SG_SW_QM_H
9b189817cSHoria Geantă
10b189817cSHoria Geantă #include <soc/fsl/qman.h>
11b189817cSHoria Geantă #include "regs.h"
12b189817cSHoria Geantă
__dma_to_qm_sg(struct qm_sg_entry * qm_sg_ptr,dma_addr_t dma,u16 offset)13b189817cSHoria Geantă static inline void __dma_to_qm_sg(struct qm_sg_entry *qm_sg_ptr, dma_addr_t dma,
14b189817cSHoria Geantă u16 offset)
15b189817cSHoria Geantă {
16b189817cSHoria Geantă qm_sg_entry_set64(qm_sg_ptr, dma);
17b189817cSHoria Geantă qm_sg_ptr->__reserved2 = 0;
18b189817cSHoria Geantă qm_sg_ptr->bpid = 0;
19b189817cSHoria Geantă qm_sg_ptr->offset = cpu_to_be16(offset & QM_SG_OFF_MASK);
20b189817cSHoria Geantă }
21b189817cSHoria Geantă
dma_to_qm_sg_one(struct qm_sg_entry * qm_sg_ptr,dma_addr_t dma,u32 len,u16 offset)22b189817cSHoria Geantă static inline void dma_to_qm_sg_one(struct qm_sg_entry *qm_sg_ptr,
23b189817cSHoria Geantă dma_addr_t dma, u32 len, u16 offset)
24b189817cSHoria Geantă {
25b189817cSHoria Geantă __dma_to_qm_sg(qm_sg_ptr, dma, offset);
26b189817cSHoria Geantă qm_sg_entry_set_len(qm_sg_ptr, len);
27b189817cSHoria Geantă }
28b189817cSHoria Geantă
dma_to_qm_sg_one_last(struct qm_sg_entry * qm_sg_ptr,dma_addr_t dma,u32 len,u16 offset)29b189817cSHoria Geantă static inline void dma_to_qm_sg_one_last(struct qm_sg_entry *qm_sg_ptr,
30b189817cSHoria Geantă dma_addr_t dma, u32 len, u16 offset)
31b189817cSHoria Geantă {
32b189817cSHoria Geantă __dma_to_qm_sg(qm_sg_ptr, dma, offset);
33b189817cSHoria Geantă qm_sg_entry_set_f(qm_sg_ptr, len);
34b189817cSHoria Geantă }
35b189817cSHoria Geantă
dma_to_qm_sg_one_ext(struct qm_sg_entry * qm_sg_ptr,dma_addr_t dma,u32 len,u16 offset)36b189817cSHoria Geantă static inline void dma_to_qm_sg_one_ext(struct qm_sg_entry *qm_sg_ptr,
37b189817cSHoria Geantă dma_addr_t dma, u32 len, u16 offset)
38b189817cSHoria Geantă {
39b189817cSHoria Geantă __dma_to_qm_sg(qm_sg_ptr, dma, offset);
40b189817cSHoria Geantă qm_sg_ptr->cfg = cpu_to_be32(QM_SG_EXT | (len & QM_SG_LEN_MASK));
41b189817cSHoria Geantă }
42b189817cSHoria Geantă
dma_to_qm_sg_one_last_ext(struct qm_sg_entry * qm_sg_ptr,dma_addr_t dma,u32 len,u16 offset)43b189817cSHoria Geantă static inline void dma_to_qm_sg_one_last_ext(struct qm_sg_entry *qm_sg_ptr,
44b189817cSHoria Geantă dma_addr_t dma, u32 len,
45b189817cSHoria Geantă u16 offset)
46b189817cSHoria Geantă {
47b189817cSHoria Geantă __dma_to_qm_sg(qm_sg_ptr, dma, offset);
48b189817cSHoria Geantă qm_sg_ptr->cfg = cpu_to_be32(QM_SG_EXT | QM_SG_FIN |
49b189817cSHoria Geantă (len & QM_SG_LEN_MASK));
50b189817cSHoria Geantă }
51b189817cSHoria Geantă
52b189817cSHoria Geantă /*
53b189817cSHoria Geantă * convert scatterlist to h/w link table format
54b189817cSHoria Geantă * but does not have final bit; instead, returns last entry
55b189817cSHoria Geantă */
56b189817cSHoria Geantă static inline struct qm_sg_entry *
sg_to_qm_sg(struct scatterlist * sg,int len,struct qm_sg_entry * qm_sg_ptr,u16 offset)57*059d73eeSHoria Geantă sg_to_qm_sg(struct scatterlist *sg, int len,
58b189817cSHoria Geantă struct qm_sg_entry *qm_sg_ptr, u16 offset)
59b189817cSHoria Geantă {
60*059d73eeSHoria Geantă int ent_len;
61*059d73eeSHoria Geantă
62*059d73eeSHoria Geantă while (len) {
63*059d73eeSHoria Geantă ent_len = min_t(int, sg_dma_len(sg), len);
64*059d73eeSHoria Geantă
65*059d73eeSHoria Geantă dma_to_qm_sg_one(qm_sg_ptr, sg_dma_address(sg), ent_len,
66*059d73eeSHoria Geantă offset);
67b189817cSHoria Geantă qm_sg_ptr++;
68b189817cSHoria Geantă sg = sg_next(sg);
69*059d73eeSHoria Geantă len -= ent_len;
70b189817cSHoria Geantă }
71b189817cSHoria Geantă return qm_sg_ptr - 1;
72b189817cSHoria Geantă }
73b189817cSHoria Geantă
74b189817cSHoria Geantă /*
75b189817cSHoria Geantă * convert scatterlist to h/w link table format
76b189817cSHoria Geantă * scatterlist must have been previously dma mapped
77b189817cSHoria Geantă */
sg_to_qm_sg_last(struct scatterlist * sg,int len,struct qm_sg_entry * qm_sg_ptr,u16 offset)78*059d73eeSHoria Geantă static inline void sg_to_qm_sg_last(struct scatterlist *sg, int len,
79b189817cSHoria Geantă struct qm_sg_entry *qm_sg_ptr, u16 offset)
80b189817cSHoria Geantă {
81*059d73eeSHoria Geantă qm_sg_ptr = sg_to_qm_sg(sg, len, qm_sg_ptr, offset);
82b189817cSHoria Geantă qm_sg_entry_set_f(qm_sg_ptr, qm_sg_entry_get_len(qm_sg_ptr));
83b189817cSHoria Geantă }
84b189817cSHoria Geantă
85b189817cSHoria Geantă #endif /* __SG_SW_QM_H */
86