Lines Matching refs:v2m
107 struct v2m_data *v2m = irq_data_get_irq_chip_data(data); in gicv2m_compose_msi_msg() local
108 phys_addr_t addr = v2m->res.start + V2M_MSI_SETSPI_NS; in gicv2m_compose_msi_msg()
114 if (v2m->flags & GICV2M_NEEDS_SPI_OFFSET) in gicv2m_compose_msi_msg()
115 msg->data -= v2m->spi_start; in gicv2m_compose_msi_msg()
155 static void gicv2m_unalloc_msi(struct v2m_data *v2m, unsigned int hwirq) in gicv2m_unalloc_msi() argument
159 pos = hwirq - v2m->spi_start; in gicv2m_unalloc_msi()
160 if (pos < 0 || pos >= v2m->nr_spis) { in gicv2m_unalloc_msi()
166 __clear_bit(pos, v2m->bm); in gicv2m_unalloc_msi()
173 struct v2m_data *v2m = NULL, *tmp; in gicv2m_irq_domain_alloc() local
181 v2m = tmp; in gicv2m_irq_domain_alloc()
187 if (!v2m) in gicv2m_irq_domain_alloc()
190 hwirq = v2m->spi_start + offset; in gicv2m_irq_domain_alloc()
194 gicv2m_unalloc_msi(v2m, hwirq); in gicv2m_irq_domain_alloc()
199 &gicv2m_irq_chip, v2m); in gicv2m_irq_domain_alloc()
208 struct v2m_data *v2m = irq_data_get_irq_chip_data(d); in gicv2m_irq_domain_free() local
211 gicv2m_unalloc_msi(v2m, d->hwirq); in gicv2m_irq_domain_free()
251 struct v2m_data *v2m, *tmp; in gicv2m_teardown() local
253 list_for_each_entry_safe(v2m, tmp, &v2m_nodes, entry) { in gicv2m_teardown()
254 list_del(&v2m->entry); in gicv2m_teardown()
255 kfree(v2m->bm); in gicv2m_teardown()
256 iounmap(v2m->base); in gicv2m_teardown()
257 of_node_put(v2m->node); in gicv2m_teardown()
258 kfree(v2m); in gicv2m_teardown()
265 struct v2m_data *v2m; in gicv2m_allocate_domains() local
267 v2m = list_first_entry_or_null(&v2m_nodes, struct v2m_data, entry); in gicv2m_allocate_domains()
268 if (!v2m) in gicv2m_allocate_domains()
271 inner_domain = irq_domain_create_tree(of_node_to_fwnode(v2m->node), in gicv2m_allocate_domains()
272 &gicv2m_domain_ops, v2m); in gicv2m_allocate_domains()
280 pci_domain = pci_msi_create_irq_domain(of_node_to_fwnode(v2m->node), in gicv2m_allocate_domains()
283 plat_domain = platform_msi_create_irq_domain(of_node_to_fwnode(v2m->node), in gicv2m_allocate_domains()
303 struct v2m_data *v2m; in gicv2m_init_one() local
305 v2m = kzalloc(sizeof(struct v2m_data), GFP_KERNEL); in gicv2m_init_one()
306 if (!v2m) { in gicv2m_init_one()
311 INIT_LIST_HEAD(&v2m->entry); in gicv2m_init_one()
312 v2m->node = node; in gicv2m_init_one()
314 ret = of_address_to_resource(node, 0, &v2m->res); in gicv2m_init_one()
320 v2m->base = ioremap(v2m->res.start, resource_size(&v2m->res)); in gicv2m_init_one()
321 if (!v2m->base) { in gicv2m_init_one()
327 if (!of_property_read_u32(node, "arm,msi-base-spi", &v2m->spi_start) && in gicv2m_init_one()
328 !of_property_read_u32(node, "arm,msi-num-spis", &v2m->nr_spis)) { in gicv2m_init_one()
330 v2m->spi_start, v2m->nr_spis); in gicv2m_init_one()
332 u32 typer = readl_relaxed(v2m->base + V2M_MSI_TYPER); in gicv2m_init_one()
334 v2m->spi_start = V2M_MSI_TYPER_BASE_SPI(typer); in gicv2m_init_one()
335 v2m->nr_spis = V2M_MSI_TYPER_NUM_SPI(typer); in gicv2m_init_one()
338 if (!is_msi_spi_valid(v2m->spi_start, v2m->nr_spis)) { in gicv2m_init_one()
351 if (readl_relaxed(v2m->base + V2M_MSI_IIDR) == XGENE_GICV2M_MSI_IIDR) in gicv2m_init_one()
352 v2m->flags |= GICV2M_NEEDS_SPI_OFFSET; in gicv2m_init_one()
354 v2m->bm = kzalloc(sizeof(long) * BITS_TO_LONGS(v2m->nr_spis), in gicv2m_init_one()
356 if (!v2m->bm) { in gicv2m_init_one()
361 list_add_tail(&v2m->entry, &v2m_nodes); in gicv2m_init_one()
363 (unsigned long)v2m->res.start, (unsigned long)v2m->res.end, in gicv2m_init_one()
364 v2m->spi_start, (v2m->spi_start + v2m->nr_spis)); in gicv2m_init_one()
369 iounmap(v2m->base); in gicv2m_init_one()
371 kfree(v2m); in gicv2m_init_one()