Skip to content

Commit 275232c

Browse files
author
Marc Zyngier
committed
Merge branch irq/loongarch-fixes-6.4 into irq/irqchip-next
* irq/loongarch-fixes-6.4: : . : More Loongarch fixes from Lianmin Lv, fixing issues : in the so called "dual-bridge" systems. : . irqchip/loongson-pch-pic: Fix pch_pic_acpi_init calling irqchip/loongson-pch-pic: Fix registration of syscore_ops irqchip/loongson-eiointc: Fix registration of syscore_ops irqchip/loongson-eiointc: Fix incorrect use of acpi_get_vec_parent irqchip/loongson-eiointc: Fix returned value on parsing MADT Signed-off-by: Marc Zyngier <[email protected]>
2 parents e7b5771 + 48ce2d7 commit 275232c

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

drivers/irqchip/irq-loongson-eiointc.c

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,6 @@ static void acpi_set_vec_parent(int node, struct irq_domain *parent, struct acpi
280280
{
281281
int i;
282282

283-
if (cpu_has_flatmode)
284-
node = cpu_to_node(node * CORES_PER_EIO_NODE);
285-
286283
for (i = 0; i < MAX_IO_PICS; i++) {
287284
if (node == vec_group[i].node) {
288285
vec_group[i].parent = parent;
@@ -343,19 +340,27 @@ static int __init pch_pic_parse_madt(union acpi_subtable_headers *header,
343340
if (parent)
344341
return pch_pic_acpi_init(parent, pchpic_entry);
345342

346-
return -EINVAL;
343+
return 0;
347344
}
348345

349346
static int __init pch_msi_parse_madt(union acpi_subtable_headers *header,
350347
const unsigned long end)
351348
{
349+
struct irq_domain *parent;
352350
struct acpi_madt_msi_pic *pchmsi_entry = (struct acpi_madt_msi_pic *)header;
353-
struct irq_domain *parent = acpi_get_vec_parent(eiointc_priv[nr_pics - 1]->node, msi_group);
351+
int node;
352+
353+
if (cpu_has_flatmode)
354+
node = cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE);
355+
else
356+
node = eiointc_priv[nr_pics - 1]->node;
357+
358+
parent = acpi_get_vec_parent(node, msi_group);
354359

355360
if (parent)
356361
return pch_msi_acpi_init(parent, pchmsi_entry);
357362

358-
return -EINVAL;
363+
return 0;
359364
}
360365

361366
static int __init acpi_cascade_irqdomain_init(void)
@@ -379,6 +384,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
379384
int i, ret, parent_irq;
380385
unsigned long node_map;
381386
struct eiointc_priv *priv;
387+
int node;
382388

383389
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
384390
if (!priv)
@@ -416,13 +422,19 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
416422
parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade);
417423
irq_set_chained_handler_and_data(parent_irq, eiointc_irq_dispatch, priv);
418424

419-
register_syscore_ops(&eiointc_syscore_ops);
420-
cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING,
425+
if (nr_pics == 1) {
426+
register_syscore_ops(&eiointc_syscore_ops);
427+
cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_LOONGARCH_STARTING,
421428
"irqchip/loongarch/intc:starting",
422429
eiointc_router_init, NULL);
430+
}
423431

424-
acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, pch_group);
425-
acpi_set_vec_parent(acpi_eiointc->node, priv->eiointc_domain, msi_group);
432+
if (cpu_has_flatmode)
433+
node = cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE);
434+
else
435+
node = acpi_eiointc->node;
436+
acpi_set_vec_parent(node, priv->eiointc_domain, pch_group);
437+
acpi_set_vec_parent(node, priv->eiointc_domain, msi_group);
426438
ret = acpi_cascade_irqdomain_init();
427439

428440
return ret;

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,8 @@ static int pch_pic_init(phys_addr_t addr, unsigned long size, int vec_base,
311311
pch_pic_handle[nr_pics] = domain_handle;
312312
pch_pic_priv[nr_pics++] = priv;
313313

314-
register_syscore_ops(&pch_pic_syscore_ops);
314+
if (nr_pics == 1)
315+
register_syscore_ops(&pch_pic_syscore_ops);
315316

316317
return 0;
317318

@@ -403,6 +404,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent,
403404
int ret, vec_base;
404405
struct fwnode_handle *domain_handle;
405406

407+
if (find_pch_pic(acpi_pchpic->gsi_base) >= 0)
408+
return 0;
409+
406410
vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ;
407411

408412
domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address);

0 commit comments

Comments
 (0)