未验证 提交 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)
unsigned int order = get_order(IRQ_STACK_SIZE);
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_estat(ESTATF_IP);
......
......@@ -294,9 +294,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;
......@@ -365,8 +362,13 @@ 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 = 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)
return pch_msi_acpi_init(parent, pchmsi_entry);
......@@ -389,6 +391,7 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
int i, parent_irq;
unsigned long node_map;
struct eiointc_priv *priv;
int node = acpi_eiointc->node;
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv)
......@@ -426,13 +429,17 @@ 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);
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(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();
return 0;
......
......@@ -305,6 +305,7 @@ 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;
if (nr_pics == 1)
register_syscore_ops(&pch_pic_syscore_ops);
return 0;
......@@ -394,6 +395,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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册