34 #include <linux/export.h>
36 #include <linux/types.h>
41 #include <asm/pgtable.h>
43 #include <asm/ptrace.h>
44 #include <asm/machdep.h>
58 #define IIC_NODE_COUNT 2
66 unsigned char class = bits.class & 3;
70 return IIC_IRQ_TYPE_IPI | (bits.
prio >> 4);
72 return (node << IIC_IRQ_NODE_SHIFT) | (
class << 4) | unit;
79 static void iic_unmask(
struct irq_data *
d)
93 .irq_unmask = iic_unmask,
98 static void iic_ioexc_eoi(
struct irq_data *
d)
102 static void iic_ioexc_cascade(
unsigned int irq,
struct irq_desc *
desc)
106 (
void __iomem *)irq_desc_get_handler_data(desc);
107 unsigned int base = (irq & 0xffffff00) | IIC_IRQ_TYPE_IOEXC;
112 bits = in_be64(&node_iic->
iic_is);
116 ack = bits & IIC_ISR_EDGE_MASK;
118 out_be64(&node_iic->
iic_is, ack);
120 for (cascade = 63; cascade >= 0; cascade--)
121 if (bits & (0x8000000000000000UL >> cascade)) {
129 ack = bits & ~IIC_ISR_EDGE_MASK;
131 out_be64(&node_iic->
iic_is, ack);
137 static struct irq_chip iic_ioexc_chip = {
139 .irq_mask = iic_mask,
140 .irq_unmask = iic_unmask,
141 .irq_eoi = iic_ioexc_eoi,
145 static unsigned int iic_get_irq(
void)
152 *(
unsigned long *) &pending =
171 return per_cpu(cpu_iic, cpu).target_id;
179 static inline int iic_msg_to_irq(
int msg)
181 return IIC_IRQ_TYPE_IPI + 0xf -
msg;
184 void iic_message_pass(
int cpu,
int msg)
186 out_be64(&
per_cpu(cpu_iic, cpu).
regs->generate, (0xf - msg) << 4);
195 static void iic_request_ipi(
int msg)
214 void iic_request_IPIs(
void)
216 iic_request_ipi(PPC_MSG_CALL_FUNCTION);
217 iic_request_ipi(PPC_MSG_RESCHEDULE);
218 iic_request_ipi(PPC_MSG_CALL_FUNC_SINGLE);
219 iic_request_ipi(PPC_MSG_DEBUGGER_BREAK);
228 "IBM,CBEA-Internal-Interrupt-Controller");
231 static int iic_host_map(
struct irq_domain *
h,
unsigned int virq,
234 switch (hw & IIC_IRQ_TYPE_MASK) {
235 case IIC_IRQ_TYPE_IPI:
238 case IIC_IRQ_TYPE_IOEXC:
239 irq_set_chip_and_handler(virq, &iic_ioexc_chip,
240 handle_edge_eoi_irq);
243 irq_set_chip_and_handler(virq, &iic_chip, handle_edge_eoi_irq);
249 const u32 *intspec,
unsigned int intsize,
257 "IBM,CBEA-Internal-Interrupt-Controller"))
262 if (val ==
NULL || *val != 1)
265 node = intspec[0] >> 24;
266 ext = (intspec[0] >> 16) & 0xff;
267 class = (intspec[0] >> 8) & 0xff;
268 unit = intspec[0] & 0xff;
275 *out_hwirq = (node << IIC_IRQ_NODE_SHIFT);
276 if (unit == IIC_UNIT_IIC &&
class == 1)
277 *out_hwirq |= IIC_IRQ_TYPE_IOEXC |
ext;
279 *out_hwirq |= IIC_IRQ_TYPE_NORMAL |
280 (
class << IIC_IRQ_CLASS_SHIFT) | unit;
289 .match = iic_host_match,
291 .xlate = iic_host_xlate,
294 static void __init init_one_iic(
unsigned int hw_cpu,
unsigned long addr,
300 struct iic *iic = &
per_cpu(cpu_iic, hw_cpu);
305 iic->
target_id = ((hw_cpu & 2) << 3) | ((hw_cpu & 1) ? 0xf : 0
xe);
307 iic->
node = of_node_get(node);
308 out_be64(&iic->
regs->prio, 0);
314 static int __init setup_iic(
void)
318 unsigned int node, cascade, found = 0;
325 "IBM,CBEA-Internal-Interrupt-Controller"))
340 init_one_iic(np[0],
r0.start, dn);
341 init_one_iic(np[1],
r1.start, dn);
350 cascade = node << IIC_IRQ_NODE_SHIFT;
351 cascade |= 1 << IIC_IRQ_CLASS_SHIFT;
352 cascade |= IIC_UNIT_IIC;
361 irq_set_chained_handler(cascade, iic_ioexc_cascade);
362 out_be64(&node_iic->
iic_ir,
369 out_be64(&node_iic->
iic_is, 0xfffffffffffffffful);
388 panic(
"IIC: Failed to initialize !\n");
391 ppc_md.get_irq = iic_get_irq;
410 out_be64(&iic_regs->
iic_ir, iic_ir);