hw/intc: ibex_plic: Honour source priorities
This patch follows what commit aa4d30f6618dc "riscv: plic: Honour source priorities" does and ensures that the highest priority interrupt will be serviced first. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Cc: Jessica Clarke <jrtc27@jrtc27.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <a697ca8a31eff8eb18a88e09a28206063cf85d48.1595655188.git.alistair.francis@wdc.com>
This commit is contained in:
parent
224914069d
commit
01c41d15de
@ -57,6 +57,8 @@ static void ibex_plic_irqs_set_pending(IbexPlicState *s, int irq, bool level)
|
||||
static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
|
||||
{
|
||||
int i;
|
||||
uint32_t max_irq = 0;
|
||||
uint32_t max_prio = s->threshold;
|
||||
|
||||
for (i = 0; i < s->pending_num; i++) {
|
||||
uint32_t irq_num = ctz64(s->pending[i]) + (i * 32);
|
||||
@ -66,14 +68,17 @@ static bool ibex_plic_irqs_pending(IbexPlicState *s, uint32_t context)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (s->priority[irq_num] > s->threshold) {
|
||||
if (!s->claim) {
|
||||
s->claim = irq_num;
|
||||
}
|
||||
return true;
|
||||
if (s->priority[irq_num] > max_prio) {
|
||||
max_irq = irq_num;
|
||||
max_prio = s->priority[irq_num];
|
||||
}
|
||||
}
|
||||
|
||||
if (max_irq) {
|
||||
s->claim = max_irq;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user