Re: [PATCH v6 30/37] arm: cpu: Add ACPI parking protocol support

Simon Glass
2024-10-02T22:56:01Z

On Wed, 2 Oct 2024 at 03:52, Patrick Rudolph
<patrick.rudolph@9elements.com> wrote:
>
> On Arm platforms that use ACPI they cannot rely on the "spin-table"
> CPU bringup usually defined in the FDT. Thus implement the
> 'ACPI Multi-processor Startup for ARM Platforms', also referred to as
> 'ACPI parking protocol'.
>
> The ACPI parking protocol works similar to the spin-table mechanism, but
> the specification also covers lots of shortcomings of the spin-table
> implementations.
>
> Every CPU defined in the ACPI MADT table has it's own 4K page where the
> spinloop code and the OS mailbox resides. When selected the U-Boot board
> code must make sure that the secondary CPUs enter u-boot after relocation
> as well, so that they can enter the spinloop code residing in the ACPI
> parking protocol pages.
>
> The OS will then write to the mailbox and generate an IPI to release the
> CPUs from the spinloop code.
>
> For now it's only implemented on ARMv8, but can easily be extended to
> other platforms, like ARMv7.
>
> TEST: Boots all CPUs on qemu-system-aarch64 -machine raspi4b
>
> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Tom Rini <trini@konsulko.com>
> ---
> Changelog v2:
> - Use shorter function names
> - Drop the use of atomics, they do not work on real hardware
> - Rewrite code and verify on real hardware that CPUs are spinning
> inside their parking protocol spin-loop code
> Changelog v4:
> - Shorten names
> - Fix coding style
> - Drop extern from the headers
> Changelog v6:
> - Update header order
>
> ---
> arch/arm/cpu/armv8/Makefile | 1 +
> arch/arm/cpu/armv8/acpi_park_v8.S | 113 ++++++++++++++++++++++
> arch/arm/include/asm/acpi_table.h | 32 +++++++
> arch/arm/lib/acpi_table.c | 149 ++++++++++++++++++++++++++++++
> include/acpi/acpi_table.h | 10 ++
> include/bloblist.h | 1 +
> lib/Kconfig | 16 ++++
> lib/acpi/acpi_table.c | 4 +
> 8 files changed, 326 insertions(+)
> create mode 100644 arch/arm/cpu/armv8/acpi_park_v8.S