xref: /linux/kernel/irq/kexec.c (revision f49040c7aaa5532a1f94355ef5073c49e6b32349)
1bad6722eSEliav Farber // SPDX-License-Identifier: GPL-2.0
2bad6722eSEliav Farber 
3bad6722eSEliav Farber #include <linux/interrupt.h>
4bad6722eSEliav Farber #include <linux/irq.h>
5bad6722eSEliav Farber #include <linux/irqdesc.h>
6bad6722eSEliav Farber #include <linux/irqnr.h>
7bad6722eSEliav Farber 
8bad6722eSEliav Farber #include "internals.h"
9bad6722eSEliav Farber 
machine_kexec_mask_interrupts(void)10bad6722eSEliav Farber void machine_kexec_mask_interrupts(void)
11bad6722eSEliav Farber {
12bad6722eSEliav Farber 	struct irq_desc *desc;
13bad6722eSEliav Farber 	unsigned int i;
14bad6722eSEliav Farber 
15bad6722eSEliav Farber 	for_each_irq_desc(i, desc) {
16bad6722eSEliav Farber 		struct irq_chip *chip;
17bad6722eSEliav Farber 		int check_eoi = 1;
18bad6722eSEliav Farber 
19bad6722eSEliav Farber 		chip = irq_desc_get_chip(desc);
20*b4706d81SEliav Farber 		if (!chip || !irqd_is_started(&desc->irq_data))
21bad6722eSEliav Farber 			continue;
22bad6722eSEliav Farber 
23bad6722eSEliav Farber 		if (IS_ENABLED(CONFIG_GENERIC_IRQ_KEXEC_CLEAR_VM_FORWARD)) {
24bad6722eSEliav Farber 			/*
25bad6722eSEliav Farber 			 * First try to remove the active state from an interrupt which is forwarded
26bad6722eSEliav Farber 			 * to a VM. If the interrupt is not forwarded, try to EOI the interrupt.
27bad6722eSEliav Farber 			 */
28bad6722eSEliav Farber 			check_eoi = irq_set_irqchip_state(i, IRQCHIP_STATE_ACTIVE, false);
29bad6722eSEliav Farber 		}
30bad6722eSEliav Farber 
31bad6722eSEliav Farber 		if (check_eoi && chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data))
32bad6722eSEliav Farber 			chip->irq_eoi(&desc->irq_data);
33bad6722eSEliav Farber 
34*b4706d81SEliav Farber 		irq_shutdown(desc);
35bad6722eSEliav Farber 	}
36bad6722eSEliav Farber }
37