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 Farbervoid 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