Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31521a7a authored by Jeffrey Deans's avatar Jeffrey Deans Committed by Ralf Baechle
Browse files

MIPS: GIC: Generalise check for pending interrupts



Move most of the functionality of gic_get_int() into a new function
gic_get_int_mask() which takes a bitmask of interrupts in which the
caller is interested, and returns the subset which are pending for the
current CPU.

This allows CP0 IRQ dispatch routines to check only the GIC interrupts
which are routed to a particular CPU interrupt input.

gic_get_int() is reimplemented using gic_get_int_mask() and is retained
for use by any platforms for which gic_get_int() is sufficient.

Signed-off-by: default avatarJeffrey Deans <jeffrey.deans@imgtec.com>
Signed-off-by: default avatarMarkos Chandras <markos.chandras@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7376/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 6096e114
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -373,6 +373,7 @@ extern unsigned int plat_ipi_call_int_xlate(unsigned int);
extern unsigned int plat_ipi_resched_int_xlate(unsigned int);
extern unsigned int plat_ipi_resched_int_xlate(unsigned int);
extern void gic_bind_eic_interrupt(int irq, int set);
extern void gic_bind_eic_interrupt(int irq, int set);
extern unsigned int gic_get_timer_pending(void);
extern unsigned int gic_get_timer_pending(void);
extern void gic_get_int_mask(unsigned long *dst, const unsigned long *src);
extern unsigned int gic_get_int(void);
extern unsigned int gic_get_int(void);
extern void gic_enable_interrupt(int irq_vec);
extern void gic_enable_interrupt(int irq_vec);
extern void gic_disable_interrupt(int irq_vec);
extern void gic_disable_interrupt(int irq_vec);
+11 −2
Original line number Original line Diff line number Diff line
@@ -189,7 +189,7 @@ unsigned int gic_compare_int(void)
		return 0;
		return 0;
}
}


unsigned int gic_get_int(void)
void gic_get_int_mask(unsigned long *dst, const unsigned long *src)
{
{
	unsigned int i;
	unsigned int i;
	unsigned long *pending, *intrmask, *pcpu_mask;
	unsigned long *pending, *intrmask, *pcpu_mask;
@@ -214,8 +214,17 @@ unsigned int gic_get_int(void)


	bitmap_and(pending, pending, intrmask, GIC_NUM_INTRS);
	bitmap_and(pending, pending, intrmask, GIC_NUM_INTRS);
	bitmap_and(pending, pending, pcpu_mask, GIC_NUM_INTRS);
	bitmap_and(pending, pending, pcpu_mask, GIC_NUM_INTRS);
	bitmap_and(dst, src, pending, GIC_NUM_INTRS);
}

unsigned int gic_get_int(void)
{
	DECLARE_BITMAP(interrupts, GIC_NUM_INTRS);

	bitmap_fill(interrupts, GIC_NUM_INTRS);
	gic_get_int_mask(interrupts, interrupts);


	return find_first_bit(pending, GIC_NUM_INTRS);
	return find_first_bit(interrupts, GIC_NUM_INTRS);
}
}


static void gic_mask_irq(struct irq_data *d)
static void gic_mask_irq(struct irq_data *d)