Commit 3b5a5672 authored by Huacai Chen's avatar Huacai Chen

Merge 'irq/loongarch-fixes-6.4' into loongarch-next

LoongArch architecture changes for 6.4 depend on the irq changes
to work on "dual-bridge" systems, so merge them to create a base.
parents 457391b0 48ce2d72
...@@ -280,9 +280,6 @@ static void acpi_set_vec_parent(int node, struct irq_domain *parent, struct acpi ...@@ -280,9 +280,6 @@ static void acpi_set_vec_parent(int node, struct irq_domain *parent, struct acpi
{ {
int i; int i;
if (cpu_has_flatmode)
node = cpu_to_node(node * CORES_PER_EIO_NODE);
for (i = 0; i < MAX_IO_PICS; i++) { for (i = 0; i < MAX_IO_PICS; i++) {
if (node == vec_group[i].node) { if (node == vec_group[i].node) {
vec_group[i].parent = parent; vec_group[i].parent = parent;
...@@ -343,19 +340,27 @@ static int __init pch_pic_parse_madt(union acpi_subtable_headers *header, ...@@ -343,19 +340,27 @@ static int __init pch_pic_parse_madt(union acpi_subtable_headers *header,
if (parent) if (parent)
return pch_pic_acpi_init(parent, pchpic_entry); return pch_pic_acpi_init(parent, pchpic_entry);
return -EINVAL; return 0;
} }
static int __init pch_msi_parse_madt(union acpi_subtable_headers *header, static int __init pch_msi_parse_madt(union acpi_subtable_headers *header,
const unsigned long end) const unsigned long end)
{ {
struct irq_domain *parent;
struct acpi_madt_msi_pic *pchmsi_entry = (struct acpi_madt_msi_pic *)header; 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) if (parent)
return pch_msi_acpi_init(parent, pchmsi_entry); return pch_msi_acpi_init(parent, pchmsi_entry);
return -EINVAL; return 0;
} }
static int __init acpi_cascade_irqdomain_init(void) static int __init acpi_cascade_irqdomain_init(void)
...@@ -379,6 +384,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent, ...@@ -379,6 +384,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
int i, ret, parent_irq; int i, ret, parent_irq;
unsigned long node_map; unsigned long node_map;
struct eiointc_priv *priv; struct eiointc_priv *priv;
int node;
priv = kzalloc(sizeof(*priv), GFP_KERNEL); priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
...@@ -416,13 +422,19 @@ int __init eiointc_acpi_init(struct irq_domain *parent, ...@@ -416,13 +422,19 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade); parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade);
irq_set_chained_handler_and_data(parent_irq, eiointc_irq_dispatch, priv); irq_set_chained_handler_and_data(parent_irq, eiointc_irq_dispatch, priv);
register_syscore_ops(&eiointc_syscore_ops); if (nr_pics == 1) {
cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING, register_syscore_ops(&eiointc_syscore_ops);
cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING,
"irqchip/loongarch/intc:starting", "irqchip/loongarch/intc:starting",
eiointc_router_init, NULL); eiointc_router_init, NULL);
}
acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, pch_group); if (cpu_has_flatmode)
acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, msi_group); 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(); ret = acpi_cascade_irqdomain_init();
return ret; return ret;
......
...@@ -311,7 +311,8 @@ static int pch_pic_init(phys_addr_t addr, unsigned long size, int vec_base, ...@@ -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_handle[nr_pics] = domain_handle;
pch_pic_priv[nr_pics++] = priv; 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; return 0;
...@@ -403,6 +404,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent, ...@@ -403,6 +404,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent,
int ret, vec_base; int ret, vec_base;
struct fwnode_handle *domain_handle; 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; vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ;
domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address); domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment