162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2014-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * Copyright 2016 NXP 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef __FSL_DPAA2_GLOBAL_H 862306a36Sopenharmony_ci#define __FSL_DPAA2_GLOBAL_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <linux/cpumask.h> 1262306a36Sopenharmony_ci#include "dpaa2-fd.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct dpaa2_dq { 1562306a36Sopenharmony_ci union { 1662306a36Sopenharmony_ci struct common { 1762306a36Sopenharmony_ci u8 verb; 1862306a36Sopenharmony_ci u8 reserved[63]; 1962306a36Sopenharmony_ci } common; 2062306a36Sopenharmony_ci struct dq { 2162306a36Sopenharmony_ci u8 verb; 2262306a36Sopenharmony_ci u8 stat; 2362306a36Sopenharmony_ci __le16 seqnum; 2462306a36Sopenharmony_ci __le16 oprid; 2562306a36Sopenharmony_ci u8 reserved; 2662306a36Sopenharmony_ci u8 tok; 2762306a36Sopenharmony_ci __le32 fqid; 2862306a36Sopenharmony_ci u32 reserved2; 2962306a36Sopenharmony_ci __le32 fq_byte_cnt; 3062306a36Sopenharmony_ci __le32 fq_frm_cnt; 3162306a36Sopenharmony_ci __le64 fqd_ctx; 3262306a36Sopenharmony_ci u8 fd[32]; 3362306a36Sopenharmony_ci } dq; 3462306a36Sopenharmony_ci struct scn { 3562306a36Sopenharmony_ci u8 verb; 3662306a36Sopenharmony_ci u8 stat; 3762306a36Sopenharmony_ci u8 state; 3862306a36Sopenharmony_ci u8 reserved; 3962306a36Sopenharmony_ci __le32 rid_tok; 4062306a36Sopenharmony_ci __le64 ctx; 4162306a36Sopenharmony_ci } scn; 4262306a36Sopenharmony_ci }; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* Parsing frame dequeue results */ 4662306a36Sopenharmony_ci/* FQ empty */ 4762306a36Sopenharmony_ci#define DPAA2_DQ_STAT_FQEMPTY 0x80 4862306a36Sopenharmony_ci/* FQ held active */ 4962306a36Sopenharmony_ci#define DPAA2_DQ_STAT_HELDACTIVE 0x40 5062306a36Sopenharmony_ci/* FQ force eligible */ 5162306a36Sopenharmony_ci#define DPAA2_DQ_STAT_FORCEELIGIBLE 0x20 5262306a36Sopenharmony_ci/* valid frame */ 5362306a36Sopenharmony_ci#define DPAA2_DQ_STAT_VALIDFRAME 0x10 5462306a36Sopenharmony_ci/* FQ ODP enable */ 5562306a36Sopenharmony_ci#define DPAA2_DQ_STAT_ODPVALID 0x04 5662306a36Sopenharmony_ci/* volatile dequeue */ 5762306a36Sopenharmony_ci#define DPAA2_DQ_STAT_VOLATILE 0x02 5862306a36Sopenharmony_ci/* volatile dequeue command is expired */ 5962306a36Sopenharmony_ci#define DPAA2_DQ_STAT_EXPIRED 0x01 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define DQ_FQID_MASK 0x00FFFFFF 6262306a36Sopenharmony_ci#define DQ_FRAME_COUNT_MASK 0x00FFFFFF 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/** 6562306a36Sopenharmony_ci * dpaa2_dq_flags() - Get the stat field of dequeue response 6662306a36Sopenharmony_ci * @dq: the dequeue result. 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_cistatic inline u32 dpaa2_dq_flags(const struct dpaa2_dq *dq) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci return dq->dq.stat; 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/** 7462306a36Sopenharmony_ci * dpaa2_dq_is_pull() - Check whether the dq response is from a pull 7562306a36Sopenharmony_ci * command. 7662306a36Sopenharmony_ci * @dq: the dequeue result 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * Return 1 for volatile(pull) dequeue, 0 for static dequeue. 7962306a36Sopenharmony_ci */ 8062306a36Sopenharmony_cistatic inline int dpaa2_dq_is_pull(const struct dpaa2_dq *dq) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci return (int)(dpaa2_dq_flags(dq) & DPAA2_DQ_STAT_VOLATILE); 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/** 8662306a36Sopenharmony_ci * dpaa2_dq_is_pull_complete() - Check whether the pull command is completed. 8762306a36Sopenharmony_ci * @dq: the dequeue result 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * Return boolean. 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_cistatic inline bool dpaa2_dq_is_pull_complete(const struct dpaa2_dq *dq) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci return !!(dpaa2_dq_flags(dq) & DPAA2_DQ_STAT_EXPIRED); 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/** 9762306a36Sopenharmony_ci * dpaa2_dq_seqnum() - Get the seqnum field in dequeue response 9862306a36Sopenharmony_ci * @dq: the dequeue result 9962306a36Sopenharmony_ci * 10062306a36Sopenharmony_ci * seqnum is valid only if VALIDFRAME flag is TRUE 10162306a36Sopenharmony_ci * 10262306a36Sopenharmony_ci * Return seqnum. 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_cistatic inline u16 dpaa2_dq_seqnum(const struct dpaa2_dq *dq) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci return le16_to_cpu(dq->dq.seqnum); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/** 11062306a36Sopenharmony_ci * dpaa2_dq_odpid() - Get the odpid field in dequeue response 11162306a36Sopenharmony_ci * @dq: the dequeue result 11262306a36Sopenharmony_ci * 11362306a36Sopenharmony_ci * odpid is valid only if ODPVALID flag is TRUE. 11462306a36Sopenharmony_ci * 11562306a36Sopenharmony_ci * Return odpid. 11662306a36Sopenharmony_ci */ 11762306a36Sopenharmony_cistatic inline u16 dpaa2_dq_odpid(const struct dpaa2_dq *dq) 11862306a36Sopenharmony_ci{ 11962306a36Sopenharmony_ci return le16_to_cpu(dq->dq.oprid); 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci/** 12362306a36Sopenharmony_ci * dpaa2_dq_fqid() - Get the fqid in dequeue response 12462306a36Sopenharmony_ci * @dq: the dequeue result 12562306a36Sopenharmony_ci * 12662306a36Sopenharmony_ci * Return fqid. 12762306a36Sopenharmony_ci */ 12862306a36Sopenharmony_cistatic inline u32 dpaa2_dq_fqid(const struct dpaa2_dq *dq) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci return le32_to_cpu(dq->dq.fqid) & DQ_FQID_MASK; 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/** 13462306a36Sopenharmony_ci * dpaa2_dq_byte_count() - Get the byte count in dequeue response 13562306a36Sopenharmony_ci * @dq: the dequeue result 13662306a36Sopenharmony_ci * 13762306a36Sopenharmony_ci * Return the byte count remaining in the FQ. 13862306a36Sopenharmony_ci */ 13962306a36Sopenharmony_cistatic inline u32 dpaa2_dq_byte_count(const struct dpaa2_dq *dq) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci return le32_to_cpu(dq->dq.fq_byte_cnt); 14262306a36Sopenharmony_ci} 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/** 14562306a36Sopenharmony_ci * dpaa2_dq_frame_count() - Get the frame count in dequeue response 14662306a36Sopenharmony_ci * @dq: the dequeue result 14762306a36Sopenharmony_ci * 14862306a36Sopenharmony_ci * Return the frame count remaining in the FQ. 14962306a36Sopenharmony_ci */ 15062306a36Sopenharmony_cistatic inline u32 dpaa2_dq_frame_count(const struct dpaa2_dq *dq) 15162306a36Sopenharmony_ci{ 15262306a36Sopenharmony_ci return le32_to_cpu(dq->dq.fq_frm_cnt) & DQ_FRAME_COUNT_MASK; 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci/** 15662306a36Sopenharmony_ci * dpaa2_dq_fd_ctx() - Get the frame queue context in dequeue response 15762306a36Sopenharmony_ci * @dq: the dequeue result 15862306a36Sopenharmony_ci * 15962306a36Sopenharmony_ci * Return the frame queue context. 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_cistatic inline u64 dpaa2_dq_fqd_ctx(const struct dpaa2_dq *dq) 16262306a36Sopenharmony_ci{ 16362306a36Sopenharmony_ci return le64_to_cpu(dq->dq.fqd_ctx); 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci/** 16762306a36Sopenharmony_ci * dpaa2_dq_fd() - Get the frame descriptor in dequeue response 16862306a36Sopenharmony_ci * @dq: the dequeue result 16962306a36Sopenharmony_ci * 17062306a36Sopenharmony_ci * Return the frame descriptor. 17162306a36Sopenharmony_ci */ 17262306a36Sopenharmony_cistatic inline const struct dpaa2_fd *dpaa2_dq_fd(const struct dpaa2_dq *dq) 17362306a36Sopenharmony_ci{ 17462306a36Sopenharmony_ci return (const struct dpaa2_fd *)&dq->dq.fd[0]; 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci#define DPAA2_CSCN_SIZE sizeof(struct dpaa2_dq) 17862306a36Sopenharmony_ci#define DPAA2_CSCN_ALIGN 16 17962306a36Sopenharmony_ci#define DPAA2_CSCN_STATE_CG BIT(0) 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci/** 18262306a36Sopenharmony_ci * dpaa2_cscn_state_congested() - Check congestion state 18362306a36Sopenharmony_ci * @cscn: congestion SCN (delivered to WQ or memory) 18462306a36Sopenharmony_ci * 18562306a36Sopenharmony_cii * Return true is congested. 18662306a36Sopenharmony_ci */ 18762306a36Sopenharmony_cistatic inline bool dpaa2_cscn_state_congested(struct dpaa2_dq *cscn) 18862306a36Sopenharmony_ci{ 18962306a36Sopenharmony_ci return !!(cscn->scn.state & DPAA2_CSCN_STATE_CG); 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci#endif /* __FSL_DPAA2_GLOBAL_H */ 193