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