[PATCH v2 4/6] mach-snapdragon: fixup CPUs with PSCI enable-method

Neil Armstrong neil.armstrong at linaro.org
Thu Jun 4 08:59:23 CEST 2026


Hi,

On 6/4/26 08:53, Sam Day wrote:
> Hey Neil,
> 
> On Thursday, 4 June 2026 at 4:33 PM, Neil Armstrong <neil.armstrong at linaro.org> wrote:
> 
>> On 6/2/26 09:19, Sam Day via B4 Relay wrote:
>>> From: Sam Day <me at samcday.com>
>>>
>>> If there's no PSCI implementation, then change the enable-method of all
>>> CPUs from "psci" to "spin-table". Later, when spin_table_update_dt runs,
>>> it will further patch the CPU nodes with the necessary cpu-release-addr.
>>>
>>> This new fixup is only applied when CONFIG_ARMV8_SPIN_TABLE is enabled,
>>> since that also determines whether spin_table_update_dt runs.
>>>
>>> Signed-off-by: Sam Day <me at samcday.com>
>>> ---
>>>    arch/arm/mach-snapdragon/board.c | 41 ++++++++++++++++++++++++++++++++++++++++
>>>    1 file changed, 41 insertions(+)
>>>
>>> diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
>>> index 829a0109ac7..3b08069af98 100644
>>> --- a/arch/arm/mach-snapdragon/board.c
>>> +++ b/arch/arm/mach-snapdragon/board.c
>>> @@ -183,7 +183,9 @@ static void show_psci_version(void)
>>>    static void qcom_psci_fixup(void *fdt)
>>>    {
>>>    	int offset, ret;
>>> +	uint reg;
>>>    	struct arm_smccc_res res;
>>> +	const char *prop;
>>>
>>>    	arm_smccc_smc(ARM_PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
>>>
>>> @@ -198,6 +200,45 @@ static void qcom_psci_fixup(void *fdt)
>>>    	ret = fdt_del_node(fdt, offset);
>>>    	if (ret)
>>>    		log_err("Failed to delete /psci node: %d\n", ret);
>>> +
>>> +	if (!CONFIG_IS_ENABLED(ARMV8_SPIN_TABLE))
>>> +		return;
>>
>> Can this be dynamic ?
> 
> Sure can! ... Just as soon as I pin down exactly what you mean by that :D
> 
> Are you asking that this be guarded not just by ARMV8_SPIN_TABLE
> enablement, but also by root device compatible?
> 
> e.g:
> 
> 	if (!CONFIG_IS_ENABLED(ARMV8_SPIN_TABLE))
> 		return;
> 
> 	if (fdt_node_check_compatible(fdt, 0, "qcom,msm8916") &&
>          fdt_node_check_compatible(fdt, 0, "qcom,apq8016"))
> 		return;

Yes perhaps move this in a helper function to guard all the spin table functionality ?

Thanks,
Neil

> 
> Kind regards,
> Sam
> 
>>
>> Neil
>>
>>> +
>>> +	/* If spin-table support is enabled, make sure any CPU nodes with a
>>> +	 * PSCI enable-method are updated to spin-table. Further, any PSCI
>>> +	 * power-domains properties are removed.
>>> +	 */
>>> +
>>> +	offset = fdt_path_offset(fdt, "/cpus");
>>> +	if (offset < 0)
>>> +		return;
>>> +
>>> +	for (offset = fdt_first_subnode(fdt, offset);
>>> +	     offset >= 0;
>>> +	     offset = fdt_next_subnode(fdt, offset)) {
>>> +		prop = fdt_getprop(fdt, offset, "device_type", NULL);
>>> +		if (!prop || strcmp(prop, "cpu"))
>>> +			continue;
>>> +
>>> +		prop = fdt_getprop(fdt, offset, "enable-method", NULL);
>>> +		if (!prop || strcmp(prop, "psci"))
>>> +			continue;
>>> +
>>> +		reg = fdtdec_get_uint(fdt, offset, "reg", 0);
>>> +		ret = fdt_setprop_string(fdt, offset,
>>> +					 "enable-method", "spin-table");
>>> +		if (ret)
>>> +			log_err("Failed to set CPU%d enable-method to 'spin-table', this CPU will not be available to booted OS! %d\n",
>>> +				reg, ret);
>>> +
>>> +		log_info("Patched CPU%d enable-method to 'spin-table'\n", reg);
>>> +
>>> +		prop = fdt_getprop(fdt, offset, "power-domain-names", NULL);
>>> +		if (prop && !strcmp(prop, "psci")) {
>>> +			fdt_delprop(fdt, offset, "power-domains");
>>> +			fdt_delprop(fdt, offset, "power-domain-names");
>>> +		}
>>> +	}
>>>    }
>>>
>>>    /* We support booting U-Boot with an internal DT when running as a first-stage bootloader
>>>
>>
>>



More information about the U-Boot mailing list