From c924f1df705a301a0ffc01fce4c7712756c8b1d2 Mon Sep 17 00:00:00 2001 From: Zengruan Ye 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 --- 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