Lines Matching refs:msi_data

36 	struct ls_scfg_msi *msi_data;
87 struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(data);
89 msg->address_hi = upper_32_bits(msi_data->msiir_addr);
90 msg->address_lo = lower_32_bits(msi_data->msiir_addr);
106 struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(irq_data);
117 if (cpu >= msi_data->msir_num)
120 if (msi_data->msir[cpu].gic_irq <= 0) {
142 struct ls_scfg_msi *msi_data = domain->host_data;
147 spin_lock(&msi_data->lock);
148 pos = find_first_zero_bit(msi_data->used, msi_data->irqs_num);
149 if (pos < msi_data->irqs_num)
150 __set_bit(pos, msi_data->used);
153 spin_unlock(&msi_data->lock);
158 err = iommu_dma_prepare_msi(info->desc, msi_data->msiir_addr);
163 &ls_scfg_msi_parent_chip, msi_data,
173 struct ls_scfg_msi *msi_data = irq_data_get_irq_chip_data(d);
177 if (pos < 0 || pos >= msi_data->irqs_num) {
182 spin_lock(&msi_data->lock);
183 __clear_bit(pos, msi_data->used);
184 spin_unlock(&msi_data->lock);
195 struct ls_scfg_msi *msi_data = msir->msi_data;
207 hwirq = ((msir->bit_end - pos) << msi_data->cfg->ibs_shift) |
209 generic_handle_domain_irq(msi_data->parent, hwirq);
215 static int ls_scfg_msi_domains_init(struct ls_scfg_msi *msi_data)
218 msi_data->parent = irq_domain_add_linear(NULL,
219 msi_data->irqs_num,
221 msi_data);
222 if (!msi_data->parent) {
223 dev_err(&msi_data->pdev->dev, "failed to create IRQ domain\n");
227 msi_data->msi_domain = pci_msi_create_irq_domain(
228 of_node_to_fwnode(msi_data->pdev->dev.of_node),
230 msi_data->parent);
231 if (!msi_data->msi_domain) {
232 dev_err(&msi_data->pdev->dev, "failed to create MSI domain\n");
233 irq_domain_remove(msi_data->parent);
240 static int ls_scfg_msi_setup_hwirq(struct ls_scfg_msi *msi_data, int index)
245 virq = platform_get_irq(msi_data->pdev, index);
249 msir = &msi_data->msir[index];
251 msir->msi_data = msi_data;
253 msir->reg = msi_data->regs + msi_data->cfg->msir_base + 4 * index;
255 if (msi_data->cfg->msir_irqs == MSI_LS1043V1_1_IRQS_PER_MSIR) {
262 msir->bit_end = msi_data->cfg->msir_irqs - 1;
278 for (i = 0; i < msi_data->cfg->msir_irqs; i++) {
279 hwirq = i << msi_data->cfg->ibs_shift | msir->index;
280 bitmap_clear(msi_data->used, hwirq, 1);
289 struct ls_scfg_msi *msi_data = msir->msi_data;
295 for (i = 0; i < msi_data->cfg->msir_irqs; i++) {
296 hwirq = i << msi_data->cfg->ibs_shift | msir->index;
297 bitmap_set(msi_data->used, hwirq, 1);
338 struct ls_scfg_msi *msi_data;
346 msi_data = devm_kzalloc(&pdev->dev, sizeof(*msi_data), GFP_KERNEL);
347 if (!msi_data)
350 msi_data->cfg = (struct ls_scfg_msi_cfg *) match->data;
352 msi_data->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
353 if (IS_ERR(msi_data->regs)) {
355 return PTR_ERR(msi_data->regs);
357 msi_data->msiir_addr = res->start;
359 msi_data->pdev = pdev;
360 spin_lock_init(&msi_data->lock);
362 msi_data->irqs_num = MSI_IRQS_PER_MSIR *
363 (1 << msi_data->cfg->ibs_shift);
364 msi_data->used = devm_bitmap_zalloc(&pdev->dev, msi_data->irqs_num, GFP_KERNEL);
365 if (!msi_data->used)
371 bitmap_set(msi_data->used, 0, msi_data->irqs_num);
373 msi_data->msir_num = of_irq_count(pdev->dev.of_node);
379 if (msi_data->msir_num >= cpu_num)
380 msi_data->msir_num = cpu_num;
385 msi_data->msir = devm_kcalloc(&pdev->dev, msi_data->msir_num,
386 sizeof(*msi_data->msir),
388 if (!msi_data->msir)
391 for (i = 0; i < msi_data->msir_num; i++)
392 ls_scfg_msi_setup_hwirq(msi_data, i);
394 ret = ls_scfg_msi_domains_init(msi_data);
398 platform_set_drvdata(pdev, msi_data);
405 struct ls_scfg_msi *msi_data = platform_get_drvdata(pdev);
408 for (i = 0; i < msi_data->msir_num; i++)
409 ls_scfg_msi_teardown_hwirq(&msi_data->msir[i]);
411 irq_domain_remove(msi_data->msi_domain);
412 irq_domain_remove(msi_data->parent);