First thanks for all your reviews, I'll add the tags in the next version of this series.
Niek Linnenbank <address@hidden> writes:
> Various Allwinner System on Chip designs contain multiple processors
> that can be configured and reset using the generic CPU Configuration
> module interface. This commit adds support for the Allwinner CPU
> configuration interface which emulates the following features:
>
> * CPU reset
> * CPU status
>
> Signed-off-by: Niek Linnenbank <address@hidden>
<snip>
> +
> +/* CPUCFG constants */
> +enum {
> + CPU_EXCEPTION_LEVEL_ON_RESET = 3, /* EL3 */
> +};
> +
> +static void allwinner_cpucfg_cpu_reset(AwCpuCfgState *s, uint8_t cpu_id)
> +{
> + int ret;
> +
> + trace_allwinner_cpucfg_cpu_reset(cpu_id, s->entry_addr);
> +
> + ret = arm_set_cpu_on(cpu_id, s->entry_addr, 0,
> + CPU_EXCEPTION_LEVEL_ON_RESET, false);
According to the arm_set_cpu_on code:
if (!target_aa64 && arm_feature(&target_cpu->env, ARM_FEATURE_AARCH64)) {
/*
* For now we don't support booting an AArch64 CPU in AArch32 mode
* TODO: We should add this support later
*/
qemu_log_mask(LOG_UNIMP,
"[ARM]%s: Starting AArch64 CPU %" PRId64
" in AArch32 mode is not supported yet\n",
__func__, cpuid);
return QEMU_ARM_POWERCTL_INVALID_PARAM;
}
Do you really want to reboot in aarch32 mode on a reset? If so we should
fix the TODO.
Very good remark, I'll try to clarify what I did here. In earlier version of this series, I made this CPU Configuration Module specific
to the Allwinner H3 SoC, as I thought it was a SoC specific component. Later I discovered that the CPU Configuration Module is
actually a generic Allwinner component and used in multiple SoCs. Taking that into account, I renamed it to allwinner-cpucfg.c and
updated the comments/docs. That way it should be re-usable in future SoC modules.
The Allwinner H3 has four ARM Cortex-A7 cores and are 32-bit, so in the early version I filled the @target_aa64 parameter with false to
keep it in 32-bit mode. And for usage in the current Allwinner H3 SoC that is sufficient, but as soon as a potential new SoC implementation
with a 64-bit CPU starts to use this module, the hardcoded @target_aa64 parameter will become a problem.
And the TODO inside the arm_set_cpu_on() function I was not yet aware of as well, so that will also need to be resolved
indeed once this module is going to be used for a new SoC with a 64-bit CPU.
Maybe I should just use some function to check if the current emulated CPU its 32-bit or 64-bit and use that for @target_aa64?
That way the CPU Configuration Module itself should be ready for 64-bit and the TODO for arm_set_cpu_on() can be
resolved in a later series for newer SoCs.
Regards,
Niek
--
Alex Bennée