162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright 2019 NXP */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef __DPAA2_QDMA_H 562306a36Sopenharmony_ci#define __DPAA2_QDMA_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#define DPAA2_QDMA_STORE_SIZE 16 862306a36Sopenharmony_ci#define NUM_CH 8 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistruct dpaa2_qdma_sd_d { 1162306a36Sopenharmony_ci u32 rsv:32; 1262306a36Sopenharmony_ci union { 1362306a36Sopenharmony_ci struct { 1462306a36Sopenharmony_ci u32 ssd:12; /* souce stride distance */ 1562306a36Sopenharmony_ci u32 sss:12; /* souce stride size */ 1662306a36Sopenharmony_ci u32 rsv1:8; 1762306a36Sopenharmony_ci } sdf; 1862306a36Sopenharmony_ci struct { 1962306a36Sopenharmony_ci u32 dsd:12; /* Destination stride distance */ 2062306a36Sopenharmony_ci u32 dss:12; /* Destination stride size */ 2162306a36Sopenharmony_ci u32 rsv2:8; 2262306a36Sopenharmony_ci } ddf; 2362306a36Sopenharmony_ci } df; 2462306a36Sopenharmony_ci u32 rbpcmd; /* Route-by-port command */ 2562306a36Sopenharmony_ci u32 cmd; 2662306a36Sopenharmony_ci} __attribute__((__packed__)); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Source descriptor command read transaction type for RBP=0: */ 2962306a36Sopenharmony_ci/* coherent copy of cacheable memory */ 3062306a36Sopenharmony_ci#define QDMA_SD_CMD_RDTTYPE_COHERENT (0xb << 28) 3162306a36Sopenharmony_ci/* Destination descriptor command write transaction type for RBP=0: */ 3262306a36Sopenharmony_ci/* coherent copy of cacheable memory */ 3362306a36Sopenharmony_ci#define QDMA_DD_CMD_WRTTYPE_COHERENT (0x6 << 28) 3462306a36Sopenharmony_ci#define LX2160_QDMA_DD_CMD_WRTTYPE_COHERENT (0xb << 28) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define QMAN_FD_FMT_ENABLE BIT(0) /* frame list table enable */ 3762306a36Sopenharmony_ci#define QMAN_FD_BMT_ENABLE BIT(15) /* bypass memory translation */ 3862306a36Sopenharmony_ci#define QMAN_FD_BMT_DISABLE (0) /* bypass memory translation */ 3962306a36Sopenharmony_ci#define QMAN_FD_SL_DISABLE (0) /* short lengthe disabled */ 4062306a36Sopenharmony_ci#define QMAN_FD_SL_ENABLE BIT(14) /* short lengthe enabled */ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define QDMA_FINAL_BIT_DISABLE (0) /* final bit disable */ 4362306a36Sopenharmony_ci#define QDMA_FINAL_BIT_ENABLE BIT(31) /* final bit enable */ 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define QDMA_FD_SHORT_FORMAT BIT(11) /* short format */ 4662306a36Sopenharmony_ci#define QDMA_FD_LONG_FORMAT (0) /* long format */ 4762306a36Sopenharmony_ci#define QDMA_SER_DISABLE (8) /* no notification */ 4862306a36Sopenharmony_ci#define QDMA_SER_CTX BIT(8) /* notification by FQD_CTX[fqid] */ 4962306a36Sopenharmony_ci#define QDMA_SER_DEST (2 << 8) /* notification by destination desc */ 5062306a36Sopenharmony_ci#define QDMA_SER_BOTH (3 << 8) /* soruce and dest notification */ 5162306a36Sopenharmony_ci#define QDMA_FD_SPF_ENALBE BIT(30) /* source prefetch enable */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define QMAN_FD_VA_ENABLE BIT(14) /* Address used is virtual address */ 5462306a36Sopenharmony_ci#define QMAN_FD_VA_DISABLE (0)/* Address used is a real address */ 5562306a36Sopenharmony_ci/* Flow Context: 49bit physical address */ 5662306a36Sopenharmony_ci#define QMAN_FD_CBMT_ENABLE BIT(15) 5762306a36Sopenharmony_ci#define QMAN_FD_CBMT_DISABLE (0) /* Flow Context: 64bit virtual address */ 5862306a36Sopenharmony_ci#define QMAN_FD_SC_DISABLE (0) /* stashing control */ 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define QDMA_FL_FMT_SBF (0x0) /* Single buffer frame */ 6162306a36Sopenharmony_ci#define QDMA_FL_FMT_SGE (0x2) /* Scatter gather frame */ 6262306a36Sopenharmony_ci#define QDMA_FL_BMT_ENABLE BIT(15) /* enable bypass memory translation */ 6362306a36Sopenharmony_ci#define QDMA_FL_BMT_DISABLE (0x0) /* enable bypass memory translation */ 6462306a36Sopenharmony_ci#define QDMA_FL_SL_LONG (0x0)/* long length */ 6562306a36Sopenharmony_ci#define QDMA_FL_SL_SHORT (0x1) /* short length */ 6662306a36Sopenharmony_ci#define QDMA_FL_F (0x1)/* last frame list bit */ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/*Description of Frame list table structure*/ 6962306a36Sopenharmony_cistruct dpaa2_qdma_chan { 7062306a36Sopenharmony_ci struct dpaa2_qdma_engine *qdma; 7162306a36Sopenharmony_ci struct virt_dma_chan vchan; 7262306a36Sopenharmony_ci struct virt_dma_desc vdesc; 7362306a36Sopenharmony_ci enum dma_status status; 7462306a36Sopenharmony_ci u32 fqid; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci /* spinlock used by dpaa2 qdma driver */ 7762306a36Sopenharmony_ci spinlock_t queue_lock; 7862306a36Sopenharmony_ci struct dma_pool *fd_pool; 7962306a36Sopenharmony_ci struct dma_pool *fl_pool; 8062306a36Sopenharmony_ci struct dma_pool *sdd_pool; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci struct list_head comp_used; 8362306a36Sopenharmony_ci struct list_head comp_free; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistruct dpaa2_qdma_comp { 8862306a36Sopenharmony_ci dma_addr_t fd_bus_addr; 8962306a36Sopenharmony_ci dma_addr_t fl_bus_addr; 9062306a36Sopenharmony_ci dma_addr_t desc_bus_addr; 9162306a36Sopenharmony_ci struct dpaa2_fd *fd_virt_addr; 9262306a36Sopenharmony_ci struct dpaa2_fl_entry *fl_virt_addr; 9362306a36Sopenharmony_ci struct dpaa2_qdma_sd_d *desc_virt_addr; 9462306a36Sopenharmony_ci struct dpaa2_qdma_chan *qchan; 9562306a36Sopenharmony_ci struct virt_dma_desc vdesc; 9662306a36Sopenharmony_ci struct list_head list; 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct dpaa2_qdma_engine { 10062306a36Sopenharmony_ci struct dma_device dma_dev; 10162306a36Sopenharmony_ci u32 n_chans; 10262306a36Sopenharmony_ci struct dpaa2_qdma_chan chans[NUM_CH]; 10362306a36Sopenharmony_ci int qdma_wrtype_fixup; 10462306a36Sopenharmony_ci int desc_allocated; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci struct dpaa2_qdma_priv *priv; 10762306a36Sopenharmony_ci}; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* 11062306a36Sopenharmony_ci * dpaa2_qdma_priv - driver private data 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_cistruct dpaa2_qdma_priv { 11362306a36Sopenharmony_ci int dpqdma_id; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci struct iommu_domain *iommu_domain; 11662306a36Sopenharmony_ci struct dpdmai_attr dpdmai_attr; 11762306a36Sopenharmony_ci struct device *dev; 11862306a36Sopenharmony_ci struct fsl_mc_io *mc_io; 11962306a36Sopenharmony_ci struct fsl_mc_device *dpdmai_dev; 12062306a36Sopenharmony_ci u8 num_pairs; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci struct dpaa2_qdma_engine *dpaa2_qdma; 12362306a36Sopenharmony_ci struct dpaa2_qdma_priv_per_prio *ppriv; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci struct dpdmai_rx_queue_attr rx_queue_attr[DPDMAI_PRIO_NUM]; 12662306a36Sopenharmony_ci u32 tx_fqid[DPDMAI_PRIO_NUM]; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistruct dpaa2_qdma_priv_per_prio { 13062306a36Sopenharmony_ci int req_fqid; 13162306a36Sopenharmony_ci int rsp_fqid; 13262306a36Sopenharmony_ci int prio; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci struct dpaa2_io_store *store; 13562306a36Sopenharmony_ci struct dpaa2_io_notification_ctx nctx; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci struct dpaa2_qdma_priv *priv; 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic struct soc_device_attribute soc_fixup_tuning[] = { 14162306a36Sopenharmony_ci { .family = "QorIQ LX2160A"}, 14262306a36Sopenharmony_ci { /* sentinel */ } 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci/* FD pool size: one FD + 3 Frame list + 2 source/destination descriptor */ 14662306a36Sopenharmony_ci#define FD_POOL_SIZE (sizeof(struct dpaa2_fd) + \ 14762306a36Sopenharmony_ci sizeof(struct dpaa2_fl_entry) * 3 + \ 14862306a36Sopenharmony_ci sizeof(struct dpaa2_qdma_sd_d) * 2) 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistatic void dpaa2_dpdmai_free_channels(struct dpaa2_qdma_engine *dpaa2_qdma); 15162306a36Sopenharmony_cistatic void dpaa2_dpdmai_free_comp(struct dpaa2_qdma_chan *qchan, 15262306a36Sopenharmony_ci struct list_head *head); 15362306a36Sopenharmony_ci#endif /* __DPAA2_QDMA_H */ 154