[Skiboot] [PATCH] core/cpu.c: Use a device-tree node to detect nest mmu presence

Alistair Popple alistair at popple.id.au
Mon Dec 5 14:56:46 AEDT 2016


The nest mmu address scom was hardcoded which could lead to boot
failure on POWER9 systems without a nest mmu. For example Mambo
doesn't model the nest mmu which results in the following failure when
calling opal_nmmu_set_ptcr() during kernel load:

WARNING: 20856759: (20856757): Invalid address 0x0000000028096258 in XSCOM range,  SCOM=0x00280962b
WARNING: 20856759: (20856757): Attempt to store non-existent address 0x00001A0028096258
20856759: (20856757): 0x000000003002DA08 : stdcix  r26,r0,r3
FATAL ERROR: 20856759: (20856757): Check Stop for 0:0: Machine Check with ME bit of MSR off

This patch instead reads the address from the device-tree and makes
opal_nmmu_set_ptcr return OPAL_UNSUPPORTED on systems without a nest
mmu.

Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
 core/cpu.c | 36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/core/cpu.c b/core/cpu.c
index f83d910..5d76adf 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -1084,6 +1084,15 @@ static int64_t opal_reinit_cpus(uint64_t flags)
 }
 opal_call(OPAL_REINIT_CPUS, opal_reinit_cpus, 1);
 
+#define NMMU_XLAT_CTL_PTCR 0xb
+static int64_t nmmu_set_ptcr(uint64_t chip_id, struct dt_node *node, uint64_t ptcr)
+{
+	uint32_t nmmu_base_addr;
+
+	nmmu_base_addr = dt_get_address(node, 0, NULL);
+	return xscom_write(chip_id, nmmu_base_addr + NMMU_XLAT_CTL_PTCR, ptcr);
+}
+
 /*
  * Setup the the Nest MMU PTCR register for all chips in the system or
  * the specified chip id.
@@ -1091,25 +1100,24 @@ opal_call(OPAL_REINIT_CPUS, opal_reinit_cpus, 1);
  * The PTCR value may be overwritten so long as all users have been
  * quiesced. If it is set to an invalid memory address the system will
  * checkstop if anything attempts to use it.
+ *
+ * Returns OPAL_UNSUPPORTED if no nest mmu was found.
  */
-#define NMMU_CFG_XLAT_CTL_PTCR 0x5012c4b
 static int64_t opal_nmmu_set_ptcr(uint64_t chip_id, uint64_t ptcr)
 {
-	struct proc_chip *chip;
-	int64_t rc = OPAL_PARAMETER;
-
-	if (proc_gen != proc_gen_p9)
-		return OPAL_UNSUPPORTED;
+	struct dt_node *node;
+	int64_t rc = OPAL_UNSUPPORTED;
 
 	if (chip_id == -1ULL)
-		for_each_chip(chip)
-			rc = xscom_write(chip->id, NMMU_CFG_XLAT_CTL_PTCR, ptcr);
-	else {
-		if (!(chip = get_chip(chip_id)))
-			return OPAL_PARAMETER;
-
-		rc = xscom_write(chip->id, NMMU_CFG_XLAT_CTL_PTCR, ptcr);
-	}
+		dt_for_each_compatible(dt_root, node, "ibm,power9-nest-mmu") {
+			chip_id = dt_get_chip_id(node);
+			if ((rc = nmmu_set_ptcr(chip_id, node, ptcr)))
+				return rc;
+		}
+	else
+		dt_for_each_compatible_on_chip(dt_root, node, "ibm,power9-nest-mmu", chip_id)
+			if ((rc = nmmu_set_ptcr(chip_id, node, ptcr)))
+				return rc;
 
 	return rc;
 }
-- 
2.1.4



More information about the Skiboot mailing list