1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
3 #include <linux/init.h>
4 #include <linux/kernel.h>
5 #include <linux/module.h>
7 #include <linux/io-64-nonatomic-lo-hi.h>
8 #include <linux/dmaengine.h>
9 #include <uapi/linux/idxd.h>
10 #include "../dmaengine.h"
12 #include "registers.h"
16 IRQ_WORK_PROCESS_FAULT
,
20 struct work_struct work
;
22 struct idxd_device
*idxd
;
25 static int irq_process_work_list(struct idxd_irq_entry
*irq_entry
,
26 enum irq_work_type wtype
,
27 int *processed
, u64 data
);
28 static int irq_process_pending_llist(struct idxd_irq_entry
*irq_entry
,
29 enum irq_work_type wtype
,
30 int *processed
, u64 data
);
32 static void idxd_device_reinit(struct work_struct
*work
)
34 struct idxd_device
*idxd
= container_of(work
, struct idxd_device
, work
);
35 struct device
*dev
= &idxd
->pdev
->dev
;
38 idxd_device_reset(idxd
);
39 rc
= idxd_device_config(idxd
);
43 rc
= idxd_device_enable(idxd
);
47 for (i
= 0; i
< idxd
->max_wqs
; i
++) {
48 struct idxd_wq
*wq
= &idxd
->wqs
[i
];
50 if (wq
->state
== IDXD_WQ_ENABLED
) {
51 rc
= idxd_wq_enable(wq
);
53 dev_warn(dev
, "Unable to re-enable wq %s\n",
54 dev_name(&wq
->conf_dev
));
62 idxd_device_wqs_clear_state(idxd
);
65 static void idxd_device_fault_work(struct work_struct
*work
)
67 struct idxd_fault
*fault
= container_of(work
, struct idxd_fault
, work
);
68 struct idxd_irq_entry
*ie
;
71 int irqcnt
= fault
->idxd
->num_wq_irqs
+ 1;
73 for (i
= 1; i
< irqcnt
; i
++) {
74 ie
= &fault
->idxd
->irq_entries
[i
];
75 irq_process_work_list(ie
, IRQ_WORK_PROCESS_FAULT
,
76 &processed
, fault
->addr
);
80 irq_process_pending_llist(ie
, IRQ_WORK_PROCESS_FAULT
,
81 &processed
, fault
->addr
);
89 static int idxd_device_schedule_fault_process(struct idxd_device
*idxd
,
92 struct idxd_fault
*fault
;
94 fault
= kmalloc(sizeof(*fault
), GFP_ATOMIC
);
98 fault
->addr
= fault_addr
;
100 INIT_WORK(&fault
->work
, idxd_device_fault_work
);
101 queue_work(idxd
->wq
, &fault
->work
);
105 irqreturn_t
idxd_irq_handler(int vec
, void *data
)
107 struct idxd_irq_entry
*irq_entry
= data
;
108 struct idxd_device
*idxd
= irq_entry
->idxd
;
110 idxd_mask_msix_vector(idxd
, irq_entry
->id
);
111 return IRQ_WAKE_THREAD
;
114 irqreturn_t
idxd_misc_thread(int vec
, void *data
)
116 struct idxd_irq_entry
*irq_entry
= data
;
117 struct idxd_device
*idxd
= irq_entry
->idxd
;
118 struct device
*dev
= &idxd
->pdev
->dev
;
119 union gensts_reg gensts
;
124 cause
= ioread32(idxd
->reg_base
+ IDXD_INTCAUSE_OFFSET
);
125 iowrite32(cause
, idxd
->reg_base
+ IDXD_INTCAUSE_OFFSET
);
127 if (cause
& IDXD_INTC_ERR
) {
128 spin_lock_bh(&idxd
->dev_lock
);
129 for (i
= 0; i
< 4; i
++)
130 idxd
->sw_err
.bits
[i
] = ioread64(idxd
->reg_base
+
131 IDXD_SWERR_OFFSET
+ i
* sizeof(u64
));
132 iowrite64(IDXD_SWERR_ACK
, idxd
->reg_base
+ IDXD_SWERR_OFFSET
);
134 if (idxd
->sw_err
.valid
&& idxd
->sw_err
.wq_idx_valid
) {
135 int id
= idxd
->sw_err
.wq_idx
;
136 struct idxd_wq
*wq
= &idxd
->wqs
[id
];
138 if (wq
->type
== IDXD_WQT_USER
)
139 wake_up_interruptible(&wq
->idxd_cdev
.err_queue
);
143 for (i
= 0; i
< idxd
->max_wqs
; i
++) {
144 struct idxd_wq
*wq
= &idxd
->wqs
[i
];
146 if (wq
->type
== IDXD_WQT_USER
)
147 wake_up_interruptible(&wq
->idxd_cdev
.err_queue
);
151 spin_unlock_bh(&idxd
->dev_lock
);
152 val
|= IDXD_INTC_ERR
;
154 for (i
= 0; i
< 4; i
++)
155 dev_warn(dev
, "err[%d]: %#16.16llx\n",
156 i
, idxd
->sw_err
.bits
[i
]);
160 if (cause
& IDXD_INTC_CMD
) {
161 val
|= IDXD_INTC_CMD
;
162 complete(idxd
->cmd_done
);
165 if (cause
& IDXD_INTC_OCCUPY
) {
166 /* Driver does not utilize occupancy interrupt */
167 val
|= IDXD_INTC_OCCUPY
;
170 if (cause
& IDXD_INTC_PERFMON_OVFL
) {
172 * Driver does not utilize perfmon counter overflow interrupt
175 val
|= IDXD_INTC_PERFMON_OVFL
;
180 dev_warn_once(dev
, "Unexpected interrupt cause bits set: %#x\n",
187 * This case should rarely happen and typically is due to software
188 * programming error by the driver.
190 if (idxd
->sw_err
.valid
&&
191 idxd
->sw_err
.desc_valid
&&
192 idxd
->sw_err
.fault_addr
)
193 idxd_device_schedule_fault_process(idxd
, idxd
->sw_err
.fault_addr
);
195 gensts
.bits
= ioread32(idxd
->reg_base
+ IDXD_GENSTATS_OFFSET
);
196 if (gensts
.state
== IDXD_DEVICE_STATE_HALT
) {
197 idxd
->state
= IDXD_DEV_HALTED
;
198 if (gensts
.reset_type
== IDXD_DEVICE_RESET_SOFTWARE
) {
200 * If we need a software reset, we will throw the work
201 * on a system workqueue in order to allow interrupts
202 * for the device command completions.
204 INIT_WORK(&idxd
->work
, idxd_device_reinit
);
205 queue_work(idxd
->wq
, &idxd
->work
);
207 spin_lock_bh(&idxd
->dev_lock
);
208 idxd_device_wqs_clear_state(idxd
);
209 dev_err(&idxd
->pdev
->dev
,
210 "idxd halted, need %s.\n",
211 gensts
.reset_type
== IDXD_DEVICE_RESET_FLR
?
212 "FLR" : "system reset");
213 spin_unlock_bh(&idxd
->dev_lock
);
218 idxd_unmask_msix_vector(idxd
, irq_entry
->id
);
222 static bool process_fault(struct idxd_desc
*desc
, u64 fault_addr
)
225 * Completion address can be bad as well. Check fault address match for descriptor
226 * and completion address.
228 if ((u64
)desc
->hw
== fault_addr
||
229 (u64
)desc
->completion
== fault_addr
) {
230 idxd_dma_complete_txd(desc
, IDXD_COMPLETE_DEV_FAIL
);
237 static bool complete_desc(struct idxd_desc
*desc
)
239 if (desc
->completion
->status
) {
240 idxd_dma_complete_txd(desc
, IDXD_COMPLETE_NORMAL
);
247 static int irq_process_pending_llist(struct idxd_irq_entry
*irq_entry
,
248 enum irq_work_type wtype
,
249 int *processed
, u64 data
)
251 struct idxd_desc
*desc
, *t
;
252 struct llist_node
*head
;
254 bool completed
= false;
258 head
= llist_del_all(&irq_entry
->pending_llist
);
262 llist_for_each_entry_safe(desc
, t
, head
, llnode
) {
263 if (wtype
== IRQ_WORK_NORMAL
)
264 completed
= complete_desc(desc
);
265 else if (wtype
== IRQ_WORK_PROCESS_FAULT
)
266 completed
= process_fault(desc
, data
);
269 idxd_free_desc(desc
->wq
, desc
);
271 if (wtype
== IRQ_WORK_PROCESS_FAULT
)
274 spin_lock_irqsave(&irq_entry
->list_lock
, flags
);
275 list_add_tail(&desc
->list
,
276 &irq_entry
->work_list
);
277 spin_unlock_irqrestore(&irq_entry
->list_lock
, flags
);
286 static int irq_process_work_list(struct idxd_irq_entry
*irq_entry
,
287 enum irq_work_type wtype
,
288 int *processed
, u64 data
)
290 struct list_head
*node
, *next
;
292 bool completed
= false;
296 spin_lock_irqsave(&irq_entry
->list_lock
, flags
);
297 if (list_empty(&irq_entry
->work_list
))
300 list_for_each_safe(node
, next
, &irq_entry
->work_list
) {
301 struct idxd_desc
*desc
=
302 container_of(node
, struct idxd_desc
, list
);
304 spin_unlock_irqrestore(&irq_entry
->list_lock
, flags
);
305 if (wtype
== IRQ_WORK_NORMAL
)
306 completed
= complete_desc(desc
);
307 else if (wtype
== IRQ_WORK_PROCESS_FAULT
)
308 completed
= process_fault(desc
, data
);
311 spin_lock_irqsave(&irq_entry
->list_lock
, flags
);
312 list_del(&desc
->list
);
313 spin_unlock_irqrestore(&irq_entry
->list_lock
, flags
);
314 idxd_free_desc(desc
->wq
, desc
);
316 if (wtype
== IRQ_WORK_PROCESS_FAULT
)
321 spin_lock_irqsave(&irq_entry
->list_lock
, flags
);
325 spin_unlock_irqrestore(&irq_entry
->list_lock
, flags
);
329 static int idxd_desc_process(struct idxd_irq_entry
*irq_entry
)
331 int rc
, processed
, total
= 0;
334 * There are two lists we are processing. The pending_llist is where
335 * submmiter adds all the submitted descriptor after sending it to
336 * the workqueue. It's a lockless singly linked list. The work_list
337 * is the common linux double linked list. We are in a scenario of
338 * multiple producers and a single consumer. The producers are all
339 * the kernel submitters of descriptors, and the consumer is the
340 * kernel irq handler thread for the msix vector when using threaded
341 * irq. To work with the restrictions of llist to remain lockless,
342 * we are doing the following steps:
343 * 1. Iterate through the work_list and process any completed
344 * descriptor. Delete the completed entries during iteration.
345 * 2. llist_del_all() from the pending list.
346 * 3. Iterate through the llist that was deleted from the pending list
347 * and process the completed entries.
348 * 4. If the entry is still waiting on hardware, list_add_tail() to
350 * 5. Repeat until no more descriptors.
353 rc
= irq_process_work_list(irq_entry
, IRQ_WORK_NORMAL
,
359 rc
= irq_process_pending_llist(irq_entry
, IRQ_WORK_NORMAL
,
367 irqreturn_t
idxd_wq_thread(int irq
, void *data
)
369 struct idxd_irq_entry
*irq_entry
= data
;
372 processed
= idxd_desc_process(irq_entry
);
373 idxd_unmask_msix_vector(irq_entry
->idxd
, irq_entry
->id
);