123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /* Copyright 2019 NXP */
- #ifndef __DPAA2_QDMA_H
- #define __DPAA2_QDMA_H
- #define DPAA2_QDMA_STORE_SIZE 16
- #define NUM_CH 8
- struct dpaa2_qdma_sd_d {
- u32 rsv:32;
- union {
- struct {
- u32 ssd:12; /* souce stride distance */
- u32 sss:12; /* souce stride size */
- u32 rsv1:8;
- } sdf;
- struct {
- u32 dsd:12; /* Destination stride distance */
- u32 dss:12; /* Destination stride size */
- u32 rsv2:8;
- } ddf;
- } df;
- u32 rbpcmd; /* Route-by-port command */
- u32 cmd;
- } __attribute__((__packed__));
- /* Source descriptor command read transaction type for RBP=0: */
- /* coherent copy of cacheable memory */
- #define QDMA_SD_CMD_RDTTYPE_COHERENT (0xb << 28)
- /* Destination descriptor command write transaction type for RBP=0: */
- /* coherent copy of cacheable memory */
- #define QDMA_DD_CMD_WRTTYPE_COHERENT (0x6 << 28)
- #define LX2160_QDMA_DD_CMD_WRTTYPE_COHERENT (0xb << 28)
- #define QMAN_FD_FMT_ENABLE BIT(0) /* frame list table enable */
- #define QMAN_FD_BMT_ENABLE BIT(15) /* bypass memory translation */
- #define QMAN_FD_BMT_DISABLE (0) /* bypass memory translation */
- #define QMAN_FD_SL_DISABLE (0) /* short lengthe disabled */
- #define QMAN_FD_SL_ENABLE BIT(14) /* short lengthe enabled */
- #define QDMA_FINAL_BIT_DISABLE (0) /* final bit disable */
- #define QDMA_FINAL_BIT_ENABLE BIT(31) /* final bit enable */
- #define QDMA_FD_SHORT_FORMAT BIT(11) /* short format */
- #define QDMA_FD_LONG_FORMAT (0) /* long format */
- #define QDMA_SER_DISABLE (8) /* no notification */
- #define QDMA_SER_CTX BIT(8) /* notification by FQD_CTX[fqid] */
- #define QDMA_SER_DEST (2 << 8) /* notification by destination desc */
- #define QDMA_SER_BOTH (3 << 8) /* soruce and dest notification */
- #define QDMA_FD_SPF_ENALBE BIT(30) /* source prefetch enable */
- #define QMAN_FD_VA_ENABLE BIT(14) /* Address used is virtual address */
- #define QMAN_FD_VA_DISABLE (0)/* Address used is a real address */
- /* Flow Context: 49bit physical address */
- #define QMAN_FD_CBMT_ENABLE BIT(15)
- #define QMAN_FD_CBMT_DISABLE (0) /* Flow Context: 64bit virtual address */
- #define QMAN_FD_SC_DISABLE (0) /* stashing control */
- #define QDMA_FL_FMT_SBF (0x0) /* Single buffer frame */
- #define QDMA_FL_FMT_SGE (0x2) /* Scatter gather frame */
- #define QDMA_FL_BMT_ENABLE BIT(15) /* enable bypass memory translation */
- #define QDMA_FL_BMT_DISABLE (0x0) /* enable bypass memory translation */
- #define QDMA_FL_SL_LONG (0x0)/* long length */
- #define QDMA_FL_SL_SHORT (0x1) /* short length */
- #define QDMA_FL_F (0x1)/* last frame list bit */
- /*Description of Frame list table structure*/
- struct dpaa2_qdma_chan {
- struct dpaa2_qdma_engine *qdma;
- struct virt_dma_chan vchan;
- struct virt_dma_desc vdesc;
- enum dma_status status;
- u32 fqid;
- /* spinlock used by dpaa2 qdma driver */
- spinlock_t queue_lock;
- struct dma_pool *fd_pool;
- struct dma_pool *fl_pool;
- struct dma_pool *sdd_pool;
- struct list_head comp_used;
- struct list_head comp_free;
- };
- struct dpaa2_qdma_comp {
- dma_addr_t fd_bus_addr;
- dma_addr_t fl_bus_addr;
- dma_addr_t desc_bus_addr;
- struct dpaa2_fd *fd_virt_addr;
- struct dpaa2_fl_entry *fl_virt_addr;
- struct dpaa2_qdma_sd_d *desc_virt_addr;
- struct dpaa2_qdma_chan *qchan;
- struct virt_dma_desc vdesc;
- struct list_head list;
- };
- struct dpaa2_qdma_engine {
- struct dma_device dma_dev;
- u32 n_chans;
- struct dpaa2_qdma_chan chans[NUM_CH];
- int qdma_wrtype_fixup;
- int desc_allocated;
- struct dpaa2_qdma_priv *priv;
- };
- /*
- * dpaa2_qdma_priv - driver private data
- */
- struct dpaa2_qdma_priv {
- int dpqdma_id;
- struct iommu_domain *iommu_domain;
- struct dpdmai_attr dpdmai_attr;
- struct device *dev;
- struct fsl_mc_io *mc_io;
- struct fsl_mc_device *dpdmai_dev;
- u8 num_pairs;
- struct dpaa2_qdma_engine *dpaa2_qdma;
- struct dpaa2_qdma_priv_per_prio *ppriv;
- struct dpdmai_rx_queue_attr rx_queue_attr[DPDMAI_PRIO_NUM];
- u32 tx_fqid[DPDMAI_PRIO_NUM];
- };
- struct dpaa2_qdma_priv_per_prio {
- int req_fqid;
- int rsp_fqid;
- int prio;
- struct dpaa2_io_store *store;
- struct dpaa2_io_notification_ctx nctx;
- struct dpaa2_qdma_priv *priv;
- };
- static struct soc_device_attribute soc_fixup_tuning[] = {
- { .family = "QorIQ LX2160A"},
- { /* sentinel */ }
- };
- /* FD pool size: one FD + 3 Frame list + 2 source/destination descriptor */
- #define FD_POOL_SIZE (sizeof(struct dpaa2_fd) + \
- sizeof(struct dpaa2_fl_entry) * 3 + \
- sizeof(struct dpaa2_qdma_sd_d) * 2)
- static void dpaa2_dpdmai_free_channels(struct dpaa2_qdma_engine *dpaa2_qdma);
- static void dpaa2_dpdmai_free_comp(struct dpaa2_qdma_chan *qchan,
- struct list_head *head);
- #endif /* __DPAA2_QDMA_H */
|