1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#ifndef __SG_SW_QM_H
35#define __SG_SW_QM_H
36
37#include <soc/fsl/qman.h>
38#include "regs.h"
39
40static inline void __dma_to_qm_sg(struct qm_sg_entry *qm_sg_ptr, dma_addr_t dma,
41 u16 offset)
42{
43 qm_sg_entry_set64(qm_sg_ptr, dma);
44 qm_sg_ptr->__reserved2 = 0;
45 qm_sg_ptr->bpid = 0;
46 qm_sg_ptr->offset = cpu_to_be16(offset & QM_SG_OFF_MASK);
47}
48
49static inline void dma_to_qm_sg_one(struct qm_sg_entry *qm_sg_ptr,
50 dma_addr_t dma, u32 len, u16 offset)
51{
52 __dma_to_qm_sg(qm_sg_ptr, dma, offset);
53 qm_sg_entry_set_len(qm_sg_ptr, len);
54}
55
56static inline void dma_to_qm_sg_one_last(struct qm_sg_entry *qm_sg_ptr,
57 dma_addr_t dma, u32 len, u16 offset)
58{
59 __dma_to_qm_sg(qm_sg_ptr, dma, offset);
60 qm_sg_entry_set_f(qm_sg_ptr, len);
61}
62
63static inline void dma_to_qm_sg_one_ext(struct qm_sg_entry *qm_sg_ptr,
64 dma_addr_t dma, u32 len, u16 offset)
65{
66 __dma_to_qm_sg(qm_sg_ptr, dma, offset);
67 qm_sg_ptr->cfg = cpu_to_be32(QM_SG_EXT | (len & QM_SG_LEN_MASK));
68}
69
70static inline void dma_to_qm_sg_one_last_ext(struct qm_sg_entry *qm_sg_ptr,
71 dma_addr_t dma, u32 len,
72 u16 offset)
73{
74 __dma_to_qm_sg(qm_sg_ptr, dma, offset);
75 qm_sg_ptr->cfg = cpu_to_be32(QM_SG_EXT | QM_SG_FIN |
76 (len & QM_SG_LEN_MASK));
77}
78
79
80
81
82
83static inline struct qm_sg_entry *
84sg_to_qm_sg(struct scatterlist *sg, int sg_count,
85 struct qm_sg_entry *qm_sg_ptr, u16 offset)
86{
87 while (sg_count && sg) {
88 dma_to_qm_sg_one(qm_sg_ptr, sg_dma_address(sg),
89 sg_dma_len(sg), offset);
90 qm_sg_ptr++;
91 sg = sg_next(sg);
92 sg_count--;
93 }
94 return qm_sg_ptr - 1;
95}
96
97
98
99
100
101static inline void sg_to_qm_sg_last(struct scatterlist *sg, int sg_count,
102 struct qm_sg_entry *qm_sg_ptr, u16 offset)
103{
104 qm_sg_ptr = sg_to_qm_sg(sg, sg_count, qm_sg_ptr, offset);
105 qm_sg_entry_set_f(qm_sg_ptr, qm_sg_entry_get_len(qm_sg_ptr));
106}
107
108#endif
109