[Skiboot] [PATCH v2] core/init: Add ibm, processor-storage-keys property to /cpus DT node.
linuxram at us.ibm.com
Sat Sep 9 10:11:40 AEST 2017
On Fri, Sep 08, 2017 at 07:31:02PM -0300, Thiago Jung Bauermann wrote:
> LoPAPR says:
> 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
> 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.
> On PAPR there is one property for each CPU node, but since it's highly
> unlikely that different CPUs will support a different number of keys, we
> put the property in the /cpus node instead.
> Tested on QEMU POWER8 powernv model and Mambo P9.
> Signed-off-by: Thiago Jung Bauermann <bauerman at linux.vnet.ibm.com>
> core/init.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
> Changes in v2:
> - Put property in /cpus instead of in each CPU node.
> diff --git a/core/init.c b/core/init.c
> index 8951e17b4c90..4a6f9155511d 100644
> --- a/core/init.c
> +++ b/core/init.c
> @@ -563,6 +563,22 @@ 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;
theortically we should be checking for earlier gens too. right?
It should be
const u32 insn_keys = (proc_gen <= proc_gen_p7) ? 0 : 32;
> + struct dt_node *cpus = dt_find_by_path(dt_root, "/cpus");
> + assert(cpus);
> + if (proc_gen == proc_gen_unknown)
> + return;
> + else if (dt_has_node_property(cpus, "ibm,processor-storage-keys", NULL))
> + return;
> + dt_add_property_cells(cpus, "ibm,processor-storage-keys", 32, insn_keys);
> static void dt_fixups(void)
> struct dt_node *n;
> @@ -590,6 +606,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