accel/ivpu: Move recovery work to system_unbound_wq
[drm/drm-misc.git] / drivers / dma / amd / qdma / qdma.h
blob94089f1f0c115f5c89b3ffc5f543f4694dd3ba15
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * DMA header for AMD Queue-based DMA Subsystem
5 * Copyright (C) 2023-2024, Advanced Micro Devices, Inc.
6 */
8 #ifndef __QDMA_H
9 #define __QDMA_H
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"
19 #define DISABLE 0
20 #define ENABLE 1
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 {
55 QDMA_REGF_IRQ_ENABLE,
56 QDMA_REGF_WBK_ENABLE,
57 QDMA_REGF_WBI_CHECK,
58 QDMA_REGF_IRQ_ARM,
59 QDMA_REGF_IRQ_VEC,
60 QDMA_REGF_IRQ_AGG,
61 QDMA_REGF_WBI_INTVL_ENABLE,
62 QDMA_REGF_MRKR_DISABLE,
63 QDMA_REGF_QUEUE_ENABLE,
64 QDMA_REGF_QUEUE_MODE,
65 QDMA_REGF_DESC_BASE,
66 QDMA_REGF_DESC_SIZE,
67 QDMA_REGF_RING_ID,
68 QDMA_REGF_CMD_INDX,
69 QDMA_REGF_CMD_CMD,
70 QDMA_REGF_CMD_TYPE,
71 QDMA_REGF_CMD_BUSY,
72 QDMA_REGF_QUEUE_COUNT,
73 QDMA_REGF_QUEUE_MAX,
74 QDMA_REGF_QUEUE_BASE,
75 QDMA_REGF_FUNCTION_ID,
76 QDMA_REGF_INTR_AGG_BASE,
77 QDMA_REGF_INTR_VECTOR,
78 QDMA_REGF_INTR_SIZE,
79 QDMA_REGF_INTR_VALID,
80 QDMA_REGF_INTR_COLOR,
81 QDMA_REGF_INTR_FUNCTION_ID,
82 QDMA_REGF_ERR_INT_FUNC,
83 QDMA_REGF_ERR_INT_VEC,
84 QDMA_REGF_ERR_INT_ARM,
85 QDMA_REGF_MAX
88 enum qdma_regs {
89 QDMA_REGO_CTXT_DATA,
90 QDMA_REGO_CTXT_CMD,
91 QDMA_REGO_CTXT_MASK,
92 QDMA_REGO_MM_H2C_CTRL,
93 QDMA_REGO_MM_C2H_CTRL,
94 QDMA_REGO_QUEUE_COUNT,
95 QDMA_REGO_RING_SIZE,
96 QDMA_REGO_H2C_PIDX,
97 QDMA_REGO_C2H_PIDX,
98 QDMA_REGO_INTR_CIDX,
99 QDMA_REGO_FUNC_ID,
100 QDMA_REGO_ERR_INT,
101 QDMA_REGO_ERR_STAT,
102 QDMA_REGO_MAX
105 struct qdma_reg_field {
106 u16 lsb; /* Least significant bit of field */
107 u16 msb; /* Most significant bit of field */
110 struct qdma_reg {
111 u32 off;
112 u32 count;
115 #define QDMA_REGF(_msb, _lsb) { \
116 .lsb = (_lsb), \
117 .msb = (_msb), \
120 #define QDMA_REGO(_off, _count) { \
121 .off = (_off), \
122 .count = (_count), \
125 enum qdma_desc_size {
126 QDMA_DESC_SIZE_8B,
127 QDMA_DESC_SIZE_16B,
128 QDMA_DESC_SIZE_32B,
129 QDMA_DESC_SIZE_64B,
132 enum qdma_queue_op_mode {
133 QDMA_QUEUE_OP_STREAM,
134 QDMA_QUEUE_OP_MM,
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,
144 QDMA_CTXT_WRB,
145 QDMA_CTXT_PFTCH,
146 QDMA_CTXT_INTR_COAL,
147 QDMA_CTXT_RSVD,
148 QDMA_CTXT_HOST_PROFILE,
149 QDMA_CTXT_TIMER,
150 QDMA_CTXT_FMAP,
151 QDMA_CTXT_FNC_STS,
154 enum qdma_ctxt_cmd {
155 QDMA_CTXT_CLEAR,
156 QDMA_CTXT_WRITE,
157 QDMA_CTXT_READ,
158 QDMA_CTXT_INVALIDATE,
159 QDMA_CTXT_MAX
162 struct qdma_ctxt_sw_desc {
163 u64 desc_base;
164 u16 vec;
167 struct qdma_ctxt_intr {
168 u64 agg_base;
169 u16 vec;
170 u32 size;
171 bool valid;
172 bool color;
175 struct qdma_ctxt_fmap {
176 u16 qbase;
177 u16 qmax;
180 struct qdma_device;
182 struct qdma_mm_desc {
183 __le64 src_addr;
184 __le32 len;
185 __le32 reserved1;
186 __le64 dst_addr;
187 __le64 reserved2;
188 } __packed;
190 struct qdma_mm_vdesc {
191 struct virt_dma_desc vdesc;
192 struct qdma_queue *queue;
193 struct scatterlist *sgl;
194 u64 sg_off;
195 u32 sg_len;
196 u64 dev_addr;
197 u32 pidx;
198 u32 pending_descs;
199 struct dma_slave_config cfg;
202 #define QDMA_VDESC_QUEUED(vdesc) (!(vdesc)->sg_len)
204 struct qdma_queue {
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;
213 u32 pidx_reg;
214 u32 cidx_reg;
215 u32 ring_size;
216 u32 idx_mask;
217 u16 qid;
218 u32 pidx;
219 u32 cidx;
222 struct qdma_intr_ring {
223 struct qdma_device *qdev;
224 __le64 *base;
225 dma_addr_t dev_base;
226 char msix_name[QDMA_INTR_NAME_MAX_LEN];
227 u32 msix_vector;
228 u16 msix_id;
229 u32 ring_size;
230 u16 ridx;
231 u16 cidx;
232 u8 color;
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)
244 struct qdma_device {
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;
254 u32 qintr_ring_num;
255 u32 qintr_ring_idx;
256 u32 chan_num;
257 u32 queue_irq_start;
258 u32 queue_irq_num;
259 u32 err_irq_idx;
260 u32 fid;
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 */