mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-21 13:24:15 +08:00
irqchip/sifive-plic: set max threshold for ignored handlers
When running in M-mode, the S-mode plic handlers are still listed in the device tree. Ignore them by setting the maximum threshold. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Marc Zyngier <maz@kernel.org> Signed-off-by: Paul Walmsley <paul.walmsley@sifive.com>
This commit is contained in:
parent
95594cb40c
commit
9ce06497c2
@ -244,6 +244,7 @@ static int __init plic_init(struct device_node *node,
|
|||||||
struct plic_handler *handler;
|
struct plic_handler *handler;
|
||||||
irq_hw_number_t hwirq;
|
irq_hw_number_t hwirq;
|
||||||
int cpu, hartid;
|
int cpu, hartid;
|
||||||
|
u32 threshold = 0;
|
||||||
|
|
||||||
if (of_irq_parse_one(node, i, &parent)) {
|
if (of_irq_parse_one(node, i, &parent)) {
|
||||||
pr_err("failed to parse parent for context %d.\n", i);
|
pr_err("failed to parse parent for context %d.\n", i);
|
||||||
@ -266,10 +267,16 @@ static int __init plic_init(struct device_node *node,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When running in M-mode we need to ignore the S-mode handler.
|
||||||
|
* Here we assume it always comes later, but that might be a
|
||||||
|
* little fragile.
|
||||||
|
*/
|
||||||
handler = per_cpu_ptr(&plic_handlers, cpu);
|
handler = per_cpu_ptr(&plic_handlers, cpu);
|
||||||
if (handler->present) {
|
if (handler->present) {
|
||||||
pr_warn("handler already present for context %d.\n", i);
|
pr_warn("handler already present for context %d.\n", i);
|
||||||
continue;
|
threshold = 0xffffffff;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
handler->present = true;
|
handler->present = true;
|
||||||
@ -279,8 +286,9 @@ static int __init plic_init(struct device_node *node,
|
|||||||
handler->enable_base =
|
handler->enable_base =
|
||||||
plic_regs + ENABLE_BASE + i * ENABLE_PER_HART;
|
plic_regs + ENABLE_BASE + i * ENABLE_PER_HART;
|
||||||
|
|
||||||
|
done:
|
||||||
/* priority must be > threshold to trigger an interrupt */
|
/* priority must be > threshold to trigger an interrupt */
|
||||||
writel(0, handler->hart_base + CONTEXT_THRESHOLD);
|
writel(threshold, handler->hart_base + CONTEXT_THRESHOLD);
|
||||||
for (hwirq = 1; hwirq <= nr_irqs; hwirq++)
|
for (hwirq = 1; hwirq <= nr_irqs; hwirq++)
|
||||||
plic_toggle(handler, hwirq, 0);
|
plic_toggle(handler, hwirq, 0);
|
||||||
nr_handlers++;
|
nr_handlers++;
|
||||||
|
Loading…
Reference in New Issue
Block a user