[EXTERNAL] [PATCH 11/20] mach-k3: r5: common: add helper functions needed in LPM resume sequence
Kumar, Abhash
a-kumar2 at ti.com
Mon Jun 1 10:05:38 CEST 2026
On 4/30/2026 2:14 PM, Richard Genoud (TI) wrote:
> From: Prasanth Babu Mantena <p-mantena@ ti. com> Add helper functions
> that are used by respective SoCs in LPM resume flow. - lpm_process()
> is called at boot time to: - retrieve the LPM memory region from DTS -
> save ATF/OPTEE certificates
> ZjQcmQRYFpfptBannerStart
> This message was sent from outside of Texas Instruments.
> Do not click links or open attachments unless you recognize the source
> of this email and know the content is safe.
> Report Suspicious
> <https://us-phishalarm-ewt.proofpoint.com/EWT/v1/G3vK!undqXRfPtm2bSgZlPFMD_PaDMAG16nyrFWtHumWcmHVJHF2x9T6ju4MVod9Xz5kkhLg8jvqD8Vb2RXV8TKm6Nx3q-RI8sEAX0Ue59g$>
>
> ZjQcmQRYFpfptBannerEnd
> From: Prasanth Babu Mantena <p-mantena at ti.com>
>
> Add helper functions that are used by respective SoCs in LPM resume flow.
>
> - lpm_process() is called at boot time to:
> - retrieve the LPM memory region from DTS
> - save ATF/OPTEE certificates information and DM code in this memory
> region
> - Forward the LPM address to TIFS via TISCI_MSG_LPM_SAVE_ADDR
> TIFS will use this address to save TFA context and its own minimal
> context just before suspend.
>
> - do_resume() is called at resume, just after bringing the DDR out of
> retention to:
> - retrieve the LPM memory region from DTS
> - authenticate certificates from LPM memory region and apply firewalls
> - ask TIFS to restore TFA and its own minimal context
> - start TFA on remote proc
> - load and jump to DM
>
> https://software-dl.ti.com/tisci/esd/latest/2_tisci_msgs/pm/lpm.html#lpm-msg-lpm-save-addr
>
> Signed-off-by: Prasanth Babu Mantena <p-mantena at ti.com>
> Co-developed-by: Richard Genoud (TI) <richard.genoud at bootlin.com>
> Signed-off-by: Richard Genoud (TI) <richard.genoud at bootlin.com>
> ---
> arch/arm/mach-k3/common.h | 16 +++
> arch/arm/mach-k3/lpm-common.h | 15 ++
> arch/arm/mach-k3/r5/Kconfig | 4 +
> arch/arm/mach-k3/r5/Makefile | 1 +
> arch/arm/mach-k3/r5/common.c | 17 +--
> arch/arm/mach-k3/r5/lpm-common.c | 228 +++++++++++++++++++++++++++++++
> 6 files changed, 269 insertions(+), 12 deletions(-)
> create mode 100644 arch/arm/mach-k3/lpm-common.h
> create mode 100644 arch/arm/mach-k3/r5/lpm-common.c
>
> diff --git a/arch/arm/mach-k3/common.h b/arch/arm/mach-k3/common.h
> index e970076d08ec..50e670f845e3 100644
> --- a/arch/arm/mach-k3/common.h
> +++ b/arch/arm/mach-k3/common.h
> @@ -8,6 +8,7 @@
>
> #include <asm/armv7_mpu.h>
> #include <asm/hardware.h>
> +#include <image.h>
> #include <mach/security.h>
>
> +static int extract_lpm_region(void)
> +{
> + ofnode node;
> + fdt_addr_t lpm_reg_addr;
> + fdt_size_t lpm_reg_size;
> +
> + node = ofnode_path("/reserved-memory/lpm-memory");
> + if (!ofnode_valid(node)) {
> + printf("lpm will not be functional\n");
> + return -ENODEV;
> + }
> +
> + lpm_reg_addr = ofnode_get_addr(node);
> + if (lpm_reg_addr == FDT_ADDR_T_NONE) {
> + printf("Can't find a valid reserved node!\n");
> + return -ENODEV;
> + }
> +
> + lpm_reg_size = ofnode_get_size(node);
> + if (lpm_reg_size == FDT_ADDR_T_NONE) {
> + printf("Can't find a valid reserved node!\n");
> + return -ENODEV;
> + }
> +
> + mem_addr_lpm.context_save_addr = (u32 *)lpm_reg_addr;
> + mem_addr_lpm.atf_cert_addr = mem_addr_lpm.context_save_addr + FW_IMAGE_SIZE;
> + mem_addr_lpm.optee_cert_addr = mem_addr_lpm.atf_cert_addr + FW_IMAGE_SIZE;
Hi Richard,
Adding a u32 pointer to an integer "FW_IMAGE_SIZE" would scale
FW_IMAGE_SIZE by sizeof(u32).
This would cause the address values to come out different than intended.
> + mem_addr_lpm.dm_save_addr = mem_addr_lpm.optee_cert_addr + (2 * FW_IMAGE_SIZE);
> + mem_addr_lpm.size = lpm_reg_size;
> +
> + return 0;
> +}
> +
Thanks,
Abhash
More information about the U-Boot
mailing list