irqchip/gic-v3: Ignore disabled ITS nodes
authorStephen Boyd <sboyd@codeaurora.org>
Thu, 1 Feb 2018 17:03:29 +0000 (09:03 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:50:26 +0000 (07:50 +0200)
[ Upstream commit 95a2562590c2f64a0398183f978d5cf3db6d0284 ]

On some platforms there's an ITS available but it's not enabled
because reading or writing the registers is denied by the
firmware. In fact, reading or writing them will cause the system
to reset. We could remove the node from DT in such a case, but
it's better to skip nodes that are marked as "disabled" in DT so
that we can describe the hardware that exists and use the status
property to indicate how the firmware has configured things.

Cc: Stuart Yoder <stuyoder@gmail.com>
Cc: Laurentiu Tudor <laurentiu.tudor@nxp.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Rajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/irqchip/irq-gic-v3-its-pci-msi.c
drivers/irqchip/irq-gic-v3-its-platform-msi.c
drivers/irqchip/irq-gic-v3-its.c
drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c

index aee1c60d7ab5689cc9cb550e666fb21b5db035a6..cc58b1b272c01e3a2066525ed1161690a8d794db 100644 (file)
@@ -133,6 +133,8 @@ static int __init its_pci_of_msi_init(void)
 
        for (np = of_find_matching_node(NULL, its_device_id); np;
             np = of_find_matching_node(np, its_device_id)) {
+               if (!of_device_is_available(np))
+                       continue;
                if (!of_property_read_bool(np, "msi-controller"))
                        continue;
 
index 470b4aa7d62c2816015b57420a81f12b37ef4649..e4768fcdc67270521f8ca14af0a87024a1eb782e 100644 (file)
@@ -80,6 +80,8 @@ static int __init its_pmsi_init(void)
 
        for (np = of_find_matching_node(NULL, its_device_id); np;
             np = of_find_matching_node(np, its_device_id)) {
+               if (!of_device_is_available(np))
+                       continue;
                if (!of_property_read_bool(np, "msi-controller"))
                        continue;
 
index ac15e5d5d9b20e7ef2467128fc6c00b79d6973a6..558c7589c32937cd3ca02d5dea7aadadd89f2000 100644 (file)
@@ -1807,6 +1807,8 @@ static int __init its_of_probe(struct device_node *node)
 
        for (np = of_find_matching_node(node, its_device_id); np;
             np = of_find_matching_node(np, its_device_id)) {
+               if (!of_device_is_available(np))
+                       continue;
                if (!of_property_read_bool(np, "msi-controller")) {
                        pr_warn("%s: no msi-controller property, ITS ignored\n",
                                np->full_name);
index eaeb3c51e14b47a97f630afd04d1c841f2aaccb3..cb95c3e940f1d6e6594bd837932708e74b803a6c 100644 (file)
@@ -75,6 +75,8 @@ int __init its_fsl_mc_msi_init(void)
 
        for (np = of_find_matching_node(NULL, its_device_id); np;
             np = of_find_matching_node(np, its_device_id)) {
+               if (!of_device_is_available(np))
+                       continue;
                if (!of_property_read_bool(np, "msi-controller"))
                        continue;