File tree Expand file tree Collapse file tree 9 files changed +35
-101
lines changed
Expand file tree Collapse file tree 9 files changed +35
-101
lines changed Original file line number Diff line number Diff line change @@ -127,29 +127,6 @@ void crash_smp_send_stop(void)
127127 cpus_stopped = 1 ;
128128}
129129
130- static void machine_kexec_mask_interrupts (void )
131- {
132- unsigned int i ;
133- struct irq_desc * desc ;
134-
135- for_each_irq_desc (i , desc ) {
136- struct irq_chip * chip ;
137-
138- chip = irq_desc_get_chip (desc );
139- if (!chip )
140- continue ;
141-
142- if (chip -> irq_eoi && irqd_irq_inprogress (& desc -> irq_data ))
143- chip -> irq_eoi (& desc -> irq_data );
144-
145- if (chip -> irq_mask )
146- chip -> irq_mask (& desc -> irq_data );
147-
148- if (chip -> irq_disable && !irqd_irq_disabled (& desc -> irq_data ))
149- chip -> irq_disable (& desc -> irq_data );
150- }
151- }
152-
153130void machine_crash_shutdown (struct pt_regs * regs )
154131{
155132 local_irq_disable ();
Original file line number Diff line number Diff line change @@ -207,37 +207,6 @@ void machine_kexec(struct kimage *kimage)
207207 BUG (); /* Should never get here. */
208208}
209209
210- static void machine_kexec_mask_interrupts (void )
211- {
212- unsigned int i ;
213- struct irq_desc * desc ;
214-
215- for_each_irq_desc (i , desc ) {
216- struct irq_chip * chip ;
217- int ret ;
218-
219- chip = irq_desc_get_chip (desc );
220- if (!chip )
221- continue ;
222-
223- /*
224- * First try to remove the active state. If this
225- * fails, try to EOI the interrupt.
226- */
227- ret = irq_set_irqchip_state (i , IRQCHIP_STATE_ACTIVE , false);
228-
229- if (ret && irqd_irq_inprogress (& desc -> irq_data ) &&
230- chip -> irq_eoi )
231- chip -> irq_eoi (& desc -> irq_data );
232-
233- if (chip -> irq_mask )
234- chip -> irq_mask (& desc -> irq_data );
235-
236- if (chip -> irq_disable && !irqd_irq_disabled (& desc -> irq_data ))
237- chip -> irq_disable (& desc -> irq_data );
238- }
239- }
240-
241210/**
242211 * machine_crash_shutdown - shutdown non-crashing cpus and save registers
243212 */
Original file line number Diff line number Diff line change @@ -61,7 +61,6 @@ struct pt_regs;
6161extern void kexec_smp_wait (void ); /* get and clear naca physid, wait for
6262 master to copy new code to 0 */
6363extern void default_machine_kexec (struct kimage * image );
64- extern void machine_kexec_mask_interrupts (void );
6564
6665void relocate_new_kernel (unsigned long indirection_page , unsigned long reboot_code_buffer ,
6766 unsigned long start_address ) __noreturn ;
Original file line number Diff line number Diff line change 2222#include <asm/setup.h>
2323#include <asm/firmware.h>
2424
25- void machine_kexec_mask_interrupts (void ) {
26- unsigned int i ;
27- struct irq_desc * desc ;
28-
29- for_each_irq_desc (i , desc ) {
30- struct irq_chip * chip ;
31-
32- chip = irq_desc_get_chip (desc );
33- if (!chip )
34- continue ;
35-
36- if (chip -> irq_eoi && irqd_irq_inprogress (& desc -> irq_data ))
37- chip -> irq_eoi (& desc -> irq_data );
38-
39- if (chip -> irq_mask )
40- chip -> irq_mask (& desc -> irq_data );
41-
42- if (chip -> irq_disable && !irqd_irq_disabled (& desc -> irq_data ))
43- chip -> irq_disable (& desc -> irq_data );
44- }
45- }
46-
4725#ifdef CONFIG_CRASH_DUMP
4826void machine_crash_shutdown (struct pt_regs * regs )
4927{
Original file line number Diff line number Diff line change @@ -114,29 +114,6 @@ void machine_shutdown(void)
114114#endif
115115}
116116
117- static void machine_kexec_mask_interrupts (void )
118- {
119- unsigned int i ;
120- struct irq_desc * desc ;
121-
122- for_each_irq_desc (i , desc ) {
123- struct irq_chip * chip ;
124-
125- chip = irq_desc_get_chip (desc );
126- if (!chip )
127- continue ;
128-
129- if (chip -> irq_eoi && irqd_irq_inprogress (& desc -> irq_data ))
130- chip -> irq_eoi (& desc -> irq_data );
131-
132- if (chip -> irq_mask )
133- chip -> irq_mask (& desc -> irq_data );
134-
135- if (chip -> irq_disable && !irqd_irq_disabled (& desc -> irq_data ))
136- chip -> irq_disable (& desc -> irq_data );
137- }
138- }
139-
140117/*
141118 * machine_crash_shutdown - Prepare to kexec after a kernel crash
142119 *
Original file line number Diff line number Diff line change @@ -694,6 +694,9 @@ extern int irq_chip_request_resources_parent(struct irq_data *data);
694694extern void irq_chip_release_resources_parent (struct irq_data * data );
695695#endif
696696
697+ /* Shut down the interrupt */
698+ extern void irq_shutdown (struct irq_desc * desc );
699+
697700/* Handling of unhandled and spurious interrupts: */
698701extern void note_interrupt (struct irq_desc * desc , irqreturn_t action_ret );
699702
Original file line number Diff line number Diff line change @@ -375,6 +375,8 @@ extern void machine_kexec(struct kimage *image);
375375extern int machine_kexec_prepare (struct kimage * image );
376376extern void machine_kexec_cleanup (struct kimage * image );
377377extern int kernel_kexec (void );
378+ extern void machine_kexec_mask_interrupts (void );
379+
378380extern struct page * kimage_alloc_control_pages (struct kimage * image ,
379381 unsigned int order );
380382
Original file line number Diff line number Diff line change @@ -88,7 +88,6 @@ extern int irq_activate(struct irq_desc *desc);
8888extern int irq_activate_and_startup (struct irq_desc * desc , bool resend );
8989extern int irq_startup (struct irq_desc * desc , bool resend , bool force );
9090
91- extern void irq_shutdown (struct irq_desc * desc );
9291extern void irq_shutdown_and_deactivate (struct irq_desc * desc );
9392extern void irq_enable (struct irq_desc * desc );
9493extern void irq_disable (struct irq_desc * desc );
Original file line number Diff line number Diff line change 4040#include <linux/hugetlb.h>
4141#include <linux/objtool.h>
4242#include <linux/kmsg_dump.h>
43+ #include <linux/irqdesc.h>
44+ #include <linux/irq.h>
4345
4446#include <asm/page.h>
4547#include <asm/sections.h>
@@ -1072,3 +1074,31 @@ int kernel_kexec(void)
10721074 kexec_unlock ();
10731075 return error ;
10741076}
1077+
1078+ void machine_kexec_mask_interrupts (void )
1079+ {
1080+ unsigned int i ;
1081+ struct irq_desc * desc ;
1082+
1083+ for_each_irq_desc (i , desc ) {
1084+ struct irq_chip * chip ;
1085+ int check_eoi = 1 ;
1086+
1087+ chip = irq_desc_get_chip (desc );
1088+ if (!chip || !irqd_is_started (& desc -> irq_data ))
1089+ continue ;
1090+
1091+ if (IS_ENABLED (CONFIG_ARM64 )) {
1092+ /*
1093+ * First try to remove the active state. If this fails, try to EOI the
1094+ * interrupt.
1095+ */
1096+ check_eoi = irq_set_irqchip_state (i , IRQCHIP_STATE_ACTIVE , false);
1097+ }
1098+
1099+ if (check_eoi && chip -> irq_eoi && irqd_irq_inprogress (& desc -> irq_data ))
1100+ chip -> irq_eoi (& desc -> irq_data );
1101+
1102+ irq_shutdown (desc );
1103+ }
1104+ }
You can’t perform that action at this time.
0 commit comments