mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 00:20:32 +00:00
soc: fsl: qbman: Check if CPU is offline when initializing portals
If the CPU to affine the portal interrupt is offline at boot time affine the portal interrupt to another online CPU. If the CPU is later brought online the hotplug handler will correctly adjust the affinity. Moved common code in a function. Signed-off-by: Roy Pledge <roy.pledge@nxp.com> Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com> Signed-off-by: Li Yang <leoyang.li@nxp.com>
This commit is contained in:
parent
56740a7167
commit
9beaf661d6
3 changed files with 24 additions and 8 deletions
|
@ -562,11 +562,9 @@ static int bman_create_portal(struct bman_portal *portal,
|
||||||
dev_err(c->dev, "request_irq() failed\n");
|
dev_err(c->dev, "request_irq() failed\n");
|
||||||
goto fail_irq;
|
goto fail_irq;
|
||||||
}
|
}
|
||||||
if (c->cpu != -1 && irq_can_set_affinity(c->irq) &&
|
|
||||||
irq_set_affinity(c->irq, cpumask_of(c->cpu))) {
|
if (dpaa_set_portal_irq_affinity(c->dev, c->irq, c->cpu))
|
||||||
dev_err(c->dev, "irq_set_affinity() failed\n");
|
|
||||||
goto fail_affinity;
|
goto fail_affinity;
|
||||||
}
|
|
||||||
|
|
||||||
/* Need RCR to be empty before continuing */
|
/* Need RCR to be empty before continuing */
|
||||||
ret = bm_rcr_get_fill(p);
|
ret = bm_rcr_get_fill(p);
|
||||||
|
|
|
@ -111,4 +111,24 @@ int qbman_init_private_mem(struct device *dev, int idx, dma_addr_t *addr,
|
||||||
#define QBMAN_MEMREMAP_ATTR MEMREMAP_WC
|
#define QBMAN_MEMREMAP_ATTR MEMREMAP_WC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline int dpaa_set_portal_irq_affinity(struct device *dev,
|
||||||
|
int irq, int cpu)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!irq_can_set_affinity(irq)) {
|
||||||
|
dev_err(dev, "unable to set IRQ affinity\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpu == -1 || !cpu_online(cpu))
|
||||||
|
cpu = cpumask_any(cpu_online_mask);
|
||||||
|
|
||||||
|
ret = irq_set_affinity(irq, cpumask_of(cpu));
|
||||||
|
if (ret)
|
||||||
|
dev_err(dev, "irq_set_affinity() on CPU %d failed\n", cpu);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __DPAA_SYS_H */
|
#endif /* __DPAA_SYS_H */
|
||||||
|
|
|
@ -1210,11 +1210,9 @@ static int qman_create_portal(struct qman_portal *portal,
|
||||||
dev_err(c->dev, "request_irq() failed\n");
|
dev_err(c->dev, "request_irq() failed\n");
|
||||||
goto fail_irq;
|
goto fail_irq;
|
||||||
}
|
}
|
||||||
if (c->cpu != -1 && irq_can_set_affinity(c->irq) &&
|
|
||||||
irq_set_affinity(c->irq, cpumask_of(c->cpu))) {
|
if (dpaa_set_portal_irq_affinity(c->dev, c->irq, c->cpu))
|
||||||
dev_err(c->dev, "irq_set_affinity() failed\n");
|
|
||||||
goto fail_affinity;
|
goto fail_affinity;
|
||||||
}
|
|
||||||
|
|
||||||
/* Need EQCR to be empty before continuing */
|
/* Need EQCR to be empty before continuing */
|
||||||
isdr &= ~QM_PIRQ_EQCI;
|
isdr &= ~QM_PIRQ_EQCI;
|
||||||
|
|
Loading…
Reference in a new issue