ret = aplic_irqdomain_translate(fwspec, priv->gsi_base, &hwirq, &type); if (ret) return ret;
for (i = 0; i < nr_irqs; i++) {
irq_domain_set_info(domain, virq + i, hwirq + i, &aplic_direct_chip,
priv, handle_fasteoi_irq, NULL, NULL);
irq_set_affinity(virq + i, &direct->lmask);
}
direct = devm_kzalloc(dev, sizeof(*direct), GFP_KERNEL); if (!direct) return -ENOMEM;
priv = &direct->priv;
rc = aplic_setup_priv(priv, dev, regs); if (rc) {
dev_err(dev, "failed to create APLIC context\n"); return rc;
}
/* Setup per-CPU IDC and target CPU mask */
current_cpu = get_cpu(); for (i = 0; i < priv->nr_idcs; i++) {
rc = aplic_direct_parse_parent_hwirq(dev, i, &hwirq, &hartid, priv); if (rc) {
dev_warn(dev, "parent irq for IDC%d not found\n", i); continue;
}
/* *Skipinterruptsotherthanexternalinterruptsfor *currentprivilegelevel.
*/ if (hwirq != RV_IRQ_EXT) continue;
cpu = riscv_hartid_to_cpuid(hartid); if (cpu < 0) {
dev_warn(dev, "invalid cpuid for IDC%d\n", i); continue;
}
cpumask_set_cpu(cpu, &direct->lmask);
idc = per_cpu_ptr(&aplic_idcs, cpu);
rc = riscv_get_hart_index(dev->fwnode, i, &idc->hart_index); if (rc) {
dev_warn(dev, "hart index not found for IDC%d\n", i); continue;
}
idc->regs = priv->regs + APLIC_IDC_BASE + idc->hart_index * APLIC_IDC_SIZE;
idc->direct = direct;
aplic_idc_set_delivery(idc, true);
/* *BootcpumightnothaveAPLIChart_index=0socheck *andupdatetargetregistersofallinterrupts.
*/ if (cpu == current_cpu && idc->hart_index) {
v = FIELD_PREP(APLIC_TARGET_HART_IDX, idc->hart_index);
v |= FIELD_PREP(APLIC_TARGET_IPRIO, APLIC_DEFAULT_PRIORITY); for (j = 1; j <= priv->nr_irqs; j++)
writel(v, priv->regs + APLIC_TARGET_BASE + (j - 1) * sizeof(u32));
}
setup_count++;
}
put_cpu();
/* Find parent domain and register chained handler */
domain = irq_find_matching_fwnode(riscv_get_intc_hwnode(),
DOMAIN_BUS_ANY); if (!aplic_direct_parent_irq && domain) {
aplic_direct_parent_irq = irq_create_mapping(domain, RV_IRQ_EXT); if (aplic_direct_parent_irq) {
irq_set_chained_handler(aplic_direct_parent_irq,
aplic_direct_handle_irq);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.