Skip to content

Commit d86a6d4

Browse files
committed
bus: fsl-mc: fsl-mc-allocator: Rework MSI handling
Storing a pointer to the MSI descriptor just to track the Linux interrupt number is daft. Just store the interrupt number and be done with it. Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Greg Kroah-Hartman <[email protected]> Reviewed-by: Jason Gunthorpe <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent d722e9a commit d86a6d4

File tree

9 files changed

+22
-30
lines changed

9 files changed

+22
-30
lines changed

drivers/bus/fsl-mc/dprc-driver.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ static irqreturn_t dprc_irq0_handler_thread(int irq_num, void *arg)
400400
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
401401
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
402402
struct fsl_mc_io *mc_io = mc_dev->mc_io;
403-
struct msi_desc *msi_desc = mc_dev->irqs[0]->msi_desc;
403+
int irq = mc_dev->irqs[0]->virq;
404404

405405
dev_dbg(dev, "DPRC IRQ %d triggered on CPU %u\n",
406406
irq_num, smp_processor_id());
@@ -409,7 +409,7 @@ static irqreturn_t dprc_irq0_handler_thread(int irq_num, void *arg)
409409
return IRQ_HANDLED;
410410

411411
mutex_lock(&mc_bus->scan_mutex);
412-
if (!msi_desc || msi_desc->irq != (u32)irq_num)
412+
if (irq != (u32)irq_num)
413413
goto out;
414414

415415
status = 0;
@@ -521,7 +521,7 @@ static int register_dprc_irq_handler(struct fsl_mc_device *mc_dev)
521521
* function that programs the MSI physically in the device
522522
*/
523523
error = devm_request_threaded_irq(&mc_dev->dev,
524-
irq->msi_desc->irq,
524+
irq->virq,
525525
dprc_irq0_handler,
526526
dprc_irq0_handler_thread,
527527
IRQF_NO_SUSPEND | IRQF_ONESHOT,
@@ -771,7 +771,7 @@ static void dprc_teardown_irq(struct fsl_mc_device *mc_dev)
771771

772772
(void)disable_dprc_irq(mc_dev);
773773

774-
devm_free_irq(&mc_dev->dev, irq->msi_desc->irq, &mc_dev->dev);
774+
devm_free_irq(&mc_dev->dev, irq->virq, &mc_dev->dev);
775775

776776
fsl_mc_free_irqs(mc_dev);
777777
}

drivers/bus/fsl-mc/fsl-mc-allocator.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,6 @@ int fsl_mc_populate_irq_pool(struct fsl_mc_device *mc_bus_dev,
350350
unsigned int irq_count)
351351
{
352352
unsigned int i;
353-
struct msi_desc *msi_desc;
354353
struct fsl_mc_device_irq *irq_resources;
355354
struct fsl_mc_device_irq *mc_dev_irq;
356355
int error;
@@ -388,16 +387,12 @@ int fsl_mc_populate_irq_pool(struct fsl_mc_device *mc_bus_dev,
388387
mc_dev_irq->resource.type = res_pool->type;
389388
mc_dev_irq->resource.data = mc_dev_irq;
390389
mc_dev_irq->resource.parent_pool = res_pool;
390+
mc_dev_irq->virq = msi_get_virq(&mc_bus_dev->dev, i);
391+
mc_dev_irq->resource.id = mc_dev_irq->virq;
391392
INIT_LIST_HEAD(&mc_dev_irq->resource.node);
392393
list_add_tail(&mc_dev_irq->resource.node, &res_pool->free_list);
393394
}
394395

395-
for_each_msi_entry(msi_desc, &mc_bus_dev->dev) {
396-
mc_dev_irq = &irq_resources[msi_desc->msi_index];
397-
mc_dev_irq->msi_desc = msi_desc;
398-
mc_dev_irq->resource.id = msi_desc->irq;
399-
}
400-
401396
res_pool->max_count = irq_count;
402397
res_pool->free_count = irq_count;
403398
mc_bus->irq_resources = irq_resources;

drivers/bus/fsl-mc/fsl-mc-msi.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ static void fsl_mc_msi_update_dom_ops(struct msi_domain_info *info)
5858
}
5959

6060
static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
61-
struct fsl_mc_device_irq *mc_dev_irq)
61+
struct fsl_mc_device_irq *mc_dev_irq,
62+
struct msi_desc *msi_desc)
6263
{
6364
int error;
6465
struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev;
65-
struct msi_desc *msi_desc = mc_dev_irq->msi_desc;
6666
struct dprc_irq_cfg irq_cfg;
6767

6868
/*
@@ -129,7 +129,7 @@ static void fsl_mc_msi_write_msg(struct irq_data *irq_data,
129129
/*
130130
* Program the MSI (paddr, value) pair in the device:
131131
*/
132-
__fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq);
132+
__fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq, msi_desc);
133133
}
134134

135135
static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4246,7 +4246,7 @@ static int dpaa2_eth_setup_irqs(struct fsl_mc_device *ls_dev)
42464246
}
42474247

42484248
irq = ls_dev->irqs[0];
4249-
err = devm_request_threaded_irq(&ls_dev->dev, irq->msi_desc->irq,
4249+
err = devm_request_threaded_irq(&ls_dev->dev, irq->virq,
42504250
NULL, dpni_irq0_handler_thread,
42514251
IRQF_NO_SUSPEND | IRQF_ONESHOT,
42524252
dev_name(&ls_dev->dev), &ls_dev->dev);
@@ -4273,7 +4273,7 @@ static int dpaa2_eth_setup_irqs(struct fsl_mc_device *ls_dev)
42734273
return 0;
42744274

42754275
free_irq:
4276-
devm_free_irq(&ls_dev->dev, irq->msi_desc->irq, &ls_dev->dev);
4276+
devm_free_irq(&ls_dev->dev, irq->virq, &ls_dev->dev);
42774277
free_mc_irq:
42784278
fsl_mc_free_irqs(ls_dev);
42794279

drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ static irqreturn_t dpaa2_ptp_irq_handler_thread(int irq, void *priv)
129129
static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev)
130130
{
131131
struct device *dev = &mc_dev->dev;
132-
struct fsl_mc_device_irq *irq;
133132
struct ptp_qoriq *ptp_qoriq;
134133
struct device_node *node;
135134
void __iomem *base;
@@ -177,8 +176,7 @@ static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev)
177176
goto err_unmap;
178177
}
179178

180-
irq = mc_dev->irqs[0];
181-
ptp_qoriq->irq = irq->msi_desc->irq;
179+
ptp_qoriq->irq = mc_dev->irqs[0]->virq;
182180

183181
err = request_threaded_irq(ptp_qoriq->irq, NULL,
184182
dpaa2_ptp_irq_handler_thread,

drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,8 +1553,7 @@ static int dpaa2_switch_setup_irqs(struct fsl_mc_device *sw_dev)
15531553

15541554
irq = sw_dev->irqs[DPSW_IRQ_INDEX_IF];
15551555

1556-
err = devm_request_threaded_irq(dev, irq->msi_desc->irq,
1557-
NULL,
1556+
err = devm_request_threaded_irq(dev, irq->virq, NULL,
15581557
dpaa2_switch_irq0_handler_thread,
15591558
IRQF_NO_SUSPEND | IRQF_ONESHOT,
15601559
dev_name(dev), dev);
@@ -1580,7 +1579,7 @@ static int dpaa2_switch_setup_irqs(struct fsl_mc_device *sw_dev)
15801579
return 0;
15811580

15821581
free_devm_irq:
1583-
devm_free_irq(dev, irq->msi_desc->irq, dev);
1582+
devm_free_irq(dev, irq->virq, dev);
15841583
free_irq:
15851584
fsl_mc_free_irqs(sw_dev);
15861585
return err;

drivers/soc/fsl/dpio/dpio-driver.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static void unregister_dpio_irq_handlers(struct fsl_mc_device *dpio_dev)
8888
irq = dpio_dev->irqs[0];
8989

9090
/* clear the affinity hint */
91-
irq_set_affinity_hint(irq->msi_desc->irq, NULL);
91+
irq_set_affinity_hint(irq->virq, NULL);
9292
}
9393

9494
static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
@@ -98,7 +98,7 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
9898

9999
irq = dpio_dev->irqs[0];
100100
error = devm_request_irq(&dpio_dev->dev,
101-
irq->msi_desc->irq,
101+
irq->virq,
102102
dpio_irq_handler,
103103
0,
104104
dev_name(&dpio_dev->dev),
@@ -111,10 +111,10 @@ static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
111111
}
112112

113113
/* set the affinity hint */
114-
if (irq_set_affinity_hint(irq->msi_desc->irq, cpumask_of(cpu)))
114+
if (irq_set_affinity_hint(irq->virq, cpumask_of(cpu)))
115115
dev_err(&dpio_dev->dev,
116116
"irq_set_affinity failed irq %d cpu %d\n",
117-
irq->msi_desc->irq, cpu);
117+
irq->virq, cpu);
118118

119119
return 0;
120120
}

drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static int vfio_set_trigger(struct vfio_fsl_mc_device *vdev,
6767
int hwirq;
6868
int ret;
6969

70-
hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq;
70+
hwirq = vdev->mc_dev->irqs[index]->virq;
7171
if (irq->trigger) {
7272
free_irq(hwirq, irq);
7373
kfree(irq->name);
@@ -137,7 +137,7 @@ static int vfio_fsl_mc_set_irq_trigger(struct vfio_fsl_mc_device *vdev,
137137
return vfio_set_trigger(vdev, index, fd);
138138
}
139139

140-
hwirq = vdev->mc_dev->irqs[index]->msi_desc->irq;
140+
hwirq = vdev->mc_dev->irqs[index]->virq;
141141

142142
irq = &vdev->mc_irqs[index];
143143

include/linux/fsl/mc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ struct fsl_mc_resource {
9191

9292
/**
9393
* struct fsl_mc_device_irq - MC object device message-based interrupt
94-
* @msi_desc: pointer to MSI descriptor allocated by fsl_mc_msi_alloc_descs()
94+
* @virq: Linux virtual interrupt number
9595
* @mc_dev: MC object device that owns this interrupt
9696
* @dev_irq_index: device-relative IRQ index
9797
* @resource: MC generic resource associated with the interrupt
9898
*/
9999
struct fsl_mc_device_irq {
100-
struct msi_desc *msi_desc;
100+
unsigned int virq;
101101
struct fsl_mc_device *mc_dev;
102102
u8 dev_irq_index;
103103
struct fsl_mc_resource resource;

0 commit comments

Comments
 (0)