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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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