Lines Matching +full:message +full:- +full:handling +full:- +full:unit

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 * - Fix various assumptions related to HW CPU numbers vs. linux CPU numbers
15 * - Implement proper handling of maxcpus=1/2 (that is, routing of irqs from
16 * a non-active node to the active node)
32 #include <asm/cell-regs.h>
51 unsigned char unit = bits.source & 0xf; in iic_pending_to_hwnum() local
59 return (node << IIC_IRQ_NODE_SHIFT) | (class << 4) | unit; in iic_pending_to_hwnum()
73 out_be64(&iic->regs->prio, iic->eoi_stack[--iic->eoi_ptr]); in iic_eoi()
74 BUG_ON(iic->eoi_ptr < 0); in iic_eoi()
78 .name = "CELL-IIC",
100 bits = in_be64(&node_iic->iic_is); in iic_ioexc_cascade()
103 /* pre-ack edge interrupts */ in iic_ioexc_cascade()
106 out_be64(&node_iic->iic_is, ack); in iic_ioexc_cascade()
108 for (cascade = 63; cascade >= 0; cascade--) in iic_ioexc_cascade()
112 /* post-ack level interrupts */ in iic_ioexc_cascade()
115 out_be64(&node_iic->iic_is, ack); in iic_ioexc_cascade()
117 chip->irq_eoi(&desc->irq_data); in iic_ioexc_cascade()
122 .name = "CELL-IOEX",
137 in_be64((u64 __iomem *) &iic->regs->pending_destr); in iic_get_irq()
143 iic->eoi_stack[++iic->eoi_ptr] = pending.prio; in iic_get_irq()
144 BUG_ON(iic->eoi_ptr > 15); in iic_get_irq()
150 out_be64(&this_cpu_ptr(&cpu_iic)->regs->prio, 0xff); in iic_setup_cpu()
165 return IIC_IRQ_TYPE_IPI + 0xf - msg; in iic_msg_to_irq()
170 out_be64(&per_cpu(cpu_iic, cpu).regs->generate, (0xf - msg) << 4); in iic_message_pass()
186 * the error. If a message is not needed it will return non-zero. in iic_request_ipi()
207 "IBM,CBEA-Internal-Interrupt-Controller"); in iic_host_match()
232 unsigned int node, ext, unit, class; in iic_host_xlate() local
236 "IBM,CBEA-Internal-Interrupt-Controller")) in iic_host_xlate()
237 return -ENODEV; in iic_host_xlate()
239 return -ENODEV; in iic_host_xlate()
240 val = of_get_property(ct, "#interrupt-cells", NULL); in iic_host_xlate()
242 return -ENODEV; in iic_host_xlate()
247 unit = intspec[0] & 0xff; in iic_host_xlate()
251 return -EINVAL; in iic_host_xlate()
255 if (unit == IIC_UNIT_IIC && class == 1) in iic_host_xlate()
259 (class << IIC_IRQ_CLASS_SHIFT) | unit; in iic_host_xlate()
281 iic->regs = ioremap(addr, sizeof(struct cbe_iic_thread_regs)); in init_one_iic()
282 BUG_ON(iic->regs == NULL); in init_one_iic()
284 iic->target_id = ((hw_cpu & 2) << 3) | ((hw_cpu & 1) ? 0xf : 0xe); in init_one_iic()
285 iic->eoi_stack[0] = 0xff; in init_one_iic()
286 iic->node = of_node_get(node); in init_one_iic()
287 out_be64(&iic->regs->prio, 0); in init_one_iic()
290 hw_cpu, iic->target_id, node); in init_one_iic()
301 for_each_node_by_name(dn, "interrupt-controller") { in setup_iic()
303 "IBM,CBEA-Internal-Interrupt-Controller")) in setup_iic()
305 np = of_get_property(dn, "ibm,interrupt-server-ranges", NULL); in setup_iic()
309 return -ENODEV; in setup_iic()
315 return -ENODEV; in setup_iic()
340 out_be64(&node_iic->iic_ir, in setup_iic()
347 out_be64(&node_iic->iic_is, 0xfffffffffffffffful); in setup_iic()
353 return -ENODEV; in setup_iic()
368 /* Set master interrupt handling function */ in iic_init_IRQ()
388 out_be64(&iic_regs->iic_ir, iic_ir); in iic_set_interrupt_routing()