Skip to contentSkip to conversation

powerpc: pseries: use irq_of_parse_and_map helper

PATCH In review Rob Herring 2 participants 4 messages Jan 4, 2018 – Jan 25, 2018 PowerPC

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 powerpc: pseries: use irq_of_parse_and_map helper

Instead of calling both of_irq_parse_one and irq_create_of_mapping, call of_irq_parse_and_map instead which does the same thing. This gets us closer to making the former 2 functions static.

Cc Benjamin Herrenschmidt <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Michael Ellerman <[email protected]>
---
 arch/powerpc/platforms/pseries/event_sources.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)
arch/powerpc/platforms/pseries/event_sources.c +4 -7
index 6eeb0d4bab61..b0d8c146fe7b 100644
@@ -16,7 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#include <asm/prom.h>
+#include <linux/interrupt.h>
+#include <linux/of_irq.h>
 
 #include "pseries.h"
 
@@ -25,15 +26,11 @@ void request_event_sources_irqs(struct device_node *np,
 				const char *name)
 {
 	int i, index, count = 0;
-	struct of_phandle_args oirq;
 	unsigned int virqs[16];
 
 	/* First try to do a proper OF tree parsing */
-	for (index = 0; of_irq_parse_one(np, index, &oirq) == 0;
-	     index++) {
-		if (count > 15)
-			break;
-		virqs[count] = irq_create_of_mapping(&oirq);
+	for (index = 0; count < 16; index++) {
+		virqs[count] = irq_of_parse_and_map(np, index);
 		if (!virqs[count]) {
 			pr_err("event-sources: Unable to allocate "
 			       "interrupt number for %pOF\n",

--
2.14.1

#1 lore raw
Quoted 4 lines · Rob Herring

Instead of calling both of_irq_parse_one and irq_create_of_mapping, call of_irq_parse_and_map instead which does the same thing. This gets us closer to making the former 2 functions static.

Quoted 8 lines
Cc Benjamin Herrenschmidt <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Michael Ellerman <[email protected]>
---
 arch/powerpc/platforms/pseries/event_sources.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

Sorry NAK, this doesn't boot.

Quoted 22 lines
arch/powerpc/platforms/pseries/event_sources.c +2 -2
index 6eeb0d4bab61..b0d8c146fe7b 100644
@@ -16,7 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#include <asm/prom.h>
+#include <linux/interrupt.h>
+#include <linux/of_irq.h>
 
 #include "pseries.h"
 
@@ -25,15 +26,11 @@ void request_event_sources_irqs(struct device_node *np,
 				const char *name)
 {
 	int i, index, count = 0;
-	struct of_phandle_args oirq;
 	unsigned int virqs[16];
 
 	/* First try to do a proper OF tree parsing */

arch/powerpc/platforms/pseries/event_sources.c void request_event_sources_irqs(struct device_node *np, · line 36

Quoted 10 lines
arch/powerpc/platforms/pseries/event_sources.c +2 -5
-	for (index = 0; of_irq_parse_one(np, index, &oirq) == 0;
-	     index++) {
-		if (count > 15)
-			break;
-		virqs[count] = irq_create_of_mapping(&oirq);
+	for (index = 0; count < 16; index++) {
+		virqs[count] = irq_of_parse_and_map(np, index);
 		if (!virqs[count]) {
 			pr_err("event-sources: Unable to allocate "
 			       "interrupt number for %pOF\n",
                               np);
                        WARN_ON(1);
                } else {
                        count++;
                }
        }

Which is an infinite loop if we have less than 16 irqs, and spews the warning continuously.

Are you trying to remove the low-level routines or is this just a cleanup?

The patch below works, it loses the error handling if the interrupts property is corrupt/empty, but that's probably overly paranoid anyway.

cheers

arch/powerpc/platforms/pseries/event_sources.c +10 -27
index 6eeb0d4bab61..25c38077c894 100644
@@ -16,7 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#include <asm/prom.h>
+#include <linux/interrupt.h>
+#include <linux/of_irq.h>
 
 #include "pseries.h"
 
@@ -24,34 +25,16 @@ void request_event_sources_irqs(struct device_node *np,
 				irq_handler_t handler,
 				const char *name)
 {
-	int i, index, count = 0;
-	struct of_phandle_args oirq;
-	unsigned int virqs[16];
+	unsigned int virq;
+	int i, rc;
 
-	/* First try to do a proper OF tree parsing */
-	for (index = 0; of_irq_parse_one(np, index, &oirq) == 0;
-	     index++) {
-		if (count > 15)
+	for (i = 0; i < 16; i++) {
+		virq = irq_of_parse_and_map(np, i);
+		if (!virq)
 			break;
-		virqs[count] = irq_create_of_mapping(&oirq);
-		if (!virqs[count]) {
-			pr_err("event-sources: Unable to allocate "
-			       "interrupt number for %pOF\n",
-			       np);
-			WARN_ON(1);
-		} else {
-			count++;
-		}
-	}
 
-	/* Now request them */
-	for (i = 0; i < count; i++) {
-		if (request_irq(virqs[i], handler, 0, name, NULL)) {
-			pr_err("event-sources: Unable to request interrupt "
-			       "%d for %pOF\n", virqs[i], np);
-			WARN_ON(1);
-			return;
-		}
+		rc = request_irq(virq, handler, 0, name, NULL);
+		WARN(rc, "event-sources: Unable to request interrupt %d for %pOF\n",
+		     virq, np);
 	}
 }
-
#2 lore raw
Quoted 58 lines · Michael Ellerman
Quoted 4 lines · Rob Herring

Instead of calling both of_irq_parse_one and irq_create_of_mapping, call of_irq_parse_and_map instead which does the same thing. This gets us closer to making the former 2 functions static.

Quoted 8 lines
Cc Benjamin Herrenschmidt <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Michael Ellerman <[email protected]>
---
 arch/powerpc/platforms/pseries/event_sources.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

Sorry NAK, this doesn't boot.

Quoted 22 lines
arch/powerpc/platforms/pseries/event_sources.c +2 -2
index 6eeb0d4bab61..b0d8c146fe7b 100644
@@ -16,7 +16,8 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#include <asm/prom.h>
+#include <linux/interrupt.h>
+#include <linux/of_irq.h>
 
 #include "pseries.h"
 
@@ -25,15 +26,11 @@ void request_event_sources_irqs(struct device_node *np,
                              const char *name)
 {
      int i, index, count = 0;
-     struct of_phandle_args oirq;
      unsigned int virqs[16];
 
      /* First try to do a proper OF tree parsing */

arch/powerpc/platforms/pseries/event_sources.c void request_event_sources_irqs(struct device_node *np, · line 36

Quoted 10 lines
arch/powerpc/platforms/pseries/event_sources.c +2 -5
-     for (index = 0; of_irq_parse_one(np, index, &oirq) == 0;
-          index++) {
-             if (count > 15)
-                     break;
-             virqs[count] = irq_create_of_mapping(&oirq);
+     for (index = 0; count < 16; index++) {
+             virqs[count] = irq_of_parse_and_map(np, index);
              if (!virqs[count]) {
                      pr_err("event-sources: Unable to allocate "
                             "interrupt number for %pOF\n",
                               np);
                        WARN_ON(1);
                } else {
                        count++;
                }
        }
Quoted 5 lines

Which is an infinite loop if we have less than 16 irqs, and spews the warning continuously.

Are you trying to remove the low-level routines or is this just a cleanup?

The former, but I'm not sure that will happen. There's a handful of others left, but they aren't simply a call to of_irq_parse_one and then irq_create_of_mapping.

Quoted 2 lines

The patch below works, it loses the error handling if the interrupts property is corrupt/empty, but that's probably overly paranoid anyway.

Not quite. Previously, it was silent if parsing failed. Only the mapping would give an error which would mean the interrupt parent had some error.

Actually, we could use of_irq_get here to preserve the error handling. It will return error codes from parsing, 0 on mapping failure, or the Linux irq number. It adds an irq_find_host call for deferred probe, but that should be harmless. I'll respin it.

Rob

#3 lore raw
Quoted 6 lines · Rob Herring
Quoted 5 lines · Michael Ellerman
Quoted 3 lines · Rob Herring

Instead of calling both of_irq_parse_one and irq_create_of_mapping, call of_irq_parse_and_map instead which does the same thing. This gets us closer to making the former 2 functions static.

...

Quoted 10 lines
Quoted 2 lines

Are you trying to remove the low-level routines or is this just a cleanup?

The former, but I'm not sure that will happen. There's a handful of others left, but they aren't simply a call to of_irq_parse_one and then irq_create_of_mapping.

Quoted 2 lines

The patch below works, it loses the error handling if the interrupts property is corrupt/empty, but that's probably overly paranoid anyway.

Quoted 8 lines

Not quite. Previously, it was silent if parsing failed. Only the mapping would give an error which would mean the interrupt parent had some error.

Actually, we could use of_irq_get here to preserve the error handling. It will return error codes from parsing, 0 on mapping failure, or the Linux irq number. It adds an irq_find_host call for deferred probe, but that should be harmless. I'll respin it.

OK thanks.

cheers