Merge 'irq/loongarch-fixes-6.4' into loongarch-next
authorHuacai Chen <chenhuacai@loongson.cn>
Wed, 26 Apr 2023 03:56:37 +0000 (11:56 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 26 Apr 2023 03:56:37 +0000 (11:56 +0800)
LoongArch architecture changes for 6.4 depend on the irq changes
to work on "dual-bridge" systems, so merge them to create a base.

drivers/irqchip/irq-loongson-eiointc.c
drivers/irqchip/irq-loongson-pch-pic.c

index d15fd38c17568e213285920350f4adc4bc584960..90181c42840b4e92a8b7a8a59d3da5280532ada3 100644 (file)
@@ -280,9 +280,6 @@ static void acpi_set_vec_parent(int node, struct irq_domain *parent, struct acpi
 {
        int i;
 
-       if (cpu_has_flatmode)
-               node = cpu_to_node(node * CORES_PER_EIO_NODE);
-
        for (i = 0; i < MAX_IO_PICS; i++) {
                if (node == vec_group[i].node) {
                        vec_group[i].parent = parent;
@@ -343,19 +340,27 @@ static int __init pch_pic_parse_madt(union acpi_subtable_headers *header,
        if (parent)
                return pch_pic_acpi_init(parent, pchpic_entry);
 
-       return -EINVAL;
+       return 0;
 }
 
 static int __init pch_msi_parse_madt(union acpi_subtable_headers *header,
                                        const unsigned long end)
 {
+       struct irq_domain *parent;
        struct acpi_madt_msi_pic *pchmsi_entry = (struct acpi_madt_msi_pic *)header;
-       struct irq_domain *parent = acpi_get_vec_parent(eiointc_priv[nr_pics - 1]->node, msi_group);
+       int node;
+
+       if (cpu_has_flatmode)
+               node = cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE);
+       else
+               node = eiointc_priv[nr_pics - 1]->node;
+
+       parent = acpi_get_vec_parent(node, msi_group);
 
        if (parent)
                return pch_msi_acpi_init(parent, pchmsi_entry);
 
-       return -EINVAL;
+       return 0;
 }
 
 static int __init acpi_cascade_irqdomain_init(void)
@@ -379,6 +384,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
        int i, ret, parent_irq;
        unsigned long node_map;
        struct eiointc_priv *priv;
+       int node;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
@@ -416,13 +422,19 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
        parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade);
        irq_set_chained_handler_and_data(parent_irq, eiointc_irq_dispatch, priv);
 
-       register_syscore_ops(&eiointc_syscore_ops);
-       cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING,
+       if (nr_pics == 1) {
+               register_syscore_ops(&eiointc_syscore_ops);
+               cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING,
                                  "irqchip/loongarch/intc:starting",
                                  eiointc_router_init, NULL);
+       }
 
-       acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, pch_group);
-       acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, msi_group);
+       if (cpu_has_flatmode)
+               node = cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE);
+       else
+               node = acpi_eiointc->node;
+       acpi_set_vec_parent(node, priv->eiointc_domain, pch_group);
+       acpi_set_vec_parent(node, priv->eiointc_domain, msi_group);
        ret = acpi_cascade_irqdomain_init();
 
        return ret;
index 437f1af693d015d0ace1c20ce69be33e91646d98..e5fe4d50be056ffe00e2ab8f6c53fc5f1e464169 100644 (file)
@@ -311,7 +311,8 @@ static int pch_pic_init(phys_addr_t addr, unsigned long size, int vec_base,
        pch_pic_handle[nr_pics] = domain_handle;
        pch_pic_priv[nr_pics++] = priv;
 
-       register_syscore_ops(&pch_pic_syscore_ops);
+       if (nr_pics == 1)
+               register_syscore_ops(&pch_pic_syscore_ops);
 
        return 0;
 
@@ -403,6 +404,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent,
        int ret, vec_base;
        struct fwnode_handle *domain_handle;
 
+       if (find_pch_pic(acpi_pchpic->gsi_base) >= 0)
+               return 0;
+
        vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ;
 
        domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address);