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

Ram Pai 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:
> 
>     “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.
> 
> 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)

-- 
Ram Pai



More information about the Skiboot mailing list