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