提交 2d9426ac 编写于 作者: J Jianmin Lv 提交者: openeuler-sync-bot

irqchip/loongarch: Fix some issues of irq controllers

LoongArch inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6ONTH

--------------------------------

In dual-bridges scenario, some bugs were found for irq
controllers drivers, so the patch is used to fix them.
Signed-off-by: NJianmin Lv <lvjianmin@loongson.cn>
Change-Id: Ib498432738a269543626f4e8cc5dc24aa12c4c47
(cherry picked from commit d6b1585a)
上级 be7b6c55
...@@ -106,6 +106,13 @@ void __init init_IRQ(void) ...@@ -106,6 +106,13 @@ void __init init_IRQ(void)
unsigned int order = get_order(IRQ_STACK_SIZE); unsigned int order = get_order(IRQ_STACK_SIZE);
struct page *page; struct page *page;
u64 node;
if (!acpi_gbl_reduced_hardware)
for_each_node(node)
writel(0x40000000 | (node << 12),
(volatile void __iomem *)(((node << 44)
| 0x80000EFDFB000000ULL) + 0x274));
clear_csr_ecfg(ECFG0_IM); clear_csr_ecfg(ECFG0_IM);
clear_csr_estat(ESTATF_IP); clear_csr_estat(ESTATF_IP);
......
...@@ -294,9 +294,6 @@ static void acpi_set_vec_parent(int node, struct irq_domain *parent, struct acpi ...@@ -294,9 +294,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;
...@@ -365,8 +362,13 @@ int __init ...@@ -365,8 +362,13 @@ int __init
pch_msi_parse_madt(union acpi_subtable_headers *header, 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 = eiointc_priv[nr_pics - 1]->node;
if (cpu_has_flatmode)
node = cpu_to_node(node * CORES_PER_EIO_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);
...@@ -389,6 +391,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent, ...@@ -389,6 +391,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
int i, parent_irq; int i, parent_irq;
unsigned long node_map; unsigned long node_map;
struct eiointc_priv *priv; struct eiointc_priv *priv;
int node = acpi_eiointc->node;
priv = kzalloc(sizeof(*priv), GFP_KERNEL); priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
...@@ -431,8 +434,10 @@ int __init eiointc_acpi_init(struct irq_domain *parent, ...@@ -431,8 +434,10 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
"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(node * CORES_PER_EIO_NODE);
acpi_set_vec_parent(node, priv->eiointc_domain, pch_group);
acpi_set_vec_parent(node, priv->eiointc_domain, msi_group);
acpi_cascade_irqdomain_init(); acpi_cascade_irqdomain_init();
return 0; return 0;
......
...@@ -394,6 +394,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent, ...@@ -394,6 +394,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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册