[Skiboot] [PATCH v3 05/17] xive/p9: remove code not using block group mode

Cédric Le Goater clg at kaod.org
Tue Oct 1 16:59:50 AEST 2019


block group mode is now required, it can not be disabled.

Signed-off-by: Cédric Le Goater <clg at kaod.org>
---
 hw/xive.c | 209 +-----------------------------------------------------
 1 file changed, 1 insertion(+), 208 deletions(-)

diff --git a/hw/xive.c b/hw/xive.c
index 1c756b54acbc..9b2c2b831867 100644
--- a/hw/xive.c
+++ b/hw/xive.c
@@ -20,9 +20,6 @@
 #include <phys-map.h>
 #include <p9_stop_api.H>
 
-/* Use Block group mode to move chip_id into block .... */
-#define USE_BLOCK_GROUP_MODE
-
 /* Always notify from EQ to VP (no EOI on EQs). Will speed up
  * EOIs at the expense of potentially higher powerbus traffic.
  */
@@ -198,22 +195,12 @@
 #define VP_PER_PAGE		(0x10000 / 64) // Use sizeof ?
 #define IND_VP_TABLE_SIZE	((MAX_VP_COUNT / VP_PER_PAGE) * 8)
 
-#ifdef USE_BLOCK_GROUP_MODE
-
 /* Initial number of VPs (XXX Make it a variable ?). Round things
  * up to a max of 32 cores per chip
  */
 #define INITIAL_VP_BASE		0x80
 #define INITIAL_VP_COUNT	0x80
 
-#else
-
-/* Initial number of VPs on block 0 only */
-#define INITIAL_BLK0_VP_BASE	0x800
-#define INITIAL_BLK0_VP_COUNT  	0x800
-
-#endif
-
 /* The xive operation mode indicates the active "API" and corresponds
  * to the "mode" parameter of the opal_xive_reset() call
  */
@@ -408,11 +395,6 @@ struct xive {
 	uint64_t	*vp_ind_base;
 	uint32_t	vp_ind_count;
 
-#ifndef USE_BLOCK_GROUP_MODE
-	/* VP allocation buddy when not using block group mode */
-	struct buddy	*vp_buddy;
-#endif
-
 	/* Pool of donated pages for provisioning indirect EQ and VP pages */
 	struct list_head donated_pages;
 
@@ -476,7 +458,6 @@ static struct dt_node *xive_dt_node;
 static uint32_t xive_block_to_chip[XIVE_MAX_CHIPS];
 static uint32_t xive_block_count;
 
-#ifdef USE_BLOCK_GROUP_MODE
 static uint32_t xive_chip_to_block(uint32_t chip_id)
 {
 	struct proc_chip *c = get_chip(chip_id);
@@ -485,7 +466,6 @@ static uint32_t xive_chip_to_block(uint32_t chip_id)
 	assert(c->xive);
 	return c->xive->block_id;
 }
-#endif
 
 /* Conversion between GIRQ and block/index.
  *
@@ -515,15 +495,9 @@ static uint32_t xive_chip_to_block(uint32_t chip_id)
 #define GIRQ_TO_CHIP(__isn)	(VC_BLK_TO_CHIP(GIRQ_TO_BLK(__isn)))
 
 /* Routing of physical processors to VPs */
-#ifdef USE_BLOCK_GROUP_MODE
 #define PIR2VP_IDX(__pir)	(0x80 | P9_PIR2LOCALCPU(__pir))
 #define PIR2VP_BLK(__pir)	(xive_chip_to_block(P9_PIR2GCID(__pir)))
 #define VP2PIR(__blk, __idx)	(P9_PIRFROMLOCALCPU(VC_BLK_TO_CHIP(__blk), (__idx) & 0x7f))
-#else
-#define PIR2VP_IDX(__pir)	(0x800 | (P9_PIR2GCID(__pir) << 7) | P9_PIR2LOCALCPU(__pir))
-#define PIR2VP_BLK(__pir)	(0)
-#define VP2PIR(__blk, __idx)	(P9_PIRFROMLOCALCPU(((__idx) >> 7) & 0xf, (__idx) & 0x7f))
-#endif
 
 /* Decoding of OPAL API VP IDs. The VP IDs are encoded as follow
  *
@@ -558,7 +532,6 @@ static uint32_t xive_chip_to_block(uint32_t chip_id)
  * on the left of the index (the entire VP block is in a single
  * block ID)
  */
-#ifdef USE_BLOCK_GROUP_MODE
 
 /* VP allocation */
 static uint32_t xive_chips_alloc_bits = 0;
@@ -621,58 +594,6 @@ static uint32_t xive_encode_vp(uint32_t blk, uint32_t idx, uint32_t order)
 	return  vp;
 }
 
-#else /* USE_BLOCK_GROUP_MODE */
-
-/* VP# decoding/encoding */
-static bool xive_decode_vp(uint32_t vp, uint32_t *blk, uint32_t *idx,
-			   uint8_t *order, bool *group)
-{
-	uint32_t o = (vp >> 24) & 0x1f;
-	uint32_t index = vp & 0x00ffffff;
-	uint32_t imask = (1 << o) - 1;
-
-	/* Groups not supported yet */
-	if ((vp >> 31) & 1)
-		return false;
-	if (group)
-		*group = false;
-
-	/* PIR case */
-	if (((vp >> 30) & 1) == 0) {
-		if (find_cpu_by_pir(index) == NULL)
-			return false;
-		if (blk)
-			*blk = PIR2VP_BLK(index);
-		if (idx)
-			*idx = PIR2VP_IDX(index);
-		return true;
-	}
-
-	/* Ensure o > 0, we have *at least* 2 VPs per block */
-	if (o == 0)
-		return false;
-
-	/* Extract index */
-	if (idx)
-		*idx = index & imask;
-	/* Extract block ID */
-	if (blk)
-		*blk = index >> o;
-
-	/* Return order as well if asked for */
-	if (order)
-		*order = o;
-
-	return true;
-}
-
-static uint32_t xive_encode_vp(uint32_t blk, uint32_t idx, uint32_t order)
-{
-	return 0x40000000 | (order << 24) | (blk << order) | idx;
-}
-
-#endif /* !USE_BLOCK_GROUP_MODE */
-
 #define xive_regw(__x, __r, __v) \
 	__xive_regw(__x, __r, X_##__r, __v, #__r)
 #define xive_regr(__x, __r) \
@@ -1010,8 +931,6 @@ static bool xive_provision_vp_ind(struct xive *x, uint32_t vp_idx, uint32_t orde
 	return true;
 }
 
-#ifdef USE_BLOCK_GROUP_MODE
-
 static void xive_init_vp_allocator(void)
 {
 	/* Initialize chip alloc bits */
@@ -1096,90 +1015,6 @@ static void xive_free_vps(uint32_t vp)
 	unlock(&xive_buddy_lock);
 }
 
-#else /* USE_BLOCK_GROUP_MODE */
-
-static void xive_init_vp_allocator(void)
-{
-	struct proc_chip *chip;
-
-	for_each_chip(chip) {
-		struct xive *x = chip->xive;
-		if (!x)
-			continue;
-		/* Each chip has a MAX_VP_ORDER buddy */
-		x->vp_buddy = buddy_create(MAX_VP_ORDER);
-		assert(x->vp_buddy);
-
-		/* We reserve the whole range of VPs representing HW chips.
-		 *
-		 * These are 0x800..0xfff on block 0 only, so order 11
-		 * starting at 0x800.
-		 */
-		if (x->block_id == 0)
-			assert(buddy_reserve(x->vp_buddy, 0x800, 11));
-	}
-}
-
-static uint32_t xive_alloc_vps(uint32_t order)
-{
-	struct proc_chip *chip;
-	struct xive *x = NULL;
-	int vp = -1;
-
-	/* Minimum order is 1 */
-	if (order < 1)
-		order = 1;
-
-	/* Try on every chip */
-	for_each_chip(chip) {
-		x = chip->xive;
-		if (!x)
-			continue;
-		assert(x->vp_buddy);
-		lock(&x->lock);
-		vp = buddy_alloc(x->vp_buddy, order);
-		unlock(&x->lock);
-		if (vp >= 0)
-			break;
-	}
-	if (vp < 0)
-		return XIVE_ALLOC_NO_SPACE;
-
-	/* We have VPs, make sure we have backing for the
-	 * NVTs on that block
-	 */
-	if (!xive_provision_vp_ind(x, vp, order)) {
-		lock(&x->lock);
-		buddy_free(x->vp_buddy, vp, order);
-		unlock(&x->lock);
-		return XIVE_ALLOC_NO_IND;
-	}
-
-	/* Encode the VP number */
-	return xive_encode_vp(x->block_id, vp, order);
-}
-
-static void xive_free_vps(uint32_t vp)
-{
-	uint32_t idx, blk;
-	uint8_t order;
-	struct xive *x;
-
-	assert(xive_decode_vp(vp, &blk, &idx, &order, NULL));
-
-	/* Grab appropriate xive */
-	x = xive_from_pc_blk(blk);
-	/* XXX Return error instead ? */
-	assert(x);
-
-	/* Free that in the buddy */
-	lock(&x->lock);
-	buddy_free(x->vp_buddy, idx, order);
-	unlock(&x->lock);
-}
-
-#endif /* ndef USE_BLOCK_GROUP_MODE */
-
 enum xive_cache_type {
 	xive_cache_ivc,
 	xive_cache_sbc,
@@ -1211,17 +1046,8 @@ static void xive_scrub_workaround_vp(struct xive *x, uint32_t block, uint32_t id
 	 * Note: This means the workaround only works for block group
 	 * mode.
 	 */
-#ifdef USE_BLOCK_GROUP_MODE
 	__xive_cache_watch(x, xive_cache_vpc, block, INITIAL_VP_BASE, 0,
 			   0, NULL, true, false);
-#else
-	/* WARNING: Some workarounds related to cache scrubs require us to
-	 * have at least one firmware owned (permanent) indirect entry for
-	 * each XIVE instance. This currently only happens in block group
-	 * mode
-	 */
-#warning Block group mode should not be disabled
-#endif
 }
 
 static void xive_scrub_workaround_eq(struct xive *x, uint32_t block __unused, uint32_t idx)
@@ -1654,9 +1480,7 @@ static bool xive_config_init(struct xive *x)
 	xive_dbg(x, "PC_GLOBAL_CONFIG=%016llx\n", val);
 
 	val = xive_regr(x, PC_TCTXT_CFG);
-#ifdef USE_BLOCK_GROUP_MODE
 	val |= PC_TCTXT_CFG_BLKGRP_EN | PC_TCTXT_CFG_HARD_CHIPID_BLK;
-#endif
 	val |= PC_TCTXT_CHIPID_OVERRIDE;
 	val |= PC_TCTXT_CFG_TARGET_EN;
 	val = SETFIELD(PC_TCTXT_CHIPID, val, x->block_id);
@@ -1820,13 +1644,8 @@ static bool xive_prealloc_tables(struct xive *x)
 	memset(x->vp_ind_base, 0, al);
 
 	/* Populate/initialize VP/EQs indirect backing */
-#ifdef USE_BLOCK_GROUP_MODE
 	vp_init_count = INITIAL_VP_COUNT;
 	vp_init_base = INITIAL_VP_BASE;
-#else
-	vp_init_count = x->block_id == 0 ? INITIAL_BLK0_VP_COUNT : 0;
-	vp_init_base = INITIAL_BLK0_VP_BASE;
-#endif
 
 	/* Allocate pages for some VPs in indirect mode */
 	pbase = vp_init_base / VP_PER_PAGE;
@@ -1871,11 +1690,7 @@ static void xive_add_provisioning_properties(void)
 	dt_add_property_cells(xive_dt_node,
 			      "ibm,xive-provision-page-size", 0x10000);
 
-#ifdef USE_BLOCK_GROUP_MODE
 	count = 1 << xive_chips_alloc_bits;
-#else
-	count = xive_block_count;
-#endif
 	for (i = 0; i < count; i++)
 		chips[i] = xive_block_to_chip[i];
 	dt_add_property(xive_dt_node, "ibm,xive-provision-chips",
@@ -4640,16 +4455,10 @@ static void xive_reset_one(struct xive *x)
 		struct xive_vp vp0 = {0};
 
 		/* Ignore the physical CPU VPs */
-#ifdef USE_BLOCK_GROUP_MODE
 		if (i >= INITIAL_VP_BASE &&
 		    i < (INITIAL_VP_BASE + INITIAL_VP_COUNT))
 			continue;
-#else
-		if (x->block_id == 0 &&
-		    i >= INITIAL_BLK0_VP_BASE &&
-		    i < (INITIAL_BLK0_VP_BASE + INITIAL_BLK0_VP_BASE))
-			continue;
-#endif
+
 		/* Is the VP valid ? */
 		vp = xive_get_vp(x, i);
 		if (!vp || !(vp->w0 & VP_W0_VALID))
@@ -4661,13 +4470,6 @@ static void xive_reset_one(struct xive *x)
 				      i, 0, 8, &vp0, false, true);
 	}
 
-#ifndef USE_BLOCK_GROUP_MODE
-	/* If block group mode isn't enabled, reset VP alloc buddy */
-	buddy_reset(x->vp_buddy);
-	if (x->block_id == 0)
-		assert(buddy_reserve(x->vp_buddy, 0x800, 11));
-#endif
-
 	/* Forget about remaining donated pages */
 	list_head_init(&x->donated_pages);
 
@@ -4754,7 +4556,6 @@ static int64_t __xive_reset(uint64_t version)
 		xive_reset_one(chip->xive);
 	}
 
-#ifdef USE_BLOCK_GROUP_MODE
 	/* Cleanup global VP allocator */
 	buddy_reset(xive_vp_buddy);
 
@@ -4764,7 +4565,6 @@ static int64_t __xive_reset(uint64_t version)
 	 * reserve that range on each chip.
 	 */
 	assert(buddy_reserve(xive_vp_buddy, 0x80, 7));
-#endif /* USE_BLOCK_GROUP_MODE */
 
 	return OPAL_SUCCESS;
 }
@@ -4800,19 +4600,12 @@ static int64_t opal_xive_free_vp_block(uint64_t vp_base)
 		return OPAL_PARAMETER;
 	if (group)
 		return OPAL_PARAMETER;
-#ifdef USE_BLOCK_GROUP_MODE
 	if (blk)
 		return OPAL_PARAMETER;
 	if (order < (xive_chips_alloc_bits + 1))
 		return OPAL_PARAMETER;
 	if (idx & ((1 << (order - xive_chips_alloc_bits)) - 1))
 		return OPAL_PARAMETER;
-#else
-	if (order < 1)
-		return OPAL_PARAMETER;
-	if (idx & ((1 << order) - 1))
-		return OPAL_PARAMETER;
-#endif
 
 	count = 1 << order;
 	for (i = 0; i < count; i++) {
-- 
2.21.0



More information about the Skiboot mailing list