Hi Michel, On 06/05/18 23:36, Michel Pollet wrote: > Hi Frank, > > On 05 June 2018 18:34, Frank wrote: >> On 06/05/18 04:28, Michel Pollet wrote: >>> The Renesas R9A06G032 second CA7 is parked in a ROM pen at boot time, >>> it requires a special enable method to get it started. >>> >>> Signed-off-by: Michel Pollet <michel.pollet@xxxxxxxxxxxxxx> >>> --- >>> arch/arm/mach-shmobile/Makefile | 1 + >>> arch/arm/mach-shmobile/smp-r9a06g032.c | 79 >>> ++++++++++++++++++++++++++++++++++ >>> 2 files changed, 80 insertions(+) >>> create mode 100644 arch/arm/mach-shmobile/smp-r9a06g032.c >>> >>> diff --git a/arch/arm/mach-shmobile/Makefile >>> b/arch/arm/mach-shmobile/Makefile index 1939f52..d7fc98f 100644 >>> --- a/arch/arm/mach-shmobile/Makefile >>> +++ b/arch/arm/mach-shmobile/Makefile >>> @@ -34,6 +34,7 @@ smp-$(CONFIG_ARCH_SH73A0)+= smp-sh73a0.o >> headsmp-scu.o platsmp-scu.o >>> smp-$(CONFIG_ARCH_R8A7779)+= smp-r8a7779.o headsmp-scu.o >> platsmp-scu.o >>> smp-$(CONFIG_ARCH_R8A7790)+= smp-r8a7790.o >>> smp-$(CONFIG_ARCH_R8A7791)+= smp-r8a7791.o >>> +smp-$(CONFIG_ARCH_R9A06G032)+= smp-r9a06g032.o >>> smp-$(CONFIG_ARCH_EMEV2)+= smp-emev2.o headsmp-scu.o >> platsmp-scu.o >>> >>> # PM objects >>> diff --git a/arch/arm/mach-shmobile/smp-r9a06g032.c >>> b/arch/arm/mach-shmobile/smp-r9a06g032.c >>> new file mode 100644 >>> index 0000000..cd40e6e >>> --- /dev/null >>> +++ b/arch/arm/mach-shmobile/smp-r9a06g032.c >>> @@ -0,0 +1,79 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * R9A06G032 Second CA7 enabler. >>> + * >>> + * Copyright (C) 2018 Renesas Electronics Europe Limited >>> + * >>> + * Michel Pollet <michel.pollet@xxxxxxxxxxxxxx>, >> <buserror@xxxxxxxxx> >>> + * Derived from action,s500-smp >>> + */ >>> + >>> +#include <linux/io.h> >>> +#include <linux/of.h> >>> +#include <linux/of_address.h> >>> +#include <linux/smp.h> >>> + >>> +/* >>> + * The second CPU is parked in ROM at boot time. It requires waking >>> +it after >>> + * writing an address into the BOOTADDR register of sysctrl. >>> + * >>> + * So the default value of the "cpu-release-addr" corresponds to >> BOOTADDR... >>> + * >>> + * *However* the BOOTADDR register is not available when the kernel >>> + * starts in NONSEC mode. >>> + * >>> + * So for NONSEC mode, the bootloader re-parks the second CPU into a >>> +pen >>> + * in SRAM, and changes the "cpu-release-addr" of linux's DT to a >>> +SRAM address, >>> + * which is not restricted. >> >> The binding document for cpu-release-addr does not have a definition for 32 >> bit arm. The existing definition is only 64 bit arm. Please add the definition >> for 32 bit arm to patch 1. > > Hmmm I do find a definition in > Documentation/devicetree/bindings/arm/cpus.txt -- just under where I > added my 'enable-method' -- And it is already used as 32 bits in at least > arch/arm/boot/dts/stih407-family.dtsi. >From cpus.txt: - cpu-release-addr Usage: required for systems that have an "enable-method" property value of "spin-table". Value type: <prop-encoded-array> Definition: # On ARM v8 64-bit systems must be a two cell property identifying a 64-bit zero-initialised memory location. The definition specifies a two cell property for 64-bit systems. Please add to the definition that cpu-release-addr is a one cell property for 32-bit systems. -Frank > > What do you want me to add to this exactly? Do you want me to just > change "required for systems that have an "enable-method" property > value of "spin-table" to also specify renesas,r9a06g032 ? > > Thanks! > Michel > >> >> -Frank >> >> >>> + */ >>> + >>> +static void __iomem *cpu_bootaddr; >>> + >>> +static DEFINE_SPINLOCK(cpu_lock); >>> + >>> +static int r9a06g032_smp_boot_secondary(unsigned int cpu, struct >>> +task_struct *idle) { >>> +if (!cpu_bootaddr) >>> +return -ENODEV; >>> + >>> +spin_lock(&cpu_lock); >>> + >>> +writel(__pa_symbol(secondary_startup), cpu_bootaddr); >>> +arch_send_wakeup_ipi_mask(cpumask_of(cpu)); >>> + >>> +spin_unlock(&cpu_lock); >>> + >>> +return 0; >>> +} >>> + >>> +static void __init r9a06g032_smp_prepare_cpus(unsigned int max_cpus) >>> +{ >>> +struct device_node *dn; >>> +int ret; >>> +u32 bootaddr; >>> + >>> +dn = of_get_cpu_node(1, NULL); >>> +if (!dn) { >>> +pr_err("CPU#1: missing device tree node\n"); >>> +return; >>> +} >>> +/* >>> + * Determine the address from which the CPU is polling. >>> + * The bootloader *does* change this property >>> + */ >>> +ret = of_property_read_u32(dn, "cpu-release-addr", &bootaddr); >>> +of_node_put(dn); >>> +if (ret) { >>> +pr_err("CPU#1: invalid cpu-release-addr property\n"); >>> +return; >>> +} >>> +pr_info("CPU#1: cpu-release-addr %08x\n", bootaddr); >>> + >>> +cpu_bootaddr = ioremap(bootaddr, sizeof(bootaddr)); } >>> + >>> +static const struct smp_operations r9a06g032_smp_ops __initconst = { >>> +.smp_prepare_cpus = r9a06g032_smp_prepare_cpus, >>> +.smp_boot_secondary = r9a06g032_smp_boot_secondary, }; >>> +CPU_METHOD_OF_DECLARE(r9a06g032_smp, "renesas,r9a06g032-smp", >>> +&r9a06g032_smp_ops); >>> > > > > > Renesas Electronics Europe Ltd, Dukes Meadow, Millboard Road, Bourne End, Buckinghamshire, SL8 5FH, UK. Registered in England & Wales under Registered No. 04586709. >