Commit 6ac17fe8 authored by Anup Patel's avatar Anup Patel Committed by Jassi Brar

mailbox: bcm-flexrm-mailbox: Set IRQ affinity hint for FlexRM ring IRQs

This patch set IRQ affinity hint for FlexRM ring IRQ at time of
enabling ring (i.e. flexrm_startup()). The IRQ affinity hint will
allow FlexRM driver to distribute FlexRM ring IRQs across online
CPUs so that all FlexRM ring IRQs don't land in CPU0 by default.
Signed-off-by: default avatarAnup Patel <anup.patel@broadcom.com>
Reviewed-by: default avatarRay Jui <ray.jui@broadcom.com>
Reviewed-by: default avatarScott Branden <scott.branden@broadcom.com>
Signed-off-by: default avatarJassi Brar <jaswinder.singh@linaro.org>
parent 14ccee78
...@@ -260,6 +260,7 @@ struct flexrm_ring { ...@@ -260,6 +260,7 @@ struct flexrm_ring {
void __iomem *regs; void __iomem *regs;
bool irq_requested; bool irq_requested;
unsigned int irq; unsigned int irq;
cpumask_t irq_aff_hint;
unsigned int msi_timer_val; unsigned int msi_timer_val;
unsigned int msi_count_threshold; unsigned int msi_count_threshold;
struct ida requests_ida; struct ida requests_ida;
...@@ -1217,6 +1218,18 @@ static int flexrm_startup(struct mbox_chan *chan) ...@@ -1217,6 +1218,18 @@ static int flexrm_startup(struct mbox_chan *chan)
} }
ring->irq_requested = true; ring->irq_requested = true;
/* Set IRQ affinity hint */
ring->irq_aff_hint = CPU_MASK_NONE;
val = ring->mbox->num_rings;
val = (num_online_cpus() < val) ? val / num_online_cpus() : 1;
cpumask_set_cpu((ring->num / val) % num_online_cpus(),
&ring->irq_aff_hint);
ret = irq_set_affinity_hint(ring->irq, &ring->irq_aff_hint);
if (ret) {
dev_err(ring->mbox->dev, "failed to set IRQ affinity hint\n");
goto fail_free_irq;
}
/* Disable/inactivate ring */ /* Disable/inactivate ring */
writel_relaxed(0x0, ring->regs + RING_CONTROL); writel_relaxed(0x0, ring->regs + RING_CONTROL);
...@@ -1261,6 +1274,9 @@ static int flexrm_startup(struct mbox_chan *chan) ...@@ -1261,6 +1274,9 @@ static int flexrm_startup(struct mbox_chan *chan)
return 0; return 0;
fail_free_irq:
free_irq(ring->irq, ring);
ring->irq_requested = false;
fail_free_cmpl_memory: fail_free_cmpl_memory:
dma_pool_free(ring->mbox->cmpl_pool, dma_pool_free(ring->mbox->cmpl_pool,
ring->cmpl_base, ring->cmpl_dma_base); ring->cmpl_base, ring->cmpl_dma_base);
...@@ -1314,6 +1330,7 @@ static void flexrm_shutdown(struct mbox_chan *chan) ...@@ -1314,6 +1330,7 @@ static void flexrm_shutdown(struct mbox_chan *chan)
/* Release IRQ */ /* Release IRQ */
if (ring->irq_requested) { if (ring->irq_requested) {
irq_set_affinity_hint(ring->irq, NULL);
free_irq(ring->irq, ring); free_irq(ring->irq, ring);
ring->irq_requested = false; ring->irq_requested = false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment