未验证 提交 342d3c9a 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!517 [sync] PR-510: LoongArch: fix dual-bridge machine can not work

Merge Pull Request from: @openeuler-sync-bot 
 

Origin pull request: 
https://gitee.com/openeuler/kernel/pulls/510 
 
After apply this PR, we can boot & reboot 3C5000+7A2000 dual-bridge machine normally. 
 
Link:https://gitee.com/openeuler/kernel/pulls/517 

Reviewed-by: Guo Dongtai <guodongtai@kylinos.cn> 
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com> 
...@@ -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)
...@@ -426,13 +429,17 @@ int __init eiointc_acpi_init(struct irq_domain *parent, ...@@ -426,13 +429,17 @@ 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(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;
......
...@@ -305,7 +305,8 @@ static int pch_pic_init(phys_addr_t addr, unsigned long size, int vec_base, ...@@ -305,7 +305,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;
...@@ -394,6 +395,9 @@ int __init pch_pic_acpi_init(struct irq_domain *parent, ...@@ -394,6 +395,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.
先完成此消息的编辑!
想要评论请 注册