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

Thiago Jung Bauermann bauerman at linux.vnet.ibm.com
Sat Sep 9 10:59:18 AEST 2017


Ram Pai <linuxram at us.ibm.com> writes:

> 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;

Theoretically yes, but if you look at the definition of the proc_gen enum:

    /* Processor generation */
    enum proc_gen {
            proc_gen_unknown,
            proc_gen_p7,		/* P7 and P7+ */
            proc_gen_p8,
            proc_gen_p9,
    };
    extern enum proc_gen proc_gen;

In practice skiboot doesn't support anything older than a P7. So
proc_gen <= proc_gen_p7 really means proc_gen == proc_gen_unknown, and
storage_keys_fixup returns early in that case already.

-- 
Thiago Jung Bauermann
IBM Linux Technology Center



More information about the Skiboot mailing list