Lines Matching +full:ext +full:- +full:regs

1 // SPDX-License-Identifier: GPL-2.0
24 #include <linux/entry-common.h>
54 {.irq = EXT_INTERRUPT, .name = "EXT"},
65 {.irq = IRQEXT_CLK, .name = "CLK", .desc = "[EXT] Clock Comparator"},
66 {.irq = IRQEXT_EXC, .name = "EXC", .desc = "[EXT] External Call"},
67 {.irq = IRQEXT_EMS, .name = "EMS", .desc = "[EXT] Emergency Signal"},
68 {.irq = IRQEXT_TMR, .name = "TMR", .desc = "[EXT] CPU Timer"},
69 {.irq = IRQEXT_TLA, .name = "TAL", .desc = "[EXT] Timing Alert"},
70 {.irq = IRQEXT_PFL, .name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
71 {.irq = IRQEXT_DSD, .name = "DSD", .desc = "[EXT] DASD Diag"},
72 {.irq = IRQEXT_VRT, .name = "VRT", .desc = "[EXT] Virtio"},
73 {.irq = IRQEXT_SCP, .name = "SCP", .desc = "[EXT] Service Call"},
74 {.irq = IRQEXT_IUC, .name = "IUC", .desc = "[EXT] IUCV"},
75 {.irq = IRQEXT_CMS, .name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
76 {.irq = IRQEXT_CMC, .name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
77 {.irq = IRQEXT_FTP, .name = "FTP", .desc = "[EXT] HMC FTP Service"},
100 static void do_IRQ(struct pt_regs *regs, int irq) in do_IRQ() argument
113 return ((S390_lowcore.async_stack ^ frame) & ~(THREAD_SIZE - 1)) == 0; in on_async_stack()
116 static void do_irq_async(struct pt_regs *regs, int irq) in do_irq_async() argument
119 do_IRQ(regs, irq); in do_irq_async()
122 struct pt_regs *, regs, int, irq); in do_irq_async()
126 static int irq_pending(struct pt_regs *regs) in irq_pending() argument
135 void noinstr do_io_irq(struct pt_regs *regs) in do_io_irq() argument
137 irqentry_state_t state = irqentry_enter(regs); in do_io_irq()
138 struct pt_regs *old_regs = set_irq_regs(regs); in do_io_irq()
143 if (user_mode(regs)) { in do_io_irq()
146 current->thread.last_break = regs->last_break; in do_io_irq()
154 regs->tpi_info = S390_lowcore.tpi_info; in do_io_irq()
156 do_irq_async(regs, THIN_INTERRUPT); in do_io_irq()
158 do_irq_async(regs, IO_INTERRUPT); in do_io_irq()
159 } while (MACHINE_IS_LPAR && irq_pending(regs)); in do_io_irq()
164 irqentry_exit(regs, state); in do_io_irq()
167 regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT); in do_io_irq()
170 void noinstr do_ext_irq(struct pt_regs *regs) in do_ext_irq() argument
172 irqentry_state_t state = irqentry_enter(regs); in do_ext_irq()
173 struct pt_regs *old_regs = set_irq_regs(regs); in do_ext_irq()
178 if (user_mode(regs)) { in do_ext_irq()
181 current->thread.last_break = regs->last_break; in do_ext_irq()
184 regs->int_code = S390_lowcore.ext_int_code_addr; in do_ext_irq()
185 regs->int_parm = S390_lowcore.ext_params; in do_ext_irq()
186 regs->int_parm_long = S390_lowcore.ext_params2; in do_ext_irq()
192 do_irq_async(regs, EXT_INTERRUPT); in do_ext_irq()
196 irqentry_exit(regs, state); in do_ext_irq()
199 regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT); in do_ext_irq()
213 raw_spin_lock_irqsave(&desc->lock, flags); in show_msi_interrupt()
218 if (desc->irq_data.chip) in show_msi_interrupt()
219 seq_printf(p, " %8s", desc->irq_data.chip->name); in show_msi_interrupt()
221 if (desc->action) in show_msi_interrupt()
222 seq_printf(p, " %s", desc->action->name); in show_msi_interrupt()
225 raw_spin_unlock_irqrestore(&desc->lock, flags); in show_msi_interrupt()
242 seq_printf(p, "CPU%-8d", cpu); in show_interrupts()
297 return (code + (code >> 9)) & (ARRAY_SIZE(ext_int_hash) - 1); in ext_hash()
308 return -ENOMEM; in register_external_irq()
309 p->code = code; in register_external_irq()
310 p->handler = handler; in register_external_irq()
314 hlist_add_head_rcu(&p->entry, &ext_int_hash[index]); in register_external_irq()
328 if (p->code == code && p->handler == handler) { in unregister_external_irq()
329 hlist_del_rcu(&p->entry); in unregister_external_irq()
340 struct pt_regs *regs = get_irq_regs(); in do_ext_interrupt() local
345 ext_code.int_code = regs->int_code; in do_ext_interrupt()
352 if (unlikely(p->code != ext_code.code)) in do_ext_interrupt()
354 p->handler(ext_code, regs->int_parm, regs->int_parm_long); in do_ext_interrupt()
369 if (request_irq(EXT_INTERRUPT, do_ext_interrupt, 0, "EXT", NULL)) in init_ext_interrupts()
370 panic("Failed to register EXT interrupt\n"); in init_ext_interrupts()
397 irq_subclass_refcount[subclass]--; in irq_subclass_unregister()