Lines Matching refs:msi_data

39 	struct ls_scfg_msi *msi_data;  member
90 struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(data); in ls_scfg_msi_compose_msg() local
92 msg->address_hi = upper_32_bits(msi_data->msiir_addr); in ls_scfg_msi_compose_msg()
93 msg->address_lo = lower_32_bits(msi_data->msiir_addr); in ls_scfg_msi_compose_msg()
109 struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(irq_data); in ls_scfg_msi_set_affinity() local
120 if (cpu >= msi_data->msir_num) in ls_scfg_msi_set_affinity()
123 if (msi_data->msir[cpu].gic_irq <= 0) { in ls_scfg_msi_set_affinity()
144 struct ls_scfg_msi *msi_data = domain->host_data; in ls_scfg_msi_domain_irq_alloc() local
149 spin_lock(&msi_data->lock); in ls_scfg_msi_domain_irq_alloc()
150 pos = find_first_zero_bit(msi_data->used, msi_data->irqs_num); in ls_scfg_msi_domain_irq_alloc()
151 if (pos < msi_data->irqs_num) in ls_scfg_msi_domain_irq_alloc()
152 __set_bit(pos, msi_data->used); in ls_scfg_msi_domain_irq_alloc()
155 spin_unlock(&msi_data->lock); in ls_scfg_msi_domain_irq_alloc()
161 &ls_scfg_msi_parent_chip, msi_data, in ls_scfg_msi_domain_irq_alloc()
171 struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(d); in ls_scfg_msi_domain_irq_free() local
175 if (pos < 0 || pos >= msi_data->irqs_num) { in ls_scfg_msi_domain_irq_free()
180 spin_lock(&msi_data->lock); in ls_scfg_msi_domain_irq_free()
181 __clear_bit(pos, msi_data->used); in ls_scfg_msi_domain_irq_free()
182 spin_unlock(&msi_data->lock); in ls_scfg_msi_domain_irq_free()
193 struct ls_scfg_msi *msi_data = msir->msi_data; in ls_scfg_msi_irq_handler() local
205 hwirq = ((msir->bit_end - pos) << msi_data->cfg->ibs_shift) | in ls_scfg_msi_irq_handler()
207 virq = irq_find_mapping(msi_data->parent, hwirq); in ls_scfg_msi_irq_handler()
215 static int ls_scfg_msi_domains_init(struct ls_scfg_msi *msi_data) in ls_scfg_msi_domains_init() argument
218 msi_data->parent = irq_domain_add_linear(NULL, in ls_scfg_msi_domains_init()
219 msi_data->irqs_num, in ls_scfg_msi_domains_init()
221 msi_data); in ls_scfg_msi_domains_init()
222 if (!msi_data->parent) { in ls_scfg_msi_domains_init()
223 dev_err(&msi_data->pdev->dev, "failed to create IRQ domain\n"); in ls_scfg_msi_domains_init()
227 msi_data->msi_domain = pci_msi_create_irq_domain( in ls_scfg_msi_domains_init()
228 of_node_to_fwnode(msi_data->pdev->dev.of_node), in ls_scfg_msi_domains_init()
230 msi_data->parent); in ls_scfg_msi_domains_init()
231 if (!msi_data->msi_domain) { in ls_scfg_msi_domains_init()
232 dev_err(&msi_data->pdev->dev, "failed to create MSI domain\n"); in ls_scfg_msi_domains_init()
233 irq_domain_remove(msi_data->parent); in ls_scfg_msi_domains_init()
240 static int ls_scfg_msi_setup_hwirq(struct ls_scfg_msi *msi_data, int index) in ls_scfg_msi_setup_hwirq() argument
245 virq = platform_get_irq(msi_data->pdev, index); in ls_scfg_msi_setup_hwirq()
249 msir = &msi_data->msir[index]; in ls_scfg_msi_setup_hwirq()
251 msir->msi_data = msi_data; in ls_scfg_msi_setup_hwirq()
253 msir->reg = msi_data->regs + msi_data->cfg->msir_base + 4 * index; in ls_scfg_msi_setup_hwirq()
255 if (msi_data->cfg->msir_irqs == MSI_LS1043V1_1_IRQS_PER_MSIR) { in ls_scfg_msi_setup_hwirq()
262 msir->bit_end = msi_data->cfg->msir_irqs - 1; in ls_scfg_msi_setup_hwirq()
278 for (i = 0; i < msi_data->cfg->msir_irqs; i++) { in ls_scfg_msi_setup_hwirq()
279 hwirq = i << msi_data->cfg->ibs_shift | msir->index; in ls_scfg_msi_setup_hwirq()
280 bitmap_clear(msi_data->used, hwirq, 1); in ls_scfg_msi_setup_hwirq()
289 struct ls_scfg_msi *msi_data = msir->msi_data; in ls_scfg_msi_teardown_hwirq() local
295 for (i = 0; i < msi_data->cfg->msir_irqs; i++) { in ls_scfg_msi_teardown_hwirq()
296 hwirq = i << msi_data->cfg->ibs_shift | msir->index; in ls_scfg_msi_teardown_hwirq()
297 bitmap_set(msi_data->used, hwirq, 1); in ls_scfg_msi_teardown_hwirq()
338 struct ls_scfg_msi *msi_data; in ls_scfg_msi_probe() local
346 msi_data = devm_kzalloc(&pdev->dev, sizeof(*msi_data), GFP_KERNEL); in ls_scfg_msi_probe()
347 if (!msi_data) in ls_scfg_msi_probe()
350 msi_data->cfg = (struct ls_scfg_msi_cfg *) match->data; in ls_scfg_msi_probe()
353 msi_data->regs = devm_ioremap_resource(&pdev->dev, res); in ls_scfg_msi_probe()
354 if (IS_ERR(msi_data->regs)) { in ls_scfg_msi_probe()
356 return PTR_ERR(msi_data->regs); in ls_scfg_msi_probe()
358 msi_data->msiir_addr = res->start; in ls_scfg_msi_probe()
360 msi_data->pdev = pdev; in ls_scfg_msi_probe()
361 spin_lock_init(&msi_data->lock); in ls_scfg_msi_probe()
363 msi_data->irqs_num = MSI_IRQS_PER_MSIR * in ls_scfg_msi_probe()
364 (1 << msi_data->cfg->ibs_shift); in ls_scfg_msi_probe()
365 msi_data->used = devm_kcalloc(&pdev->dev, in ls_scfg_msi_probe()
366 BITS_TO_LONGS(msi_data->irqs_num), in ls_scfg_msi_probe()
367 sizeof(*msi_data->used), in ls_scfg_msi_probe()
369 if (!msi_data->used) in ls_scfg_msi_probe()
375 bitmap_set(msi_data->used, 0, msi_data->irqs_num); in ls_scfg_msi_probe()
377 msi_data->msir_num = of_irq_count(pdev->dev.of_node); in ls_scfg_msi_probe()
383 if (msi_data->msir_num >= cpu_num) in ls_scfg_msi_probe()
384 msi_data->msir_num = cpu_num; in ls_scfg_msi_probe()
389 msi_data->msir = devm_kcalloc(&pdev->dev, msi_data->msir_num, in ls_scfg_msi_probe()
390 sizeof(*msi_data->msir), in ls_scfg_msi_probe()
392 if (!msi_data->msir) in ls_scfg_msi_probe()
395 for (i = 0; i < msi_data->msir_num; i++) in ls_scfg_msi_probe()
396 ls_scfg_msi_setup_hwirq(msi_data, i); in ls_scfg_msi_probe()
398 ret = ls_scfg_msi_domains_init(msi_data); in ls_scfg_msi_probe()
402 platform_set_drvdata(pdev, msi_data); in ls_scfg_msi_probe()
409 struct ls_scfg_msi *msi_data = platform_get_drvdata(pdev); in ls_scfg_msi_remove() local
412 for (i = 0; i < msi_data->msir_num; i++) in ls_scfg_msi_remove()
413 ls_scfg_msi_teardown_hwirq(&msi_data->msir[i]); in ls_scfg_msi_remove()
415 irq_domain_remove(msi_data->msi_domain); in ls_scfg_msi_remove()
416 irq_domain_remove(msi_data->parent); in ls_scfg_msi_remove()