[Skiboot] [PATCH 30/60] xive: Keep track of which interrupts were ever enabled

Benjamin Herrenschmidt benh at kernel.crashing.org
Thu Dec 22 14:16:38 AEDT 2016


In order to speed up xive reset

Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
---
 hw/xive.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/hw/xive.c b/hw/xive.c
index 81dd5c5..a4ee955 100644
--- a/hw/xive.c
+++ b/hw/xive.c
@@ -378,6 +378,11 @@ struct xive {
 	uint32_t	int_hw_bot;	/* Bottom of HW allocation */
 	uint32_t	int_ipi_top;	/* Highest IPI handed out so far + 1 */
 
+	/* We keep track of which interrupts were ever enabled to
+	 * speed up xive_reset
+	 */
+	bitmap_t	*int_enabled_map;
+
 	/* Embedded source IPIs */
 	struct xive_src	ipis;
 };
@@ -2120,6 +2125,12 @@ static int64_t xive_set_irq_targetting(uint32_t isn, uint32_t target,
 		/* Unmasking */
 		new_ive = ive->w & ~IVE_MASKED;
 		xive_vdbg(x, "ISN %x unmasked !\n", isn);
+
+		/* For normal interrupt sources, keep track of which ones
+		 * we ever enabled since the last reset
+		 */
+		if (!is_escalation)
+			bitmap_set_bit(*x->int_enabled_map, GIRQ_TO_IDX(isn));
 	}
 
 	/* Re-target the IVE. First find the EQ
@@ -2396,8 +2407,11 @@ static void init_one_xive(struct dt_node *np)
 	if (x->int_ipi_top < 0x10)
 		x->int_ipi_top = 0x10;
 
+	/* Allocate a few bitmaps */
 	x->eq_map = zalloc(BITMAP_BYTES(MAX_EQ_COUNT >> 3));
 	assert(x->eq_map);
+	x->int_enabled_map = zalloc(BITMAP_BYTES(MAX_INT_ENTRIES));
+	assert(x->int_enabled_map);
 
 	xive_dbg(x, "Handling interrupts [%08x..%08x]\n",
 		 x->int_base, x->int_max - 1);
-- 
2.9.3



More information about the Skiboot mailing list