Lines Matching refs:v2m
3 * ARM GIC v2m MSI(-X) support
56 /* List of flags for specific v2m implementation */
72 u32 flags; /* v2m flags for specific implementation */
100 static phys_addr_t gicv2m_get_msi_addr(struct v2m_data *v2m, int hwirq)
102 if (v2m->flags & GICV2M_GRAVITON_ADDRESS_ONLY)
103 return v2m->res.start | ((hwirq - 32) << 3);
105 return v2m->res.start + V2M_MSI_SETSPI_NS;
110 struct v2m_data *v2m = irq_data_get_irq_chip_data(data);
111 phys_addr_t addr = gicv2m_get_msi_addr(v2m, data->hwirq);
116 if (v2m->flags & GICV2M_GRAVITON_ADDRESS_ONLY)
120 if (v2m->flags & GICV2M_NEEDS_SPI_OFFSET)
121 msg->data -= v2m->spi_offset;
168 static void gicv2m_unalloc_msi(struct v2m_data *v2m, unsigned int hwirq,
172 bitmap_release_region(v2m->bm, hwirq - v2m->spi_start,
181 struct v2m_data *v2m = NULL, *tmp;
189 v2m = tmp;
195 if (!v2m)
198 hwirq = v2m->spi_start + offset;
201 gicv2m_get_msi_addr(v2m, hwirq));
211 &gicv2m_irq_chip, v2m);
218 gicv2m_unalloc_msi(v2m, hwirq, nr_irqs);
226 struct v2m_data *v2m = irq_data_get_irq_chip_data(d);
228 gicv2m_unalloc_msi(v2m, d->hwirq, nr_irqs);
268 struct v2m_data *v2m, *tmp;
270 list_for_each_entry_safe(v2m, tmp, &v2m_nodes, entry) {
271 list_del(&v2m->entry);
272 bitmap_free(v2m->bm);
273 iounmap(v2m->base);
274 of_node_put(to_of_node(v2m->fwnode));
275 if (is_fwnode_irqchip(v2m->fwnode))
276 irq_domain_free_fwnode(v2m->fwnode);
277 kfree(v2m);
284 struct v2m_data *v2m;
286 v2m = list_first_entry_or_null(&v2m_nodes, struct v2m_data, entry);
287 if (!v2m)
290 inner_domain = irq_domain_create_hierarchy(parent, 0, 0, v2m->fwnode,
291 &gicv2m_domain_ops, v2m);
298 pci_domain = pci_msi_create_irq_domain(v2m->fwnode,
301 plat_domain = platform_msi_create_irq_domain(v2m->fwnode,
322 struct v2m_data *v2m;
324 v2m = kzalloc(sizeof(struct v2m_data), GFP_KERNEL);
325 if (!v2m)
328 INIT_LIST_HEAD(&v2m->entry);
329 v2m->fwnode = fwnode;
330 v2m->flags = flags;
332 memcpy(&v2m->res, res, sizeof(struct resource));
334 v2m->base = ioremap(v2m->res.start, resource_size(&v2m->res));
335 if (!v2m->base) {
342 v2m->spi_start = spi_start;
343 v2m->nr_spis = nr_spis;
348 if (v2m->flags & GICV2M_GRAVITON_ADDRESS_ONLY) {
352 typer = readl_relaxed(v2m->base + V2M_MSI_TYPER);
354 v2m->spi_start = V2M_MSI_TYPER_BASE_SPI(typer);
355 v2m->nr_spis = V2M_MSI_TYPER_NUM_SPI(typer);
358 if (!is_msi_spi_valid(v2m->spi_start, v2m->nr_spis)) {
376 if (!(v2m->flags & GICV2M_GRAVITON_ADDRESS_ONLY)) {
377 switch (readl_relaxed(v2m->base + V2M_MSI_IIDR)) {
379 v2m->flags |= GICV2M_NEEDS_SPI_OFFSET;
380 v2m->spi_offset = v2m->spi_start;
383 v2m->flags |= GICV2M_NEEDS_SPI_OFFSET;
384 v2m->spi_offset = 32;
388 v2m->bm = bitmap_zalloc(v2m->nr_spis, GFP_KERNEL);
389 if (!v2m->bm) {
394 list_add_tail(&v2m->entry, &v2m_nodes);
397 v2m->spi_start, (v2m->spi_start + v2m->nr_spis - 1));
401 iounmap(v2m->base);
403 kfree(v2m);
408 { .compatible = "arm,gic-v2m-frame", },
429 pr_err("Failed to allocate v2m resource.\n");