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