1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * DMA header for AMD Queue-based DMA Subsystem
5 * Copyright (C) 2023-2024, Advanced Micro Devices, Inc.
11 #include <linux/bitfield.h>
12 #include <linux/dmaengine.h>
13 #include <linux/kernel.h>
14 #include <linux/platform_device.h>
15 #include <linux/regmap.h>
17 #include "../../virt-dma.h"
22 #define QDMA_MIN_IRQ 3
23 #define QDMA_INTR_NAME_MAX_LEN 30
24 #define QDMA_INTR_PREFIX "amd-qdma"
26 #define QDMA_IDENTIFIER 0x1FD3
27 #define QDMA_DEFAULT_RING_SIZE (BIT(10) + 1)
28 #define QDMA_DEFAULT_RING_ID 0
29 #define QDMA_POLL_INTRVL_US 10 /* 10us */
30 #define QDMA_POLL_TIMEOUT_US (500 * 1000) /* 500ms */
31 #define QDMA_DMAP_REG_STRIDE 16
32 #define QDMA_CTXT_REGMAP_LEN 8 /* 8 regs */
33 #define QDMA_MM_DESC_SIZE 32 /* Bytes */
34 #define QDMA_MM_DESC_LEN_BITS 28
35 #define QDMA_MM_DESC_MAX_LEN (BIT(QDMA_MM_DESC_LEN_BITS) - 1)
36 #define QDMA_MIN_DMA_ALLOC_SIZE 4096
37 #define QDMA_INTR_RING_SIZE BIT(13)
38 #define QDMA_INTR_RING_IDX_MASK GENMASK(9, 0)
39 #define QDMA_INTR_RING_BASE(_addr) ((_addr) >> 12)
41 #define QDMA_IDENTIFIER_REGOFF 0x0
42 #define QDMA_IDENTIFIER_MASK GENMASK(31, 16)
43 #define QDMA_QUEUE_ARM_BIT BIT(16)
45 #define qdma_err(qdev, fmt, args...) \
46 dev_err(&(qdev)->pdev->dev, fmt, ##args)
48 #define qdma_dbg(qdev, fmt, args...) \
49 dev_dbg(&(qdev)->pdev->dev, fmt, ##args)
51 #define qdma_info(qdev, fmt, args...) \
52 dev_info(&(qdev)->pdev->dev, fmt, ##args)
54 enum qdma_reg_fields {
61 QDMA_REGF_WBI_INTVL_ENABLE,
62 QDMA_REGF_MRKR_DISABLE,
63 QDMA_REGF_QUEUE_ENABLE,
72 QDMA_REGF_QUEUE_COUNT,
75 QDMA_REGF_FUNCTION_ID,
76 QDMA_REGF_INTR_AGG_BASE,
77 QDMA_REGF_INTR_VECTOR,
81 QDMA_REGF_INTR_FUNCTION_ID,
82 QDMA_REGF_ERR_INT_FUNC,
83 QDMA_REGF_ERR_INT_VEC,
84 QDMA_REGF_ERR_INT_ARM,
92 QDMA_REGO_MM_H2C_CTRL,
93 QDMA_REGO_MM_C2H_CTRL,
94 QDMA_REGO_QUEUE_COUNT,
105 struct qdma_reg_field {
106 u16 lsb; /* Least significant bit of field */
107 u16 msb; /* Most significant bit of field */
115 #define QDMA_REGF(_msb, _lsb) { \
120 #define QDMA_REGO(_off, _count) { \
125 enum qdma_desc_size {
132 enum qdma_queue_op_mode {
133 QDMA_QUEUE_OP_STREAM,
137 enum qdma_ctxt_type {
138 QDMA_CTXT_DESC_SW_C2H,
139 QDMA_CTXT_DESC_SW_H2C,
140 QDMA_CTXT_DESC_HW_C2H,
141 QDMA_CTXT_DESC_HW_H2C,
142 QDMA_CTXT_DESC_CR_C2H,
143 QDMA_CTXT_DESC_CR_H2C,
148 QDMA_CTXT_HOST_PROFILE,
158 QDMA_CTXT_INVALIDATE,
162 struct qdma_ctxt_sw_desc {
167 struct qdma_ctxt_intr {
175 struct qdma_ctxt_fmap {
182 struct qdma_mm_desc {
190 struct qdma_mm_vdesc {
191 struct virt_dma_desc vdesc;
192 struct qdma_queue *queue;
193 struct scatterlist *sgl;
199 struct dma_slave_config cfg;
202 #define QDMA_VDESC_QUEUED(vdesc) (!(vdesc)->sg_len)
205 struct qdma_device *qdev;
206 struct virt_dma_chan vchan;
207 enum dma_transfer_direction dir;
208 struct dma_slave_config cfg;
209 struct qdma_mm_desc *desc_base;
210 struct qdma_mm_vdesc *submitted_vdesc;
211 struct qdma_mm_vdesc *issued_vdesc;
212 dma_addr_t dma_desc_base;
222 struct qdma_intr_ring {
223 struct qdma_device *qdev;
226 char msix_name[QDMA_INTR_NAME_MAX_LEN];
235 #define QDMA_INTR_MASK_PIDX GENMASK_ULL(15, 0)
236 #define QDMA_INTR_MASK_CIDX GENMASK_ULL(31, 16)
237 #define QDMA_INTR_MASK_DESC_COLOR GENMASK_ULL(32, 32)
238 #define QDMA_INTR_MASK_STATE GENMASK_ULL(34, 33)
239 #define QDMA_INTR_MASK_ERROR GENMASK_ULL(36, 35)
240 #define QDMA_INTR_MASK_TYPE GENMASK_ULL(38, 38)
241 #define QDMA_INTR_MASK_QID GENMASK_ULL(62, 39)
242 #define QDMA_INTR_MASK_COLOR GENMASK_ULL(63, 63)
245 struct platform_device *pdev;
246 struct dma_device dma_dev;
247 struct regmap *regmap;
248 struct mutex ctxt_lock; /* protect ctxt registers */
249 const struct qdma_reg_field *rfields;
250 const struct qdma_reg *roffs;
251 struct qdma_queue *h2c_queues;
252 struct qdma_queue *c2h_queues;
253 struct qdma_intr_ring *qintr_rings;
263 extern const struct qdma_reg qdma_regos_default[QDMA_REGO_MAX];
264 extern const struct qdma_reg_field qdma_regfs_default[QDMA_REGF_MAX];
266 #endif /* __QDMA_H */