xref: /dpdk/drivers/dma/idxd/idxd_internal.h (revision fd51012de5369679e807be1d6a81d63ef15015ce)
1e33ad06eSKevin Laatz /* SPDX-License-Identifier: BSD-3-Clause
2e33ad06eSKevin Laatz  * Copyright 2021 Intel Corporation
3e33ad06eSKevin Laatz  */
4e33ad06eSKevin Laatz 
5e33ad06eSKevin Laatz #ifndef _IDXD_INTERNAL_H_
6e33ad06eSKevin Laatz #define _IDXD_INTERNAL_H_
7e33ad06eSKevin Laatz 
855dc0f60SKevin Laatz #include <rte_dmadev_pmd.h>
99449330aSKevin Laatz #include <rte_spinlock.h>
1055dc0f60SKevin Laatz 
1155dc0f60SKevin Laatz #include "idxd_hw_defs.h"
1255dc0f60SKevin Laatz 
13e33ad06eSKevin Laatz /**
14e33ad06eSKevin Laatz  * @file idxd_internal.h
15e33ad06eSKevin Laatz  *
16e33ad06eSKevin Laatz  * Internal data structures for the idxd/DSA driver for dmadev
17e33ad06eSKevin Laatz  *
18e33ad06eSKevin Laatz  * @warning
19e33ad06eSKevin Laatz  * @b EXPERIMENTAL: these structures and APIs may change without prior notice
20e33ad06eSKevin Laatz  */
21e33ad06eSKevin Laatz 
22e33ad06eSKevin Laatz extern int idxd_pmd_logtype;
232b843cacSDavid Marchand #define RTE_LOGTYPE_IDXD_PMD idxd_pmd_logtype
24e33ad06eSKevin Laatz 
252b843cacSDavid Marchand #define IDXD_PMD_LOG(level, ...) \
262b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(level, IDXD_PMD, "%s(): ", __func__, __VA_ARGS__)
27e33ad06eSKevin Laatz 
28*fd51012dSAndre Muezerie #define IDXD_PMD_DEBUG(fmt, ...)  IDXD_PMD_LOG(DEBUG, fmt, ## __VA_ARGS__)
29*fd51012dSAndre Muezerie #define IDXD_PMD_INFO(fmt, ...)   IDXD_PMD_LOG(INFO, fmt, ## __VA_ARGS__)
30*fd51012dSAndre Muezerie #define IDXD_PMD_ERR(fmt, ...)    IDXD_PMD_LOG(ERR, fmt, ## __VA_ARGS__)
31*fd51012dSAndre Muezerie #define IDXD_PMD_WARN(fmt, ...)   IDXD_PMD_LOG(WARNING, fmt, ## __VA_ARGS__)
32e33ad06eSKevin Laatz 
339449330aSKevin Laatz struct idxd_pci_common {
349449330aSKevin Laatz 	rte_spinlock_t lk;
359449330aSKevin Laatz 
369449330aSKevin Laatz 	uint8_t wq_cfg_sz;
37e12a0166STyler Retzlaff 	RTE_ATOMIC(uint16_t) ref_count;
389449330aSKevin Laatz 	volatile struct rte_idxd_bar0 *regs;
399449330aSKevin Laatz 	volatile uint32_t *wq_regs_base;
409449330aSKevin Laatz 	volatile struct rte_idxd_grpcfg *grp_regs;
419449330aSKevin Laatz 	volatile void *portals;
429449330aSKevin Laatz };
439449330aSKevin Laatz 
44e888bb12SKevin Laatz struct idxd_dmadev {
4582147042SKevin Laatz 	struct idxd_hw_desc *desc_ring;
4682147042SKevin Laatz 
47e888bb12SKevin Laatz 	/* counters to track the batches */
48e888bb12SKevin Laatz 	unsigned short max_batches;
49e888bb12SKevin Laatz 	unsigned short batch_idx_read;
50e888bb12SKevin Laatz 	unsigned short batch_idx_write;
51e888bb12SKevin Laatz 
52e888bb12SKevin Laatz 	/* track descriptors and handles */
53e888bb12SKevin Laatz 	unsigned short desc_ring_mask;
54e888bb12SKevin Laatz 	unsigned short ids_avail; /* handles for ops completed */
55e888bb12SKevin Laatz 	unsigned short ids_returned; /* the read pointer for hdls/desc rings */
56e888bb12SKevin Laatz 	unsigned short batch_start; /* start+size == write pointer for hdls/desc */
57e888bb12SKevin Laatz 	unsigned short batch_size;
58e888bb12SKevin Laatz 
59e888bb12SKevin Laatz 	void *portal; /* address to write the batch descriptor */
60e888bb12SKevin Laatz 
61e888bb12SKevin Laatz 	struct idxd_completion *batch_comp_ring;
62e888bb12SKevin Laatz 	unsigned short *batch_idx_ring; /* store where each batch ends */
63e888bb12SKevin Laatz 
64280c3ca0SKevin Laatz 	struct rte_dma_stats stats;
65280c3ca0SKevin Laatz 
66e888bb12SKevin Laatz 	rte_iova_t batch_iova; /* base address of the batch comp ring */
67e888bb12SKevin Laatz 	rte_iova_t desc_iova; /* base address of desc ring, needed for completions */
68e888bb12SKevin Laatz 
69e888bb12SKevin Laatz 	unsigned short max_batch_size;
70e888bb12SKevin Laatz 
71e888bb12SKevin Laatz 	struct rte_dma_dev *dmadev;
7282147042SKevin Laatz 	struct rte_dma_vchan_conf qcfg;
73e888bb12SKevin Laatz 	uint8_t sva_support;
74e888bb12SKevin Laatz 	uint8_t qid;
75e888bb12SKevin Laatz 
76e888bb12SKevin Laatz 	union {
77e888bb12SKevin Laatz 		struct {
78e888bb12SKevin Laatz 			unsigned int dsa_id;
79e888bb12SKevin Laatz 		} bus;
809449330aSKevin Laatz 
819449330aSKevin Laatz 		struct idxd_pci_common *pci;
82e888bb12SKevin Laatz 	} u;
83e888bb12SKevin Laatz };
84e888bb12SKevin Laatz 
8555dc0f60SKevin Laatz int idxd_dmadev_create(const char *name, struct rte_device *dev,
8655dc0f60SKevin Laatz 		const struct idxd_dmadev *base_idxd, const struct rte_dma_dev_ops *ops);
8782147042SKevin Laatz int idxd_dump(const struct rte_dma_dev *dev, FILE *f);
882f7d42c6SKevin Laatz int idxd_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *dev_conf,
892f7d42c6SKevin Laatz 		uint32_t conf_sz);
902f7d42c6SKevin Laatz int idxd_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
912f7d42c6SKevin Laatz 		const struct rte_dma_vchan_conf *qconf, uint32_t qconf_sz);
922f7d42c6SKevin Laatz int idxd_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info,
932f7d42c6SKevin Laatz 		uint32_t size);
943d36a0a1SKevin Laatz int idxd_enqueue_copy(void *dev_private, uint16_t qid, rte_iova_t src,
953d36a0a1SKevin Laatz 		rte_iova_t dst, unsigned int length, uint64_t flags);
963d36a0a1SKevin Laatz int idxd_enqueue_fill(void *dev_private, uint16_t qid, uint64_t pattern,
973d36a0a1SKevin Laatz 		rte_iova_t dst, unsigned int length, uint64_t flags);
983d36a0a1SKevin Laatz int idxd_submit(void *dev_private, uint16_t qid);
9997aeed56SKevin Laatz uint16_t idxd_completed(void *dev_private, uint16_t qid, uint16_t max_ops,
10097aeed56SKevin Laatz 		uint16_t *last_idx, bool *has_error);
10197aeed56SKevin Laatz uint16_t idxd_completed_status(void *dev_private, uint16_t qid __rte_unused,
10297aeed56SKevin Laatz 		uint16_t max_ops, uint16_t *last_idx,
10397aeed56SKevin Laatz 		enum rte_dma_status_code *status);
104280c3ca0SKevin Laatz int idxd_stats_get(const struct rte_dma_dev *dev, uint16_t vchan,
105280c3ca0SKevin Laatz 		struct rte_dma_stats *stats, uint32_t stats_sz);
106280c3ca0SKevin Laatz int idxd_stats_reset(struct rte_dma_dev *dev, uint16_t vchan);
1075a23df34SKevin Laatz int idxd_vchan_status(const struct rte_dma_dev *dev, uint16_t vchan,
1085a23df34SKevin Laatz 		enum rte_dma_vchan_status *status);
1099459de4eSKevin Laatz uint16_t idxd_burst_capacity(const void *dev_private, uint16_t vchan);
11055dc0f60SKevin Laatz 
111e33ad06eSKevin Laatz #endif /* _IDXD_INTERNAL_H_ */
112