Lines Matching +full:ext +full:- +full:regs
1 // SPDX-License-Identifier: GPL-2.0
24 #include <linux/entry-common.h>
56 {.irq = EXT_INTERRUPT, .name = "EXT"},
67 {.irq = IRQEXT_CLK, .name = "CLK", .desc = "[EXT] Clock Comparator"},
68 {.irq = IRQEXT_EXC, .name = "EXC", .desc = "[EXT] External Call"},
69 {.irq = IRQEXT_EMS, .name = "EMS", .desc = "[EXT] Emergency Signal"},
70 {.irq = IRQEXT_TMR, .name = "TMR", .desc = "[EXT] CPU Timer"},
71 {.irq = IRQEXT_TLA, .name = "TAL", .desc = "[EXT] Timing Alert"},
72 {.irq = IRQEXT_PFL, .name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
73 {.irq = IRQEXT_DSD, .name = "DSD", .desc = "[EXT] DASD Diag"},
74 {.irq = IRQEXT_VRT, .name = "VRT", .desc = "[EXT] Virtio"},
75 {.irq = IRQEXT_SCP, .name = "SCP", .desc = "[EXT] Service Call"},
76 {.irq = IRQEXT_IUC, .name = "IUC", .desc = "[EXT] IUCV"},
77 {.irq = IRQEXT_CMS, .name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
78 {.irq = IRQEXT_CMC, .name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
79 {.irq = IRQEXT_FTP, .name = "FTP", .desc = "[EXT] HMC FTP Service"},
80 {.irq = IRQEXT_WTI, .name = "WTI", .desc = "[EXT] Warning Track"},
103 static void do_IRQ(struct pt_regs *regs, int irq) in do_IRQ() argument
105 if (tod_after_eq(get_lowcore()->int_clock, in do_IRQ()
106 get_lowcore()->clock_comparator)) in do_IRQ()
116 return ((get_lowcore()->async_stack ^ frame) & ~(THREAD_SIZE - 1)) == 0; in on_async_stack()
119 static void do_irq_async(struct pt_regs *regs, int irq) in do_irq_async() argument
122 do_IRQ(regs, irq); in do_irq_async()
124 call_on_stack(2, get_lowcore()->async_stack, void, do_IRQ, in do_irq_async()
125 struct pt_regs *, regs, int, irq); in do_irq_async()
129 static int irq_pending(struct pt_regs *regs) in irq_pending() argument
142 void noinstr do_io_irq(struct pt_regs *regs) in do_io_irq() argument
144 irqentry_state_t state = irqentry_enter(regs); in do_io_irq()
145 struct pt_regs *old_regs = set_irq_regs(regs); in do_io_irq()
150 if (user_mode(regs)) { in do_io_irq()
153 current->thread.last_break = regs->last_break; in do_io_irq()
162 regs->tpi_info = get_lowcore()->tpi_info; in do_io_irq()
163 if (get_lowcore()->tpi_info.adapter_IO) in do_io_irq()
164 do_irq_async(regs, THIN_INTERRUPT); in do_io_irq()
166 do_irq_async(regs, IO_INTERRUPT); in do_io_irq()
167 } while (MACHINE_IS_LPAR && irq_pending(regs)); in do_io_irq()
172 irqentry_exit(regs, state); in do_io_irq()
175 regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT); in do_io_irq()
178 void noinstr do_ext_irq(struct pt_regs *regs) in do_ext_irq() argument
180 irqentry_state_t state = irqentry_enter(regs); in do_ext_irq()
181 struct pt_regs *old_regs = set_irq_regs(regs); in do_ext_irq()
186 if (user_mode(regs)) { in do_ext_irq()
189 current->thread.last_break = regs->last_break; in do_ext_irq()
192 regs->int_code = get_lowcore()->ext_int_code_addr; in do_ext_irq()
193 regs->int_parm = get_lowcore()->ext_params; in do_ext_irq()
194 regs->int_parm_long = get_lowcore()->ext_params2; in do_ext_irq()
200 do_irq_async(regs, EXT_INTERRUPT); in do_ext_irq()
204 irqentry_exit(regs, state); in do_ext_irq()
207 regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT); in do_ext_irq()
221 raw_spin_lock_irqsave(&desc->lock, flags); in show_msi_interrupt()
226 if (desc->irq_data.chip) in show_msi_interrupt()
227 seq_printf(p, " %8s", desc->irq_data.chip->name); in show_msi_interrupt()
229 if (desc->action) in show_msi_interrupt()
230 seq_printf(p, " %s", desc->action->name); in show_msi_interrupt()
233 raw_spin_unlock_irqrestore(&desc->lock, flags); in show_msi_interrupt()
250 seq_printf(p, "CPU%-8d", cpu); in show_interrupts()
305 return (code + (code >> 9)) & (ARRAY_SIZE(ext_int_hash) - 1); in ext_hash()
316 return -ENOMEM; in register_external_irq()
317 p->code = code; in register_external_irq()
318 p->handler = handler; in register_external_irq()
322 hlist_add_head_rcu(&p->entry, &ext_int_hash[index]); in register_external_irq()
336 if (p->code == code && p->handler == handler) { in unregister_external_irq()
337 hlist_del_rcu(&p->entry); in unregister_external_irq()
348 struct pt_regs *regs = get_irq_regs(); in do_ext_interrupt() local
353 ext_code.int_code = regs->int_code; in do_ext_interrupt()
360 if (unlikely(p->code != ext_code.code)) in do_ext_interrupt()
362 p->handler(ext_code, regs->int_parm, regs->int_parm_long); in do_ext_interrupt()
377 if (request_irq(EXT_INTERRUPT, do_ext_interrupt, 0, "EXT", NULL)) in init_ext_interrupts()
378 panic("Failed to register EXT interrupt\n"); in init_ext_interrupts()
405 irq_subclass_refcount[subclass]--; in irq_subclass_unregister()