Message ID | 20181127100317.12809-4-anup@brainfault.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | IRQ affinity support in PLIC driver | expand |
On 11/27/18 2:04 AM, Anup Patel wrote: > We explicitly differentiate between PLIC handler and context because > PLIC context is for given mode of HART whereas PLIC handler is per-CPU > software construct meant for handling interrupts from a particular > PLIC context. > > Signed-off-by: Anup Patel <anup@brainfault.org> > --- > drivers/irqchip/irq-sifive-plic.c | 21 +++++++++++++-------- > 1 file changed, 13 insertions(+), 8 deletions(-) > > diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c > index 95b4b92ca9b8..ffd4deaca057 100644 > --- a/drivers/irqchip/irq-sifive-plic.c > +++ b/drivers/irqchip/irq-sifive-plic.c > @@ -66,8 +66,8 @@ static DEFINE_PER_CPU(struct plic_handler, plic_handlers); > > struct plic_hw { > u32 nr_irqs; > + u32 nr_contexts; > u32 nr_handlers; > - u32 nr_mapped; > void __iomem *regs; > struct irq_domain *irqdomain; > }; > @@ -191,10 +191,10 @@ static int __init plic_init(struct device_node *node, > if (WARN_ON(!plic.nr_irqs)) > goto out_iounmap; > > - plic.nr_handlers = of_irq_count(node); > - if (WARN_ON(!plic.nr_handlers)) > + plic.nr_contexts = of_irq_count(node); > + if (WARN_ON(!plic.nr_contexts)) > goto out_iounmap; > - if (WARN_ON(plic.nr_handlers < num_possible_cpus())) > + if (WARN_ON(plic.nr_contexts < num_possible_cpus())) > goto out_iounmap; > > plic.irqdomain = irq_domain_add_linear(node, plic.nr_irqs + 1, > @@ -202,7 +202,7 @@ static int __init plic_init(struct device_node *node, > if (WARN_ON(!plic.irqdomain)) > goto out_iounmap; > > - for (i = 0; i < plic.nr_handlers; i++) { > + for (i = 0; i < plic.nr_contexts; i++) { > struct of_phandle_args parent; > struct plic_handler *handler; > irq_hw_number_t hwirq; > @@ -225,6 +225,11 @@ static int __init plic_init(struct device_node *node, > > cpu = riscv_hartid_to_cpuid(hartid); > handler = per_cpu_ptr(&plic_handlers, cpu); > + if (handler->present) { > + pr_warn("handler not available for context %d.\n", i); > + continue; > + } > + Ahh you have the handler->present check here in this patch. This should be in the 2nd patch. This change doesn't match the commit text anyways. Everything else just variable renaming which can be separated. nr_handlers->nr_contexts nr_mapped->nr_handlers Regards, Atish > handler->present = true; > handler->hart_base = > plic.regs + CONTEXT_BASE + i * CONTEXT_PER_HART; > @@ -237,11 +242,11 @@ static int __init plic_init(struct device_node *node, > for (hwirq = 1; hwirq <= plic.nr_irqs; hwirq++) > plic_toggle(handler, hwirq, 0); > > - plic.nr_mapped++; > + plic.nr_handlers++; > } > > - pr_info("mapped %d interrupts to %d (out of %d) handlers.\n", > - plic.nr_irqs, plic.nr_mapped, plic.nr_handlers); > + pr_info("mapped %d interrupts with %d handlers for %d contexts.\n", > + plic.nr_irqs, plic.nr_handlers, plic.nr_contexts); > set_handle_irq(plic_handle_irq); > return 0; > >
On Fri, Nov 30, 2018 at 7:27 AM Atish Patra <atish.patra@wdc.com> wrote: > > On 11/27/18 2:04 AM, Anup Patel wrote: > > We explicitly differentiate between PLIC handler and context because > > PLIC context is for given mode of HART whereas PLIC handler is per-CPU > > software construct meant for handling interrupts from a particular > > PLIC context. > > > > Signed-off-by: Anup Patel <anup@brainfault.org> > > --- > > drivers/irqchip/irq-sifive-plic.c | 21 +++++++++++++-------- > > 1 file changed, 13 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c > > index 95b4b92ca9b8..ffd4deaca057 100644 > > --- a/drivers/irqchip/irq-sifive-plic.c > > +++ b/drivers/irqchip/irq-sifive-plic.c > > @@ -66,8 +66,8 @@ static DEFINE_PER_CPU(struct plic_handler, plic_handlers); > > > > struct plic_hw { > > u32 nr_irqs; > > + u32 nr_contexts; > > u32 nr_handlers; > > - u32 nr_mapped; > > void __iomem *regs; > > struct irq_domain *irqdomain; > > }; > > @@ -191,10 +191,10 @@ static int __init plic_init(struct device_node *node, > > if (WARN_ON(!plic.nr_irqs)) > > goto out_iounmap; > > > > - plic.nr_handlers = of_irq_count(node); > > - if (WARN_ON(!plic.nr_handlers)) > > + plic.nr_contexts = of_irq_count(node); > > + if (WARN_ON(!plic.nr_contexts)) > > goto out_iounmap; > > - if (WARN_ON(plic.nr_handlers < num_possible_cpus())) > > + if (WARN_ON(plic.nr_contexts < num_possible_cpus())) > > goto out_iounmap; > > > > plic.irqdomain = irq_domain_add_linear(node, plic.nr_irqs + 1, > > @@ -202,7 +202,7 @@ static int __init plic_init(struct device_node *node, > > if (WARN_ON(!plic.irqdomain)) > > goto out_iounmap; > > > > - for (i = 0; i < plic.nr_handlers; i++) { > > + for (i = 0; i < plic.nr_contexts; i++) { > > struct of_phandle_args parent; > > struct plic_handler *handler; > > irq_hw_number_t hwirq; > > @@ -225,6 +225,11 @@ static int __init plic_init(struct device_node *node, > > > > cpu = riscv_hartid_to_cpuid(hartid); > > handler = per_cpu_ptr(&plic_handlers, cpu); > > + if (handler->present) { > > + pr_warn("handler not available for context %d.\n", i); > > + continue; > > + } > > + > > Ahh you have the handler->present check here in this patch. This should > be in the 2nd patch. This change doesn't match the commit text anyways. Sure, will do. > > Everything else just variable renaming which can be separated. > nr_handlers->nr_contexts > nr_mapped->nr_handlers > Sure, will update commit text. Thanks, Anup
diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c index 95b4b92ca9b8..ffd4deaca057 100644 --- a/drivers/irqchip/irq-sifive-plic.c +++ b/drivers/irqchip/irq-sifive-plic.c @@ -66,8 +66,8 @@ static DEFINE_PER_CPU(struct plic_handler, plic_handlers); struct plic_hw { u32 nr_irqs; + u32 nr_contexts; u32 nr_handlers; - u32 nr_mapped; void __iomem *regs; struct irq_domain *irqdomain; }; @@ -191,10 +191,10 @@ static int __init plic_init(struct device_node *node, if (WARN_ON(!plic.nr_irqs)) goto out_iounmap; - plic.nr_handlers = of_irq_count(node); - if (WARN_ON(!plic.nr_handlers)) + plic.nr_contexts = of_irq_count(node); + if (WARN_ON(!plic.nr_contexts)) goto out_iounmap; - if (WARN_ON(plic.nr_handlers < num_possible_cpus())) + if (WARN_ON(plic.nr_contexts < num_possible_cpus())) goto out_iounmap; plic.irqdomain = irq_domain_add_linear(node, plic.nr_irqs + 1, @@ -202,7 +202,7 @@ static int __init plic_init(struct device_node *node, if (WARN_ON(!plic.irqdomain)) goto out_iounmap; - for (i = 0; i < plic.nr_handlers; i++) { + for (i = 0; i < plic.nr_contexts; i++) { struct of_phandle_args parent; struct plic_handler *handler; irq_hw_number_t hwirq; @@ -225,6 +225,11 @@ static int __init plic_init(struct device_node *node, cpu = riscv_hartid_to_cpuid(hartid); handler = per_cpu_ptr(&plic_handlers, cpu); + if (handler->present) { + pr_warn("handler not available for context %d.\n", i); + continue; + } + handler->present = true; handler->hart_base = plic.regs + CONTEXT_BASE + i * CONTEXT_PER_HART; @@ -237,11 +242,11 @@ static int __init plic_init(struct device_node *node, for (hwirq = 1; hwirq <= plic.nr_irqs; hwirq++) plic_toggle(handler, hwirq, 0); - plic.nr_mapped++; + plic.nr_handlers++; } - pr_info("mapped %d interrupts to %d (out of %d) handlers.\n", - plic.nr_irqs, plic.nr_mapped, plic.nr_handlers); + pr_info("mapped %d interrupts with %d handlers for %d contexts.\n", + plic.nr_irqs, plic.nr_handlers, plic.nr_contexts); set_handle_irq(plic_handle_irq); return 0;
We explicitly differentiate between PLIC handler and context because PLIC context is for given mode of HART whereas PLIC handler is per-CPU software construct meant for handling interrupts from a particular PLIC context. Signed-off-by: Anup Patel <anup@brainfault.org> --- drivers/irqchip/irq-sifive-plic.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)