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