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