Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */