From bbcd9a42c3cec0935b960b7f2046f1fdfab4f7ef Mon Sep 17 00:00:00 2001
From: Vignesh Raghavendra <vigneshr@ti.com>
Date: Wed, 7 Dec 2022 19:46:19 +0530
Subject: [PATCH] procinterrupts: Fix IRQ name parsing on certain arm64 SoC

On arm64 SoCs like TI's K3 SoC and few other SoCs, IRQ names don't get
parsed correct due to which they end up being classified into wrong
class. Fix this by considering last token to contain IRQ name always.

Eg.: /proc/interrupt

cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
 11:       7155       8882       7235       7791     GICv3  30 Level     arch_timer
 14:          0          0          0          0     GICv3  23 Level     arm-pmu
 15:          0          0          0          0     GICv3 208 Level     4b00000.spi
 16:          0          0          0          0     GICv3 209 Level     4b10000.spi
116:          0          0          0          0  MSI-INTA 1716234 Level     485c0100.dma-controller chan6
134:        166          0          0          0  MSI-INTA 1970707 Level     8000000.ethernet-tx0
224:        149          0          0          0  MSI-INTA 1971731 Level     8000000.ethernet

W/o patch irqbalance -d
IRQ (11) guessed as class 0
IRQ (14) guessed as class 0
IRQ (15) guessed as class 0
IRQ (16) guessed as class 0
IRQ 485c0100.dma-controller chan6(116) guessed as class 0
IRQ (134) guessed as class 0
IRQ (224) guessed as class 0

W/ this patch
IRQ arch_timer(11) guessed as class 0
IRQ arm-pmu(14) guessed as class 0
IRQ 4b00000.spi(15) guessed as class 0
IRQ 4b10000.spi(16) guessed as class 0
IRQ 485c0100.dma-controller chan6(116) guessed as class 0
IRQ 8000000.ethernet-tx0(134) guessed as class 5
IRQ 8000000.ethernet(224) guessed as class 5
IRQ 8000000.ethernet(257) guessed as class 5
IRQ -davinci_gpio  wl18xx(362) guessed as class

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
---
 procinterrupts.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

--- a/procinterrupts.c
+++ b/procinterrupts.c
@@ -178,12 +178,14 @@ void init_irq_class_and_type(char *saved
 	}
 
 #ifdef AARCH64
-	if (savedptr && strlen(savedptr) > 0) {
+	if (savedptr && strlen(savedptr) > 0)
 		snprintf(irq_fullname, PATH_MAX, "%s %s", last_token, savedptr);
-		tmp = strchr(irq_fullname, '\n');
-		if (tmp)
-			*tmp = 0;
-	}
+	else
+		snprintf(irq_fullname, PATH_MAX, "%s", last_token);
+
+	tmp = strchr(irq_fullname, '\n');
+	if (tmp)
+		*tmp = 0;
 #else
 	snprintf(irq_fullname, PATH_MAX, "%s", last_token);
 #endif
