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