File tree 9 files changed +35
-101
lines changed
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)
127
127
cpus_stopped = 1 ;
128
128
}
129
129
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
-
153
130
void machine_crash_shutdown (struct pt_regs * regs )
154
131
{
155
132
local_irq_disable ();
Original file line number Diff line number Diff line change @@ -207,37 +207,6 @@ void machine_kexec(struct kimage *kimage)
207
207
BUG (); /* Should never get here. */
208
208
}
209
209
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
-
241
210
/**
242
211
* machine_crash_shutdown - shutdown non-crashing cpus and save registers
243
212
*/
Original file line number Diff line number Diff line change @@ -61,7 +61,6 @@ struct pt_regs;
61
61
extern void kexec_smp_wait (void ); /* get and clear naca physid, wait for
62
62
master to copy new code to 0 */
63
63
extern void default_machine_kexec (struct kimage * image );
64
- extern void machine_kexec_mask_interrupts (void );
65
64
66
65
void relocate_new_kernel (unsigned long indirection_page , unsigned long reboot_code_buffer ,
67
66
unsigned long start_address ) __noreturn ;
Original file line number Diff line number Diff line change 22
22
#include <asm/setup.h>
23
23
#include <asm/firmware.h>
24
24
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
-
47
25
#ifdef CONFIG_CRASH_DUMP
48
26
void machine_crash_shutdown (struct pt_regs * regs )
49
27
{
Original file line number Diff line number Diff line change @@ -114,29 +114,6 @@ void machine_shutdown(void)
114
114
#endif
115
115
}
116
116
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
-
140
117
/*
141
118
* machine_crash_shutdown - Prepare to kexec after a kernel crash
142
119
*
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);
694
694
extern void irq_chip_release_resources_parent (struct irq_data * data );
695
695
#endif
696
696
697
+ /* Shut down the interrupt */
698
+ extern void irq_shutdown (struct irq_desc * desc );
699
+
697
700
/* Handling of unhandled and spurious interrupts: */
698
701
extern void note_interrupt (struct irq_desc * desc , irqreturn_t action_ret );
699
702
Original file line number Diff line number Diff line change @@ -375,6 +375,8 @@ extern void machine_kexec(struct kimage *image);
375
375
extern int machine_kexec_prepare (struct kimage * image );
376
376
extern void machine_kexec_cleanup (struct kimage * image );
377
377
extern int kernel_kexec (void );
378
+ extern void machine_kexec_mask_interrupts (void );
379
+
378
380
extern struct page * kimage_alloc_control_pages (struct kimage * image ,
379
381
unsigned int order );
380
382
Original file line number Diff line number Diff line change @@ -88,7 +88,6 @@ extern int irq_activate(struct irq_desc *desc);
88
88
extern int irq_activate_and_startup (struct irq_desc * desc , bool resend );
89
89
extern int irq_startup (struct irq_desc * desc , bool resend , bool force );
90
90
91
- extern void irq_shutdown (struct irq_desc * desc );
92
91
extern void irq_shutdown_and_deactivate (struct irq_desc * desc );
93
92
extern void irq_enable (struct irq_desc * desc );
94
93
extern void irq_disable (struct irq_desc * desc );
Original file line number Diff line number Diff line change 40
40
#include <linux/hugetlb.h>
41
41
#include <linux/objtool.h>
42
42
#include <linux/kmsg_dump.h>
43
+ #include <linux/irqdesc.h>
44
+ #include <linux/irq.h>
43
45
44
46
#include <asm/page.h>
45
47
#include <asm/sections.h>
@@ -1072,3 +1074,31 @@ int kernel_kexec(void)
1072
1074
kexec_unlock ();
1073
1075
return error ;
1074
1076
}
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