[Skiboot] [PATCH] core/init: Add ibm, processor-storage-keys property to CPU DT node.

Thiago Jung Bauermann bauerman at linux.vnet.ibm.com
Thu Aug 17 09:49:14 AEST 2017


LoPAPR says:

    “ibm,processor-storage-keys”

    property name indicating the number of virtual storage keys supported
    by the processor described by this node.

    prop-encoded-array: Consists of two cells encoded as with encode-int.
    The first cell represents the number of virtual storage keys supported
    for data accesses while the second cell represents the number of
    virtual storage keys supported for instruction accesses. The cell value
    of zero indicates that no storage keys are supported for the access
    type.

pHyp provides the property above but there's a bug in P8 firmware where the
second cell is zero even though POWER8 supports instruction access keys.
This bug will be fixed for P9.

While this is a PAPR property, it's useful to have it in powernv as well
so that Linux has a uniform way of checking for the feature regardless of
the platform it's running on.

Tested on QEMU POWER8 powernv model, Mambo P9 and POWER8 Firenze machine.

Signed-off-by: Thiago Jung Bauermann <bauerman at linux.vnet.ibm.com>
---

This is used by patch 25 of Ram Pai's series which makes Linux support
storage keys:

https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-July/161230.html

I will submit a patch for KVM so that it can pass the property along
to its guests in the next few days.

 core/init.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/core/init.c b/core/init.c
index 61b531c77e39..405aa01af9d9 100644
--- a/core/init.c
+++ b/core/init.c
@@ -560,6 +560,29 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
 	start_kernel(kernel_entry, fdt, mem_top);
 }
 
+static void storage_keys_fixup(void)
+{
+	/* P7 doesn't support instruction access keys. */
+	const u32 insn_keys = (proc_gen == proc_gen_p7) ? 0 : 32;
+	struct dt_node *cpus, *n;
+
+	cpus = dt_find_by_path(dt_root, "/cpus");
+	assert(cpus);
+
+	if (proc_gen == proc_gen_unknown)
+		return;
+
+	dt_for_each_child(cpus, n) {
+		/* There may be cache nodes in /cpus. */
+		if (!dt_has_node_property(n, "device_type", "cpu") ||
+		    dt_has_node_property(n, "ibm,processor-storage-keys", NULL))
+			continue;
+
+		dt_add_property_cells(n, "ibm,processor-storage-keys", 32,
+				      insn_keys);
+	}
+}
+
 static void dt_fixups(void)
 {
 	struct dt_node *n;
@@ -587,6 +610,8 @@ static void dt_fixups(void)
 		if (!dt_has_node_property(n, "scom-controller", NULL))
 			dt_add_property(n, "scom-controller", NULL, 0);
 	}
+
+	storage_keys_fixup();
 }
 
 static void add_arch_vector(void)



More information about the Skiboot mailing list