[PATCH v3 2/3] ARM: bcm: Add CFE SMP support for BCMBCA
William Zhang
william.zhang at broadcom.com
Fri Oct 23 21:15:10 PDT 2026
On Wed, Oct 21, 2026 at 8:10 AM Linus Walleij <linusw at kernel.org> wrote:
>
> The XG6846B CFE bootloader powers up CPU1 and leaves it in a holding pen
> waiting for an interrupt. After waking, the stub reads the GPIO
> GeneralPurpose register at 0xff800568 and branches to the stored address
> in ARM state. The vendor kernel uses this mailbox and a wakeup IPI.
>
> Implement the brcm,bca-smp CPU enable-method for BCMBCA systems
> booted through CFE.
> Read the mailbox address from the secondary CPU's cpu-release-addr
> property. Map it as device memory, write secondary_startup_arm and
> complete the write before sending the wakeup IPI. CPU1 is already
> running, so no power or reset sequence is needed. Using the ARM entry
> also supports kernels built in Thumb-2 mode. Clear any Thumb function
> pointer tag before programming this ARM entry address.
>
> Register the operations with CPU_METHOD_OF_DECLARE() so the CPU
> nodes select CFE bring-up explicitly. Build the BCMBCA machine
> description independently of DEBUG_BCMBCA, keeping the debug UART
> mapping conditional. The generic ARM startup code retains PSCI priority.
>
> Suggested-by: William Zhang <william.zhang at broadcom.com>
> Signed-off-by: Linus Walleij <linusw at kernel.org>
> ---
> arch/arm/mach-bcm/Makefile | 2 +-
> arch/arm/mach-bcm/board_bcmbca.c | 56 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 57 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-bcm/Makefile b/arch/arm/mach-bcm/Makefile
> index 6baedf4c6304..fcc4e0174adc 100644
> --- a/arch/arm/mach-bcm/Makefile
> +++ b/arch/arm/mach-bcm/Makefile
> @@ -58,6 +58,6 @@ endif
>
> # BCMBCA
> ifeq ($(CONFIG_ARCH_BCMBCA),y)
> -obj-$(CONFIG_DEBUG_BCMBCA) += board_bcmbca.o
> +obj-y += board_bcmbca.o
> obj-$(CONFIG_SMP) += bcm63xx_smp.o bcm63xx_pmb.o
> endif
> diff --git a/arch/arm/mach-bcm/board_bcmbca.c b/arch/arm/mach-bcm/board_bcmbca.c
> index b510d959870a..248b8bd77645 100644
> --- a/arch/arm/mach-bcm/board_bcmbca.c
> +++ b/arch/arm/mach-bcm/board_bcmbca.c
> @@ -1,9 +1,15 @@
> // SPDX-License-Identifier: GPL-2.0-only
> // Copyright (C) 2024 Linus Walleij <linus.walleij at linaro.org>
>
> +#include <linux/io.h>
> +#include <linux/of.h>
> +#include <linux/smp.h>
> +
> #include <asm/mach/arch.h>
> #include <asm/mach/map.h>
> +#include <asm/smp_plat.h>
>
> +#ifdef CONFIG_DEBUG_BCMBCA
> /* This is needed for LL-debug/earlyprintk/debug-macro.S */
> static struct map_desc bcmbca_io_desc[] __initdata = {
> {
> @@ -13,12 +19,62 @@ static struct map_desc bcmbca_io_desc[] __initdata = {
> .type = MT_DEVICE,
> },
> };
> +#endif
>
> static void __init bcmbca_map_io(void)
> {
> +#ifdef CONFIG_DEBUG_BCMBCA
> iotable_init(bcmbca_io_desc, ARRAY_SIZE(bcmbca_io_desc));
> +#endif
> }
>
> +#ifdef CONFIG_SMP
> +static int bcmbca_boot_secondary(unsigned int cpu, struct task_struct *idle)
> +{
> + struct device_node *np;
> + void __iomem *mailbox;
> + u32 release_addr;
> + int ret;
> +
> + /* CFE has already powered up CPU1 and left it waiting in WFI. */
> + if (cpu_logical_map(cpu) != 1)
> + return -EINVAL;
> +
> + np = of_get_cpu_node(cpu, NULL);
> + if (!np)
> + return -ENODEV;
> +
> + ret = of_property_read_u32(np, "cpu-release-addr", &release_addr);
> + of_node_put(np);
> + if (ret) {
> + pr_err("CPU%u: missing or invalid cpu-release-addr property\n", cpu);
> + return ret;
> + }
> +
> + mailbox = ioremap(release_addr, sizeof(u32));
> + if (!mailbox)
> + return -ENOMEM;
> +
> + /*
> + * The CFE stub reads GPIO GeneralPurpose after an interrupt and
> + * branches to it in ARM state. Clear any Thumb function pointer
> + * tag and complete the MMIO write before sending the wakeup IPI.
> + */
> + writel(__pa_symbol(secondary_startup_arm) & ~1, mailbox);
> + dsb(sy);
> + arch_send_wakeup_ipi_mask(cpumask_of(cpu));
> + iounmap(mailbox);
> +
> + return 0;
> +}
> +
> +static const struct smp_operations bcmbca_smp_ops __initconst = {
> + .smp_boot_secondary = bcmbca_boot_secondary,
> +};
> +
> +CPU_METHOD_OF_DECLARE(bcmbca_smp, "brcm,bca-smp", &bcmbca_smp_ops);
> +#endif
> +
> static const char * const bcmbca_dt_compat[] = {
> /* TODO: Add other BCMBCA SoCs here to get debug UART support */
> "brcm,bcm6846",
>
> --
> 2.56.0
>
Reviewed-by: William Zhang <william.zhang at broadcom.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5473 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20261023/d00e4822/attachment-0001.p7s>
More information about the linux-arm-kernel
mailing list