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