94 lines
3.1 KiB
Diff
94 lines
3.1 KiB
Diff
|
|
From c924f1df705a301a0ffc01fce4c7712756c8b1d2 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zengruan Ye <yezengruan@huawei.com>
|
||
|
|
Date: Sat, 13 Jul 2019 19:09:09 +0800
|
||
|
|
Subject: [PATCH] feature: aarch64: add the regular to get the correct irq
|
||
|
|
class on hisi board
|
||
|
|
|
||
|
|
First, get the full irq desc name, include that the name split by blank, just like
|
||
|
|
(hisi_sas_v2_hw sata). We use the irq type to mark the begin of the name.
|
||
|
|
|
||
|
|
Second, for hisi bord, we consider to match the IRQ_SCSI class (which the
|
||
|
|
irqbalance service concerned, and the eth device match follow the
|
||
|
|
open community rule) by keywords group hisi & sas or hisi & sata.
|
||
|
|
|
||
|
|
Signed-off-by: wanghaibin <wanghaibin.wang@huawei.com>
|
||
|
|
---
|
||
|
|
procinterrupts.c | 33 ++++++++++++++++++++++++++++++++-
|
||
|
|
1 file changed, 32 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/procinterrupts.c b/procinterrupts.c
|
||
|
|
index 854282f..32c5e53 100644
|
||
|
|
--- a/procinterrupts.c
|
||
|
|
+++ b/procinterrupts.c
|
||
|
|
@@ -108,6 +108,8 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info)
|
||
|
|
/* Note: Last entry is a catchall */
|
||
|
|
static struct irq_match matches[] = {
|
||
|
|
{ "eth.*" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_GBETH },
|
||
|
|
+ { "hisi\\w*? *sas" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_SCSI},
|
||
|
|
+ { "hisi\\w*? *sata" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_SCSI},
|
||
|
|
{ "[A-Z0-9]{4}[0-9a-f]{4}", {NULL} ,check_platform_device, IRQ_TYPE_LEGACY, IRQ_OTHER},
|
||
|
|
{ "PNP[0-9a-f]{4}", {NULL} ,check_platform_device, IRQ_TYPE_LEGACY, IRQ_OTHER},
|
||
|
|
{ ".*", {NULL}, NULL, IRQ_TYPE_LEGACY, IRQ_OTHER},
|
||
|
|
@@ -155,6 +157,8 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||
|
|
int is_xen_dyn = 0;
|
||
|
|
#ifdef AARCH64
|
||
|
|
char *tmp = NULL;
|
||
|
|
+ int irq_fullname_valid = 1;
|
||
|
|
+ char irq_fullname[PATH_MAX] = {0};
|
||
|
|
#endif
|
||
|
|
|
||
|
|
irq_name = strtok_r(savedline, " ", &savedptr);
|
||
|
|
@@ -166,6 +170,16 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||
|
|
if (strstr(irq_name, "xen-dyn") != NULL)
|
||
|
|
is_xen_dyn = 1;
|
||
|
|
last_token = p;
|
||
|
|
+
|
||
|
|
+#ifdef AARCH64
|
||
|
|
+ /*
|
||
|
|
+ * /proc/interrupts format defined, after of interrupt type
|
||
|
|
+ * the reset string is mark the irq desc name.
|
||
|
|
+ */
|
||
|
|
+ if (strncmp(irq_name, "Level", strlen("Level")) == 0 ||
|
||
|
|
+ strncmp(irq_name, "Edge", strlen("Edge")) == 0)
|
||
|
|
+ break;
|
||
|
|
+#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef AARCH64
|
||
|
|
@@ -173,6 +187,17 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||
|
|
tmp = strchr(irq_name, '\n');
|
||
|
|
if (tmp)
|
||
|
|
*tmp = 0;
|
||
|
|
+
|
||
|
|
+ if (strlen(irq_name) + strlen(savedptr) + 1 < PATH_MAX) {
|
||
|
|
+ strcat(irq_fullname, irq_name);
|
||
|
|
+ strcat(irq_fullname, " ");
|
||
|
|
+ strcat(irq_fullname, savedptr);
|
||
|
|
+ tmp = strchr(irq_fullname, '\n');
|
||
|
|
+ if (tmp)
|
||
|
|
+ *tmp = 0;
|
||
|
|
+ } else {
|
||
|
|
+ irq_fullname_valid = 0;
|
||
|
|
+ }
|
||
|
|
#endif
|
||
|
|
irq_mod = last_token;
|
||
|
|
info->irq = irq;
|
||
|
|
@@ -182,7 +207,13 @@ void init_irq_class_and_type(char *savedline, struct irq_info *info, int irq)
|
||
|
|
info->class = IRQ_VIRT_EVENT;
|
||
|
|
} else {
|
||
|
|
#ifdef AARCH64
|
||
|
|
- guess_arm_irq_hints(irq_name, info);
|
||
|
|
+ if (irq_fullname_valid) {
|
||
|
|
+ irq_name = irq_fullname;
|
||
|
|
+ guess_arm_irq_hints(irq_name, info);
|
||
|
|
+ } else {
|
||
|
|
+ info->type = IRQ_TYPE_LEGACY;
|
||
|
|
+ info->class = IRQ_OTHER;
|
||
|
|
+ }
|
||
|
|
#else
|
||
|
|
info->type = IRQ_TYPE_LEGACY;
|
||
|
|
info->class = IRQ_OTHER;
|
||
|
|
--
|
||
|
|
2.23.0
|
||
|
|
|