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 */