1 #include <linux/types.h>
2 #include <linux/kernel.h>
14 #include <asm/machdep.h>
16 #include <asm/errno.h>
21 static int ibm_get_xive;
22 static int ibm_set_xive;
23 static int ibm_int_on;
24 static int ibm_int_off;
26 static int ics_rtas_map(
struct ics *
ics,
unsigned int virq);
27 static void ics_rtas_mask_unknown(
struct ics *
ics,
unsigned long vec);
28 static long ics_rtas_get_server(
struct ics *
ics,
unsigned long vec);
32 static struct ics ics_rtas = {
34 .mask_unknown = ics_rtas_mask_unknown,
35 .get_server = ics_rtas_get_server,
36 .host_match = ics_rtas_host_match,
39 static void ics_rtas_unmask_irq(
struct irq_data *
d)
41 unsigned int hw_irq = (
unsigned int)irqd_to_hwirq(d);
45 pr_devel(
"xics: unmask virq %d [hw 0x%x]\n", d->
irq, hw_irq);
52 call_status =
rtas_call(ibm_set_xive, 3, 1,
NULL, hw_irq, server,
54 if (call_status != 0) {
56 "%s: ibm_set_xive irq %u server %x returned %d\n",
57 __func__, hw_irq, server, call_status);
63 if (call_status != 0) {
65 __func__, hw_irq, call_status);
70 static unsigned int ics_rtas_startup(
struct irq_data *d)
82 ics_rtas_unmask_irq(d);
86 static void ics_rtas_mask_real_irq(
unsigned int hw_irq)
94 if (call_status != 0) {
96 __func__, hw_irq, call_status);
103 if (call_status != 0) {
105 __func__, hw_irq, call_status);
110 static void ics_rtas_mask_irq(
struct irq_data *d)
112 unsigned int hw_irq = (
unsigned int)irqd_to_hwirq(d);
114 pr_devel(
"xics: mask virq %d [hw 0x%x]\n", d->
irq, hw_irq);
118 ics_rtas_mask_real_irq(hw_irq);
121 static int ics_rtas_set_affinity(
struct irq_data *d,
125 unsigned int hw_irq = (
unsigned int)irqd_to_hwirq(d);
133 status =
rtas_call(ibm_get_xive, 1, 3, xics_status, hw_irq);
137 __func__, hw_irq, status);
142 if (irq_server == -1) {
144 cpumask_scnprintf(cpulist,
sizeof(cpulist), cpumask);
146 "%s: No online cpus in the mask %s for irq %d\n",
147 __func__, cpulist, d->
irq);
152 hw_irq, irq_server, xics_status[1]);
156 __func__, hw_irq, status);
163 static struct irq_chip ics_rtas_irq_chip = {
165 .irq_startup = ics_rtas_startup,
166 .irq_mask = ics_rtas_mask_irq,
167 .irq_unmask = ics_rtas_unmask_irq,
169 .irq_set_affinity = ics_rtas_set_affinity
172 static int ics_rtas_map(
struct ics *
ics,
unsigned int virq)
182 rc =
rtas_call(ibm_get_xive, 1, 3, status, hw_irq);
192 static void ics_rtas_mask_unknown(
struct ics *ics,
unsigned long vec)
194 ics_rtas_mask_real_irq(vec);
197 static long ics_rtas_get_server(
struct ics *ics,
unsigned long vec)
201 rc =
rtas_call(ibm_get_xive, 1, 3, status, vec);
207 static int ics_rtas_host_match(
struct ics *ics,
struct device_node *
node)
226 if (ibm_get_xive == RTAS_UNKNOWN_SERVICE ||
227 ibm_set_xive == RTAS_UNKNOWN_SERVICE)