Commit 5ca12376 authored by Michael Ellerman's avatar Michael Ellerman Committed by Benjamin Herrenschmidt

powerpc/xics: Move irq_host matching into the ics backend

An upcoming new ics backend will need to implement different matching
semantics to the current ones, which are essentially the RTAS ics
backends. So move the current match into the RTAS backend, and allow
other ics backends to override.
Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent ab814b93
...@@ -59,6 +59,7 @@ struct ics { ...@@ -59,6 +59,7 @@ struct ics {
int (*map)(struct ics *ics, unsigned int virq); int (*map)(struct ics *ics, unsigned int virq);
void (*mask_unknown)(struct ics *ics, unsigned long vec); void (*mask_unknown)(struct ics *ics, unsigned long vec);
long (*get_server)(struct ics *ics, unsigned long vec); long (*get_server)(struct ics *ics, unsigned long vec);
int (*host_match)(struct ics *ics, struct device_node *node);
char data[]; char data[];
}; };
......
...@@ -26,12 +26,14 @@ static int ibm_int_off; ...@@ -26,12 +26,14 @@ static int ibm_int_off;
static int ics_rtas_map(struct ics *ics, unsigned int virq); static int ics_rtas_map(struct ics *ics, unsigned int virq);
static void ics_rtas_mask_unknown(struct ics *ics, unsigned long vec); static void ics_rtas_mask_unknown(struct ics *ics, unsigned long vec);
static long ics_rtas_get_server(struct ics *ics, unsigned long vec); static long ics_rtas_get_server(struct ics *ics, unsigned long vec);
static int ics_rtas_host_match(struct ics *ics, struct device_node *node);
/* Only one global & state struct ics */ /* Only one global & state struct ics */
static struct ics ics_rtas = { static struct ics ics_rtas = {
.map = ics_rtas_map, .map = ics_rtas_map,
.mask_unknown = ics_rtas_mask_unknown, .mask_unknown = ics_rtas_mask_unknown,
.get_server = ics_rtas_get_server, .get_server = ics_rtas_get_server,
.host_match = ics_rtas_host_match,
}; };
static void ics_rtas_unmask_irq(struct irq_data *d) static void ics_rtas_unmask_irq(struct irq_data *d)
...@@ -202,6 +204,15 @@ static long ics_rtas_get_server(struct ics *ics, unsigned long vec) ...@@ -202,6 +204,15 @@ static long ics_rtas_get_server(struct ics *ics, unsigned long vec)
return status[0]; return status[0];
} }
static int ics_rtas_host_match(struct ics *ics, struct device_node *node)
{
/* IBM machines have interrupt parents of various funky types for things
* like vdevices, events, etc... The trick we use here is to match
* everything here except the legacy 8259 which is compatible "chrp,iic"
*/
return !of_device_is_compatible(node, "chrp,iic");
}
int ics_rtas_init(void) int ics_rtas_init(void)
{ {
ibm_get_xive = rtas_token("ibm,get-xive"); ibm_get_xive = rtas_token("ibm,get-xive");
......
...@@ -331,11 +331,13 @@ int xics_get_irq_server(unsigned int virq, const struct cpumask *cpumask, ...@@ -331,11 +331,13 @@ int xics_get_irq_server(unsigned int virq, const struct cpumask *cpumask,
static int xics_host_match(struct irq_host *h, struct device_node *node) static int xics_host_match(struct irq_host *h, struct device_node *node)
{ {
/* IBM machines have interrupt parents of various funky types for things struct ics *ics;
* like vdevices, events, etc... The trick we use here is to match
* everything here except the legacy 8259 which is compatible "chrp,iic" list_for_each_entry(ics, &ics_list, link)
*/ if (ics->host_match(ics, node))
return !of_device_is_compatible(node, "chrp,iic"); return 1;
return 0;
} }
/* Dummies */ /* Dummies */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment