Lines Matching +full:per +full:- +full:hart

1 // SPDX-License-Identifier: GPL-2.0
14 #include <linux/irqchip/riscv-aplic.h>
20 #include "irq-riscv-aplic-main.h"
61 cpu = cpumask_first_and(&direct->lmask, mask_val); in aplic_direct_set_affinity()
63 cpu = cpumask_first_and_and(&direct->lmask, mask_val, cpu_online_mask); in aplic_direct_set_affinity()
66 return -EINVAL; in aplic_direct_set_affinity()
69 target = priv->regs + APLIC_TARGET_BASE + (d->hwirq - 1) * sizeof(u32); in aplic_direct_set_affinity()
70 val = FIELD_PREP(APLIC_TARGET_HART_IDX, idc->hart_index); in aplic_direct_set_affinity()
81 .name = "APLIC-DIRECT",
97 struct aplic_priv *priv = d->host_data; in aplic_direct_irqdomain_translate()
99 return aplic_irqdomain_translate(fwspec, priv->gsi_base, hwirq, type); in aplic_direct_irqdomain_translate()
105 struct aplic_priv *priv = domain->host_data; in aplic_direct_irqdomain_alloc()
112 ret = aplic_irqdomain_translate(fwspec, priv->gsi_base, &hwirq, &type); in aplic_direct_irqdomain_alloc()
119 irq_set_affinity(virq + i, &direct->lmask); in aplic_direct_irqdomain_alloc()
140 struct irq_domain *irqdomain = idc->direct->irqdomain; in aplic_direct_handle_irq()
147 while ((hw_irq = readl(idc->regs + APLIC_IDC_CLAIMI))) { in aplic_direct_handle_irq()
152 dev_warn_ratelimited(idc->direct->priv.dev, in aplic_direct_handle_irq()
168 writel(th, idc->regs + APLIC_IDC_ITHRESHOLD); in aplic_idc_set_delivery()
171 writel(de, idc->regs + APLIC_IDC_IDELIVERY); in aplic_idc_set_delivery()
200 if (!is_of_node(dev->fwnode)) { in aplic_direct_parse_parent_hwirq()
201 hartid = acpi_rintc_ext_parent_to_hartid(priv->acpi_aplic_id, index); in aplic_direct_parse_parent_hwirq()
203 return -ENODEV; in aplic_direct_parse_parent_hwirq()
210 rc = of_irq_parse_one(to_of_node(dev->fwnode), index, &parent); in aplic_direct_parse_parent_hwirq()
234 return -ENOMEM; in aplic_direct_setup()
235 priv = &direct->priv; in aplic_direct_setup()
243 /* Setup per-CPU IDC and target CPU mask */ in aplic_direct_setup()
245 for (i = 0; i < priv->nr_idcs; i++) { in aplic_direct_setup()
265 cpumask_set_cpu(cpu, &direct->lmask); in aplic_direct_setup()
268 rc = riscv_get_hart_index(dev->fwnode, i, &idc->hart_index); in aplic_direct_setup()
270 dev_warn(dev, "hart index not found for IDC%d\n", i); in aplic_direct_setup()
273 idc->regs = priv->regs + APLIC_IDC_BASE + idc->hart_index * APLIC_IDC_SIZE; in aplic_direct_setup()
274 idc->direct = direct; in aplic_direct_setup()
282 if (cpu == current_cpu && idc->hart_index) { in aplic_direct_setup()
283 v = FIELD_PREP(APLIC_TARGET_HART_IDX, idc->hart_index); in aplic_direct_setup()
285 for (j = 1; j <= priv->nr_irqs; j++) in aplic_direct_setup()
286 writel(v, priv->regs + APLIC_TARGET_BASE + (j - 1) * sizeof(u32)); in aplic_direct_setup()
315 return -ENODEV; in aplic_direct_setup()
321 direct->irqdomain = irq_domain_create_linear(dev->fwnode, priv->nr_irqs + 1, in aplic_direct_setup()
323 if (!direct->irqdomain) { in aplic_direct_setup()
325 return -ENOMEM; in aplic_direct_setup()
330 priv->nr_irqs, priv->nr_idcs); in aplic_direct_setup()