xref: /linux/drivers/dma/idxd/irq.c (revision 60684c2bd35064043360e6f716d1b7c20e967b7d)
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>
6 #include <linux/pci.h>
7 #include <linux/io-64-nonatomic-lo-hi.h>
8 #include <linux/dmaengine.h>
9 #include <linux/delay.h>
10 #include <uapi/linux/idxd.h>
11 #include "../dmaengine.h"
12 #include "idxd.h"
13 #include "registers.h"
14 
15 enum irq_work_type {
16 	IRQ_WORK_NORMAL = 0,
17 	IRQ_WORK_PROCESS_FAULT,
18 };
19 
20 struct idxd_resubmit {
21 	struct work_struct work;
22 	struct idxd_desc *desc;
23 };
24 
25 struct idxd_int_handle_revoke {
26 	struct work_struct work;
27 	struct idxd_device *idxd;
28 };
29 
30 static void idxd_device_reinit(struct work_struct *work)
31 {
32 	struct idxd_device *idxd = container_of(work, struct idxd_device, work);
33 	struct device *dev = &idxd->pdev->dev;
34 	int rc, i;
35 
36 	idxd_device_reset(idxd);
37 	rc = idxd_device_config(idxd);
38 	if (rc < 0)
39 		goto out;
40 
41 	rc = idxd_device_enable(idxd);
42 	if (rc < 0)
43 		goto out;
44 
45 	for (i = 0; i < idxd->max_wqs; i++) {
46 		if (test_bit(i, idxd->wq_enable_map)) {
47 			struct idxd_wq *wq = idxd->wqs[i];
48 
49 			rc = idxd_wq_enable(wq);
50 			if (rc < 0) {
51 				clear_bit(i, idxd->wq_enable_map);
52 				dev_warn(dev, "Unable to re-enable wq %s\n",
53 					 dev_name(wq_confdev(wq)));
54 			}
55 		}
56 	}
57 
58 	return;
59 
60  out:
61 	idxd_device_clear_state(idxd);
62 }
63 
64 /*
65  * The function sends a drain descriptor for the interrupt handle. The drain ensures
66  * all descriptors with this interrupt handle is flushed and the interrupt
67  * will allow the cleanup of the outstanding descriptors.
68  */
69 static void idxd_int_handle_revoke_drain(struct idxd_irq_entry *ie)
70 {
71 	struct idxd_wq *wq = ie_to_wq(ie);
72 	struct idxd_device *idxd = wq->idxd;
73 	struct device *dev = &idxd->pdev->dev;
74 	struct dsa_hw_desc desc = {};
75 	void __iomem *portal;
76 	int rc;
77 
78 	/* Issue a simple drain operation with interrupt but no completion record */
79 	desc.flags = IDXD_OP_FLAG_RCI;
80 	desc.opcode = DSA_OPCODE_DRAIN;
81 	desc.priv = 1;
82 
83 	if (ie->pasid != INVALID_IOASID)
84 		desc.pasid = ie->pasid;
85 	desc.int_handle = ie->int_handle;
86 	portal = idxd_wq_portal_addr(wq);
87 
88 	/*
89 	 * The wmb() makes sure that the descriptor is all there before we
90 	 * issue.
91 	 */
92 	wmb();
93 	if (wq_dedicated(wq)) {
94 		iosubmit_cmds512(portal, &desc, 1);
95 	} else {
96 		rc = idxd_enqcmds(wq, portal, &desc);
97 		/* This should not fail unless hardware failed. */
98 		if (rc < 0)
99 			dev_warn(dev, "Failed to submit drain desc on wq %d\n", wq->id);
100 	}
101 }
102 
103 static void idxd_abort_invalid_int_handle_descs(struct idxd_irq_entry *ie)
104 {
105 	LIST_HEAD(flist);
106 	struct idxd_desc *d, *t;
107 	struct llist_node *head;
108 
109 	spin_lock(&ie->list_lock);
110 	head = llist_del_all(&ie->pending_llist);
111 	if (head) {
112 		llist_for_each_entry_safe(d, t, head, llnode)
113 			list_add_tail(&d->list, &ie->work_list);
114 	}
115 
116 	list_for_each_entry_safe(d, t, &ie->work_list, list) {
117 		if (d->completion->status == DSA_COMP_INT_HANDLE_INVAL)
118 			list_move_tail(&d->list, &flist);
119 	}
120 	spin_unlock(&ie->list_lock);
121 
122 	list_for_each_entry_safe(d, t, &flist, list) {
123 		list_del(&d->list);
124 		idxd_dma_complete_txd(d, IDXD_COMPLETE_ABORT, true);
125 	}
126 }
127 
128 static void idxd_int_handle_revoke(struct work_struct *work)
129 {
130 	struct idxd_int_handle_revoke *revoke =
131 		container_of(work, struct idxd_int_handle_revoke, work);
132 	struct idxd_device *idxd = revoke->idxd;
133 	struct pci_dev *pdev = idxd->pdev;
134 	struct device *dev = &pdev->dev;
135 	int i, new_handle, rc;
136 
137 	if (!idxd->request_int_handles) {
138 		kfree(revoke);
139 		dev_warn(dev, "Unexpected int handle refresh interrupt.\n");
140 		return;
141 	}
142 
143 	/*
144 	 * The loop attempts to acquire new interrupt handle for all interrupt
145 	 * vectors that supports a handle. If a new interrupt handle is acquired and the
146 	 * wq is kernel type, the driver will kill the percpu_ref to pause all
147 	 * ongoing descriptor submissions. The interrupt handle is then changed.
148 	 * After change, the percpu_ref is revived and all the pending submissions
149 	 * are woken to try again. A drain is sent to for the interrupt handle
150 	 * at the end to make sure all invalid int handle descriptors are processed.
151 	 */
152 	for (i = 1; i < idxd->irq_cnt; i++) {
153 		struct idxd_irq_entry *ie = idxd_get_ie(idxd, i);
154 		struct idxd_wq *wq = ie_to_wq(ie);
155 
156 		if (ie->int_handle == INVALID_INT_HANDLE)
157 			continue;
158 
159 		rc = idxd_device_request_int_handle(idxd, i, &new_handle, IDXD_IRQ_MSIX);
160 		if (rc < 0) {
161 			dev_warn(dev, "get int handle %d failed: %d\n", i, rc);
162 			/*
163 			 * Failed to acquire new interrupt handle. Kill the WQ
164 			 * and release all the pending submitters. The submitters will
165 			 * get error return code and handle appropriately.
166 			 */
167 			ie->int_handle = INVALID_INT_HANDLE;
168 			idxd_wq_quiesce(wq);
169 			idxd_abort_invalid_int_handle_descs(ie);
170 			continue;
171 		}
172 
173 		/* No change in interrupt handle, nothing needs to be done */
174 		if (ie->int_handle == new_handle)
175 			continue;
176 
177 		if (wq->state != IDXD_WQ_ENABLED || wq->type != IDXD_WQT_KERNEL) {
178 			/*
179 			 * All the MSIX interrupts are allocated at once during probe.
180 			 * Therefore we need to update all interrupts even if the WQ
181 			 * isn't supporting interrupt operations.
182 			 */
183 			ie->int_handle = new_handle;
184 			continue;
185 		}
186 
187 		mutex_lock(&wq->wq_lock);
188 		reinit_completion(&wq->wq_resurrect);
189 
190 		/* Kill percpu_ref to pause additional descriptor submissions */
191 		percpu_ref_kill(&wq->wq_active);
192 
193 		/* Wait for all submitters quiesce before we change interrupt handle */
194 		wait_for_completion(&wq->wq_dead);
195 
196 		ie->int_handle = new_handle;
197 
198 		/* Revive percpu ref and wake up all the waiting submitters */
199 		percpu_ref_reinit(&wq->wq_active);
200 		complete_all(&wq->wq_resurrect);
201 		mutex_unlock(&wq->wq_lock);
202 
203 		/*
204 		 * The delay here is to wait for all possible MOVDIR64B that
205 		 * are issued before percpu_ref_kill() has happened to have
206 		 * reached the PCIe domain before the drain is issued. The driver
207 		 * needs to ensure that the drain descriptor issued does not pass
208 		 * all the other issued descriptors that contain the invalid
209 		 * interrupt handle in order to ensure that the drain descriptor
210 		 * interrupt will allow the cleanup of all the descriptors with
211 		 * invalid interrupt handle.
212 		 */
213 		if (wq_dedicated(wq))
214 			udelay(100);
215 		idxd_int_handle_revoke_drain(ie);
216 	}
217 	kfree(revoke);
218 }
219 
220 static int process_misc_interrupts(struct idxd_device *idxd, u32 cause)
221 {
222 	struct device *dev = &idxd->pdev->dev;
223 	union gensts_reg gensts;
224 	u32 val = 0;
225 	int i;
226 	bool err = false;
227 
228 	if (cause & IDXD_INTC_HALT_STATE)
229 		goto halt;
230 
231 	if (cause & IDXD_INTC_ERR) {
232 		spin_lock(&idxd->dev_lock);
233 		for (i = 0; i < 4; i++)
234 			idxd->sw_err.bits[i] = ioread64(idxd->reg_base +
235 					IDXD_SWERR_OFFSET + i * sizeof(u64));
236 
237 		iowrite64(idxd->sw_err.bits[0] & IDXD_SWERR_ACK,
238 			  idxd->reg_base + IDXD_SWERR_OFFSET);
239 
240 		if (idxd->sw_err.valid && idxd->sw_err.wq_idx_valid) {
241 			int id = idxd->sw_err.wq_idx;
242 			struct idxd_wq *wq = idxd->wqs[id];
243 
244 			if (wq->type == IDXD_WQT_USER)
245 				wake_up_interruptible(&wq->err_queue);
246 		} else {
247 			int i;
248 
249 			for (i = 0; i < idxd->max_wqs; i++) {
250 				struct idxd_wq *wq = idxd->wqs[i];
251 
252 				if (wq->type == IDXD_WQT_USER)
253 					wake_up_interruptible(&wq->err_queue);
254 			}
255 		}
256 
257 		spin_unlock(&idxd->dev_lock);
258 		val |= IDXD_INTC_ERR;
259 
260 		for (i = 0; i < 4; i++)
261 			dev_warn(dev, "err[%d]: %#16.16llx\n",
262 				 i, idxd->sw_err.bits[i]);
263 		err = true;
264 	}
265 
266 	if (cause & IDXD_INTC_INT_HANDLE_REVOKED) {
267 		struct idxd_int_handle_revoke *revoke;
268 
269 		val |= IDXD_INTC_INT_HANDLE_REVOKED;
270 
271 		revoke = kzalloc(sizeof(*revoke), GFP_ATOMIC);
272 		if (revoke) {
273 			revoke->idxd = idxd;
274 			INIT_WORK(&revoke->work, idxd_int_handle_revoke);
275 			queue_work(idxd->wq, &revoke->work);
276 
277 		} else {
278 			dev_err(dev, "Failed to allocate work for int handle revoke\n");
279 			idxd_wqs_quiesce(idxd);
280 		}
281 	}
282 
283 	if (cause & IDXD_INTC_CMD) {
284 		val |= IDXD_INTC_CMD;
285 		complete(idxd->cmd_done);
286 	}
287 
288 	if (cause & IDXD_INTC_OCCUPY) {
289 		/* Driver does not utilize occupancy interrupt */
290 		val |= IDXD_INTC_OCCUPY;
291 	}
292 
293 	if (cause & IDXD_INTC_PERFMON_OVFL) {
294 		val |= IDXD_INTC_PERFMON_OVFL;
295 		perfmon_counter_overflow(idxd);
296 	}
297 
298 	val ^= cause;
299 	if (val)
300 		dev_warn_once(dev, "Unexpected interrupt cause bits set: %#x\n",
301 			      val);
302 
303 	if (!err)
304 		return 0;
305 
306 halt:
307 	gensts.bits = ioread32(idxd->reg_base + IDXD_GENSTATS_OFFSET);
308 	if (gensts.state == IDXD_DEVICE_STATE_HALT) {
309 		idxd->state = IDXD_DEV_HALTED;
310 		if (gensts.reset_type == IDXD_DEVICE_RESET_SOFTWARE) {
311 			/*
312 			 * If we need a software reset, we will throw the work
313 			 * on a system workqueue in order to allow interrupts
314 			 * for the device command completions.
315 			 */
316 			INIT_WORK(&idxd->work, idxd_device_reinit);
317 			queue_work(idxd->wq, &idxd->work);
318 		} else {
319 			idxd->state = IDXD_DEV_HALTED;
320 			idxd_wqs_quiesce(idxd);
321 			idxd_wqs_unmap_portal(idxd);
322 			idxd_device_clear_state(idxd);
323 			dev_err(&idxd->pdev->dev,
324 				"idxd halted, need %s.\n",
325 				gensts.reset_type == IDXD_DEVICE_RESET_FLR ?
326 				"FLR" : "system reset");
327 			return -ENXIO;
328 		}
329 	}
330 
331 	return 0;
332 }
333 
334 irqreturn_t idxd_misc_thread(int vec, void *data)
335 {
336 	struct idxd_irq_entry *irq_entry = data;
337 	struct idxd_device *idxd = ie_to_idxd(irq_entry);
338 	int rc;
339 	u32 cause;
340 
341 	cause = ioread32(idxd->reg_base + IDXD_INTCAUSE_OFFSET);
342 	if (cause)
343 		iowrite32(cause, idxd->reg_base + IDXD_INTCAUSE_OFFSET);
344 
345 	while (cause) {
346 		rc = process_misc_interrupts(idxd, cause);
347 		if (rc < 0)
348 			break;
349 		cause = ioread32(idxd->reg_base + IDXD_INTCAUSE_OFFSET);
350 		if (cause)
351 			iowrite32(cause, idxd->reg_base + IDXD_INTCAUSE_OFFSET);
352 	}
353 
354 	return IRQ_HANDLED;
355 }
356 
357 static void idxd_int_handle_resubmit_work(struct work_struct *work)
358 {
359 	struct idxd_resubmit *irw = container_of(work, struct idxd_resubmit, work);
360 	struct idxd_desc *desc = irw->desc;
361 	struct idxd_wq *wq = desc->wq;
362 	int rc;
363 
364 	desc->completion->status = 0;
365 	rc = idxd_submit_desc(wq, desc);
366 	if (rc < 0) {
367 		dev_dbg(&wq->idxd->pdev->dev, "Failed to resubmit desc %d to wq %d.\n",
368 			desc->id, wq->id);
369 		/*
370 		 * If the error is not -EAGAIN, it means the submission failed due to wq
371 		 * has been killed instead of ENQCMDS failure. Here the driver needs to
372 		 * notify the submitter of the failure by reporting abort status.
373 		 *
374 		 * -EAGAIN comes from ENQCMDS failure. idxd_submit_desc() will handle the
375 		 * abort.
376 		 */
377 		if (rc != -EAGAIN) {
378 			desc->completion->status = IDXD_COMP_DESC_ABORT;
379 			idxd_dma_complete_txd(desc, IDXD_COMPLETE_ABORT, false);
380 		}
381 		idxd_free_desc(wq, desc);
382 	}
383 	kfree(irw);
384 }
385 
386 bool idxd_queue_int_handle_resubmit(struct idxd_desc *desc)
387 {
388 	struct idxd_wq *wq = desc->wq;
389 	struct idxd_device *idxd = wq->idxd;
390 	struct idxd_resubmit *irw;
391 
392 	irw = kzalloc(sizeof(*irw), GFP_KERNEL);
393 	if (!irw)
394 		return false;
395 
396 	irw->desc = desc;
397 	INIT_WORK(&irw->work, idxd_int_handle_resubmit_work);
398 	queue_work(idxd->wq, &irw->work);
399 	return true;
400 }
401 
402 static void irq_process_pending_llist(struct idxd_irq_entry *irq_entry)
403 {
404 	struct idxd_desc *desc, *t;
405 	struct llist_node *head;
406 
407 	head = llist_del_all(&irq_entry->pending_llist);
408 	if (!head)
409 		return;
410 
411 	llist_for_each_entry_safe(desc, t, head, llnode) {
412 		u8 status = desc->completion->status & DSA_COMP_STATUS_MASK;
413 
414 		if (status) {
415 			/*
416 			 * Check against the original status as ABORT is software defined
417 			 * and 0xff, which DSA_COMP_STATUS_MASK can mask out.
418 			 */
419 			if (unlikely(desc->completion->status == IDXD_COMP_DESC_ABORT)) {
420 				idxd_dma_complete_txd(desc, IDXD_COMPLETE_ABORT, true);
421 				continue;
422 			}
423 
424 			idxd_dma_complete_txd(desc, IDXD_COMPLETE_NORMAL, true);
425 		} else {
426 			spin_lock(&irq_entry->list_lock);
427 			list_add_tail(&desc->list,
428 				      &irq_entry->work_list);
429 			spin_unlock(&irq_entry->list_lock);
430 		}
431 	}
432 }
433 
434 static void irq_process_work_list(struct idxd_irq_entry *irq_entry)
435 {
436 	LIST_HEAD(flist);
437 	struct idxd_desc *desc, *n;
438 
439 	/*
440 	 * This lock protects list corruption from access of list outside of the irq handler
441 	 * thread.
442 	 */
443 	spin_lock(&irq_entry->list_lock);
444 	if (list_empty(&irq_entry->work_list)) {
445 		spin_unlock(&irq_entry->list_lock);
446 		return;
447 	}
448 
449 	list_for_each_entry_safe(desc, n, &irq_entry->work_list, list) {
450 		if (desc->completion->status) {
451 			list_move_tail(&desc->list, &flist);
452 		}
453 	}
454 
455 	spin_unlock(&irq_entry->list_lock);
456 
457 	list_for_each_entry(desc, &flist, list) {
458 		/*
459 		 * Check against the original status as ABORT is software defined
460 		 * and 0xff, which DSA_COMP_STATUS_MASK can mask out.
461 		 */
462 		if (unlikely(desc->completion->status == IDXD_COMP_DESC_ABORT)) {
463 			idxd_dma_complete_txd(desc, IDXD_COMPLETE_ABORT, true);
464 			continue;
465 		}
466 
467 		idxd_dma_complete_txd(desc, IDXD_COMPLETE_NORMAL, true);
468 	}
469 }
470 
471 irqreturn_t idxd_wq_thread(int irq, void *data)
472 {
473 	struct idxd_irq_entry *irq_entry = data;
474 
475 	/*
476 	 * There are two lists we are processing. The pending_llist is where
477 	 * submmiter adds all the submitted descriptor after sending it to
478 	 * the workqueue. It's a lockless singly linked list. The work_list
479 	 * is the common linux double linked list. We are in a scenario of
480 	 * multiple producers and a single consumer. The producers are all
481 	 * the kernel submitters of descriptors, and the consumer is the
482 	 * kernel irq handler thread for the msix vector when using threaded
483 	 * irq. To work with the restrictions of llist to remain lockless,
484 	 * we are doing the following steps:
485 	 * 1. Iterate through the work_list and process any completed
486 	 *    descriptor. Delete the completed entries during iteration.
487 	 * 2. llist_del_all() from the pending list.
488 	 * 3. Iterate through the llist that was deleted from the pending list
489 	 *    and process the completed entries.
490 	 * 4. If the entry is still waiting on hardware, list_add_tail() to
491 	 *    the work_list.
492 	 */
493 	irq_process_work_list(irq_entry);
494 	irq_process_pending_llist(irq_entry);
495 
496 	return IRQ_HANDLED;
497 }
498