powerpc/xics: Move irq_host matching into the ics backend
authorMichael Ellerman <michael@ellerman.id.au>
Thu, 14 Apr 2011 22:31:59 +0000 (22:31 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 20 Apr 2011 07:01:20 +0000 (17:01 +1000)
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: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/xics.h
arch/powerpc/sysdev/xics/ics-rtas.c
arch/powerpc/sysdev/xics/xics-common.c

index c4ed4c5b6464667d7248e11bba25026cc758fd94..6c06306c41001537660a3fa67497c60301b40140 100644 (file)
@@ -59,6 +59,7 @@ struct ics {
        int (*map)(struct ics *ics, unsigned int virq);
        void (*mask_unknown)(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[];
 };
 
index 5b3ee387e89d8b6a479d3fa5d32578babbe555a0..610c148fedcc14489bcbe26e1fc1d61b36a7a92a 100644 (file)
@@ -26,12 +26,14 @@ static int ibm_int_off;
 static int ics_rtas_map(struct ics *ics, unsigned int virq);
 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 int ics_rtas_host_match(struct ics *ics, struct device_node *node);
 
 /* Only one global & state struct ics */
 static struct ics ics_rtas = {
        .map            = ics_rtas_map,
        .mask_unknown   = ics_rtas_mask_unknown,
        .get_server     = ics_rtas_get_server,
+       .host_match     = ics_rtas_host_match,
 };
 
 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)
        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)
 {
        ibm_get_xive = rtas_token("ibm,get-xive");
index e70175dfe322fcfa5acb2d9615a8e4ba53c45ae5..c58844d72426aa874a414a8797c2afd3e5fdff0e 100644 (file)
@@ -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)
 {
-       /* 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");
+       struct ics *ics;
+
+       list_for_each_entry(ics, &ics_list, link)
+               if (ics->host_match(ics, node))
+                       return 1;
+
+       return 0;
 }
 
 /* Dummies */