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