1 /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2 /*
3  * Copyright 2014-2016 Freescale Semiconductor Inc.
4  * Copyright 2016 NXP
5  *
6  */
7 #ifndef __FSL_DPAA2_GLOBAL_H
8 #define __FSL_DPAA2_GLOBAL_H
9 
10 #include <linux/types.h>
11 #include <linux/cpumask.h>
12 #include "dpaa2-fd.h"
13 
14 struct dpaa2_dq {
15 	union {
16 		struct common {
17 			u8 verb;
18 			u8 reserved[63];
19 		} common;
20 		struct dq {
21 			u8 verb;
22 			u8 stat;
23 			__le16 seqnum;
24 			__le16 oprid;
25 			u8 reserved;
26 			u8 tok;
27 			__le32 fqid;
28 			u32 reserved2;
29 			__le32 fq_byte_cnt;
30 			__le32 fq_frm_cnt;
31 			__le64 fqd_ctx;
32 			u8 fd[32];
33 		} dq;
34 		struct scn {
35 			u8 verb;
36 			u8 stat;
37 			u8 state;
38 			u8 reserved;
39 			__le32 rid_tok;
40 			__le64 ctx;
41 		} scn;
42 	};
43 };
44 
45 /* Parsing frame dequeue results */
46 /* FQ empty */
47 #define DPAA2_DQ_STAT_FQEMPTY       0x80
48 /* FQ held active */
49 #define DPAA2_DQ_STAT_HELDACTIVE    0x40
50 /* FQ force eligible */
51 #define DPAA2_DQ_STAT_FORCEELIGIBLE 0x20
52 /* valid frame */
53 #define DPAA2_DQ_STAT_VALIDFRAME    0x10
54 /* FQ ODP enable */
55 #define DPAA2_DQ_STAT_ODPVALID      0x04
56 /* volatile dequeue */
57 #define DPAA2_DQ_STAT_VOLATILE      0x02
58 /* volatile dequeue command is expired */
59 #define DPAA2_DQ_STAT_EXPIRED       0x01
60 
61 #define DQ_FQID_MASK		0x00FFFFFF
62 #define DQ_FRAME_COUNT_MASK	0x00FFFFFF
63 
64 /**
65  * dpaa2_dq_flags() - Get the stat field of dequeue response
66  * @dq: the dequeue result.
67  */
dpaa2_dq_flags(const struct dpaa2_dq * dq)68 static inline u32 dpaa2_dq_flags(const struct dpaa2_dq *dq)
69 {
70 	return dq->dq.stat;
71 }
72 
73 /**
74  * dpaa2_dq_is_pull() - Check whether the dq response is from a pull
75  *                      command.
76  * @dq: the dequeue result
77  *
78  * Return 1 for volatile(pull) dequeue, 0 for static dequeue.
79  */
dpaa2_dq_is_pull(const struct dpaa2_dq * dq)80 static inline int dpaa2_dq_is_pull(const struct dpaa2_dq *dq)
81 {
82 	return (int)(dpaa2_dq_flags(dq) & DPAA2_DQ_STAT_VOLATILE);
83 }
84 
85 /**
86  * dpaa2_dq_is_pull_complete() - Check whether the pull command is completed.
87  * @dq: the dequeue result
88  *
89  * Return boolean.
90  */
dpaa2_dq_is_pull_complete(const struct dpaa2_dq * dq)91 static inline bool dpaa2_dq_is_pull_complete(const struct dpaa2_dq *dq)
92 {
93 	return !!(dpaa2_dq_flags(dq) & DPAA2_DQ_STAT_EXPIRED);
94 }
95 
96 /**
97  * dpaa2_dq_seqnum() - Get the seqnum field in dequeue response
98  * @dq: the dequeue result
99  *
100  * seqnum is valid only if VALIDFRAME flag is TRUE
101  *
102  * Return seqnum.
103  */
dpaa2_dq_seqnum(const struct dpaa2_dq * dq)104 static inline u16 dpaa2_dq_seqnum(const struct dpaa2_dq *dq)
105 {
106 	return le16_to_cpu(dq->dq.seqnum);
107 }
108 
109 /**
110  * dpaa2_dq_odpid() - Get the odpid field in dequeue response
111  * @dq: the dequeue result
112  *
113  * odpid is valid only if ODPVALID flag is TRUE.
114  *
115  * Return odpid.
116  */
dpaa2_dq_odpid(const struct dpaa2_dq * dq)117 static inline u16 dpaa2_dq_odpid(const struct dpaa2_dq *dq)
118 {
119 	return le16_to_cpu(dq->dq.oprid);
120 }
121 
122 /**
123  * dpaa2_dq_fqid() - Get the fqid in dequeue response
124  * @dq: the dequeue result
125  *
126  * Return fqid.
127  */
dpaa2_dq_fqid(const struct dpaa2_dq * dq)128 static inline u32 dpaa2_dq_fqid(const struct dpaa2_dq *dq)
129 {
130 	return le32_to_cpu(dq->dq.fqid) & DQ_FQID_MASK;
131 }
132 
133 /**
134  * dpaa2_dq_byte_count() - Get the byte count in dequeue response
135  * @dq: the dequeue result
136  *
137  * Return the byte count remaining in the FQ.
138  */
dpaa2_dq_byte_count(const struct dpaa2_dq * dq)139 static inline u32 dpaa2_dq_byte_count(const struct dpaa2_dq *dq)
140 {
141 	return le32_to_cpu(dq->dq.fq_byte_cnt);
142 }
143 
144 /**
145  * dpaa2_dq_frame_count() - Get the frame count in dequeue response
146  * @dq: the dequeue result
147  *
148  * Return the frame count remaining in the FQ.
149  */
dpaa2_dq_frame_count(const struct dpaa2_dq * dq)150 static inline u32 dpaa2_dq_frame_count(const struct dpaa2_dq *dq)
151 {
152 	return le32_to_cpu(dq->dq.fq_frm_cnt) & DQ_FRAME_COUNT_MASK;
153 }
154 
155 /**
156  * dpaa2_dq_fd_ctx() - Get the frame queue context in dequeue response
157  * @dq: the dequeue result
158  *
159  * Return the frame queue context.
160  */
dpaa2_dq_fqd_ctx(const struct dpaa2_dq * dq)161 static inline u64 dpaa2_dq_fqd_ctx(const struct dpaa2_dq *dq)
162 {
163 	return le64_to_cpu(dq->dq.fqd_ctx);
164 }
165 
166 /**
167  * dpaa2_dq_fd() - Get the frame descriptor in dequeue response
168  * @dq: the dequeue result
169  *
170  * Return the frame descriptor.
171  */
dpaa2_dq_fd(const struct dpaa2_dq * dq)172 static inline const struct dpaa2_fd *dpaa2_dq_fd(const struct dpaa2_dq *dq)
173 {
174 	return (const struct dpaa2_fd *)&dq->dq.fd[0];
175 }
176 
177 #define DPAA2_CSCN_SIZE		sizeof(struct dpaa2_dq)
178 #define DPAA2_CSCN_ALIGN	16
179 #define DPAA2_CSCN_STATE_CG	BIT(0)
180 
181 /**
182  * dpaa2_cscn_state_congested() - Check congestion state
183  * @cscn: congestion SCN (delivered to WQ or memory)
184  *
185 i * Return true is congested.
186  */
dpaa2_cscn_state_congested(struct dpaa2_dq * cscn)187 static inline bool dpaa2_cscn_state_congested(struct dpaa2_dq *cscn)
188 {
189 	return !!(cscn->scn.state & DPAA2_CSCN_STATE_CG);
190 }
191 
192 #endif /* __FSL_DPAA2_GLOBAL_H */
193