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