/* * Using ACPI? There is no MBI support in the spec, you * shouldn't even be here.
*/ if (!is_of_node(domain->parent->fwnode)) return -EINVAL;
/* * Let's default to edge. This is consistent with traditional * MSIs, and systems requiring level signaling will just * enforce the trigger on their own.
*/
fwspec.fwnode = domain->parent->fwnode;
fwspec.param_count = 3;
fwspec.param[0] = 0;
fwspec.param[1] = hwirq - 32;
fwspec.param[2] = IRQ_TYPE_EDGE_RISING;
err = irq_domain_alloc_irqs_parent(domain, virq, 1, &fwspec); if (err) return err;
d = irq_domain_get_irq_data(domain->parent, virq); return d->chip->irq_set_type(d, IRQ_TYPE_EDGE_RISING);
}
int __init mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent)
{ struct device_node *np; const __be32 *reg; int ret, n;
np = to_of_node(fwnode);
if (!of_property_read_bool(np, "msi-controller")) return 0;
n = of_property_count_elems_of_size(np, "mbi-ranges", sizeof(u32)); if (n <= 0 || n % 2) return -EINVAL;
mbi_range_nr = n / 2;
mbi_ranges = kcalloc(mbi_range_nr, sizeof(*mbi_ranges), GFP_KERNEL); if (!mbi_ranges) return -ENOMEM;
for (n = 0; n < mbi_range_nr; n++) {
ret = of_property_read_u32_index(np, "mbi-ranges", n * 2,
&mbi_ranges[n].spi_start); if (ret) goto err_free_mbi;
ret = of_property_read_u32_index(np, "mbi-ranges", n * 2 + 1,
&mbi_ranges[n].nr_spis); if (ret) goto err_free_mbi;
mbi_ranges[n].bm = bitmap_zalloc(mbi_ranges[n].nr_spis, GFP_KERNEL); if (!mbi_ranges[n].bm) {
ret = -ENOMEM; goto err_free_mbi;
}
pr_info("MBI range [%d:%d]\n", mbi_ranges[n].spi_start,
mbi_ranges[n].spi_start + mbi_ranges[n].nr_spis - 1);
}
reg = of_get_property(np, "mbi-alias", NULL); if (reg) {
mbi_phys_base = of_translate_address(np, reg); if (mbi_phys_base == (phys_addr_t)OF_BAD_ADDR) {
ret = -ENXIO; goto err_free_mbi;
}
} else { struct resource res;
if (of_address_to_resource(np, 0, &res)) {
ret = -ENXIO; goto err_free_mbi;
}
mbi_phys_base = res.start;
}
pr_info("Using MBI frame %pa\n", &mbi_phys_base);
ret = mbi_allocate_domain(parent); if (ret) goto err_free_mbi;
return 0;
err_free_mbi: if (mbi_ranges) { for (n = 0; n < mbi_range_nr; n++)
bitmap_free(mbi_ranges[n].bm);
kfree(mbi_ranges);
}
return ret;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
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.