From patchwork Wed Jul 30 11:53:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harsimran Singh Tungal X-Patchwork-Id: 67736 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1FE7FC87FD3 for ; Wed, 30 Jul 2025 11:54:11 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.33478.1753876440759178432 for ; Wed, 30 Jul 2025 04:54:01 -0700 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: harsimransingh.tungal@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 54FDE2573; Wed, 30 Jul 2025 04:53:52 -0700 (PDT) Received: from e132995.cambridge.arm.com (e132995.arm.com [10.1.25.25]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 6B8D83F66E; Wed, 30 Jul 2025 04:53:59 -0700 (PDT) From: Harsimran Singh Tungal To: meta-arm@lists.yoctoproject.org Cc: Abdellatif El Khlifi , Harsimran Singh Tungal Subject: [PATCH 10/13] arm-bsp/u-boot: corstone1000: Add PSA Firmware Update support (DEN0118 v1.0A) Date: Wed, 30 Jul 2025 12:53:24 +0100 Message-Id: <20250730115327.3671160-11-harsimransingh.tungal@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250730115327.3671160-1-harsimransingh.tungal@arm.com> References: <20250730115327.3671160-1-harsimransingh.tungal@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 30 Jul 2025 11:54:11 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/6647 From: Abdellatif El Khlifi Add PSA FWU support on U-Boot v2025.04 Introduce Platform Security Architecture (PSA) Firmware Update (FWU) support to U-Boot v2025.04 on the Corstone-1000 reference design. This implements the Arm DEN0118 v1.0A specification and provides a generic, upstreamable FWU framework for reuse across other Arm platforms. Design overview: Client/Runner: U-Boot parses the capsule and executes the FWU state machine. Update agent: Secure world handles flash writes and metadata updates. Key features: - Capsule-based firmware updates with support for multiple payloads - On-disk capsule handling (ESP-based update) - Optional image acceptance at ExitBootServices() - ESRT (EFI System Resource Table) support - FFA_MEM_SHARE and FFA_MEM_RECLAIM ABI support - FWU enabled for the Corstone-1000 platform [1]: Platform Security Firmware Update for the A-profile Arm Architecture, https://developer.arm.com/documentation/den0118/latest/ Signed-off-by: Abdellatif El Khlifi Signed-off-by: Harsimran Singh Tungal --- .../conf/machine/include/corstone1000.inc | 4 +- .../u-boot/u-boot-corstone1000.inc | 83 +- ...mccc-add-support-for-SMCCCv1.2-x0-x1.patch | 198 -- ...-pointer-check-to-the-uclass-driver-.patch | 64 + ...d-introduce-uuid_str_to_le_bin-funct.patch | 115 - ...02-arm_ffa-Add-FFA_MEM_SHARE-support.patch | 598 +++++ ...d-introduce-testcase-for-uuid_str_to.patch | 91 - ...-arm_ffa-Add-FFA_MEM_RECLAIM-support.patch | 232 ++ ...5-arm_ffa-introduce-Arm-FF-A-support.patch | 2129 ----------------- ...Replace-the-emulator-error-log-with-.patch | 43 + ...v15-arm_ffa-introduce-armffa-command.patch | 433 ---- ...Improve-the-readability-of-clearing-.patch | 128 + ...m_ffa-introduce-sandbox-FF-A-support.patch | 1311 ---------- ...-sandbox-Add-FFA_MEM_SHARE-emulation.patch | 129 + ...-introduce-sandbox-test-cases-for-UC.patch | 338 --- ..._ffa-sandbox-Add-FFA_MEM_SHARE-tests.patch | 101 + ...-introduce-armffa-command-Sandbox-te.patch | 91 - ...andbox-Add-FFA_MEM_RECLAIM-emulation.patch | 89 + ...-efi-introduce-FF-A-MM-communication.patch | 446 ---- ...fa-sandbox-Add-FFA_MEM_RECLAIM-tests.patch | 68 + ...-efi-corstone1000-enable-MM-communic.patch | 29 - ..._arm_psa-Initialize-the-update-agent.patch | 439 ++++ ...000-fwu-introduce-EFI-capsule-update.patch | 406 ---- ...-the-FWU-directory-through-get_image.patch | 894 +++++++ ...000-fix-unrecognized-filesystem-type.patch | 28 - .../0012-fwu_arm_psa-Add-staging-ABIs.patch | 722 ++++++ ...one1000-remove-guid-check-from-corst.patch | 50 - ...rm_psa-Add-set_image-and-get_image_i.patch | 111 + ..._arm_psa-Keep-the-FMP-payload-header.patch | 34 + ...ate-ESRT-table-if-EFI_ESRT-config-op.patch | 34 - ...-add-get_image_info-for-corstone1000.patch | 120 - ...rm_psa-Skip-accepting-the-payload-af.patch | 46 + ...ull-pointer-exception-with-get_image.patch | 59 - ...wu_arm_psa-Disable-trial-state-handl.patch | 71 + ...017-arm-corstone1000-add-mmc-for-fvp.patch | 97 - ...arm_psa-Add-FWU-acceptance-mechanism.patch | 310 +++ ...ne1000-add-compressed-kernel-support.patch | 31 - .../0018-fwu_arm_psa-Add-ESRT-support.patch | 219 ++ .../0019-arm-corstone1000-esrt-support.patch | 222 -- ...ExitBootService-notification-handler.patch | 54 + ...ne1000-enable-distro-booting-command.patch | 25 - ...ule-Add-runtime-capsule-flags-checks.patch | 67 + ...tone1000-add-fwu-metadata-store-info.patch | 39 - ..._psa-corstone1000-Enable-FWU-support.patch | 228 ++ ...tone1000-Perform-bank-logic-when-rea.patch | 143 ++ ...data-make-sure-structures-are-packed.patch | 47 - .../0023-corstone1000-add-boot-index.patch | 39 - ...tone1000-Notify-SE-Proxy-SP-on-ExitB.patch | 104 + ...adjust-boot-bank-and-kernel-location.patch | 33 - ...tone1000-Set-Boot0001-for-on-disk-FW.patch | 59 + ...add-nvmxip-fwu-mdata-and-gpt-options.patch | 72 - .../0026-nvmxip-move-header-to-include.patch | 39 - ...00-set-kernel_addr-based-on-boot_idx.patch | 132 - ...-corstone1000-boot-index-from-active.patch | 38 - .../0029-corstone1000-enable-PSCI-reset.patch | 28 - ...030-Enable-EFI-set-get-time-services.patch | 30 - ...tone1000-detect-inflated-kernel-size.patch | 26 - ...ne1000-ESRT-add-unique-firmware-GUID.patch | 44 - ...-to-remove-non-compliant-nodes-and-p.patch | 134 -- ...-Call-the-EVT_FT_FIXUP-event-handler.patch | 53 - ...e1000-purge-U-Boot-specific-DT-nodes.patch | 48 - ...00-add-signature-device-tree-overlay.patch | 28 - ...-enable-authenticated-capsule-config.patch | 25 - ...roduce-EFI-authenticated-capsule-upd.patch | 73 - ...nables-ondisk-capsule-update-feature.patch | 33 - ...-runtime-capsule-update-flags-checks.patch | 56 - .../0041-scatter-gather-flag-workaround.patch | 39 - ...rstone1000-enable-virtio-net-support.patch | 94 - ...i-Fix-bind_smccc_features-psci-check.patch | 57 - ...000-set-unique-GUID-for-fvp-and-mps3.patch | 57 - ...-efi-corstone1000-fwu-update-RPC-ABI.patch | 75 - ...ne1000-Change-MMCOMM-buffer-location.patch | 47 - ...one1000-dts-add-external-system-node.patch | 34 - ...corstone1000-Enable-UEFI-Secure-boot.patch | 28 - ...dd-secondary-cores-cpu-nodes-for-FVP.patch | 63 - .../0050-fwu-Use-metadata-v2.patch | 105 - ...rstone1000-purge-remoteproc-dts-node.patch | 34 - .../0052-reserve-memory-for-se-comm.patch | 46 - 78 files changed, 4982 insertions(+), 8007 deletions(-) delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-FF-A-v15-arm64-smccc-add-support-for-SMCCCv1.2-x0-x1.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-arm_ffa-Add-NULL-pointer-check-to-the-uclass-driver-.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-FF-A-v15-lib-uuid-introduce-uuid_str_to_le_bin-funct.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm_ffa-Add-FFA_MEM_SHARE-support.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-FF-A-v15-lib-uuid-introduce-testcase-for-uuid_str_to.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-arm_ffa-Add-FFA_MEM_RECLAIM-support.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-FF-A-v15-arm_ffa-introduce-Arm-FF-A-support.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-arm_ffa-sandbox-Replace-the-emulator-error-log-with-.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-FF-A-v15-arm_ffa-introduce-armffa-command.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-arm_ffa-sandbox-Improve-the-readability-of-clearing-.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-FF-A-v15-arm_ffa-introduce-sandbox-FF-A-support.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-sandbox-Add-FFA_MEM_SHARE-emulation.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-FF-A-v15-arm_ffa-introduce-sandbox-test-cases-for-UC.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-sandbox-Add-FFA_MEM_SHARE-tests.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-FF-A-v15-arm_ffa-introduce-armffa-command-Sandbox-te.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-emulation.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-FF-A-v15-arm_ffa-efi-introduce-FF-A-MM-communication.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-tests.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-FF-A-v15-arm_ffa-efi-corstone1000-enable-MM-communic.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-fwu_arm_psa-Initialize-the-update-agent.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-fwu-introduce-EFI-capsule-update.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-fwu_arm_psa-Read-the-FWU-directory-through-get_image.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-fwu_arm_psa-Add-staging-ABIs.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-corstone1000-remove-guid-check-from-corst.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-fwu_arm_psa-Add-set_image-and-get_image_i.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-fwu_arm_psa-Keep-the-FMP-payload-header.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_firmware-add-get_image_info-for-corstone1000.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_loader-fwu_arm_psa-Skip-accepting-the-payload-af.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fix-null-pointer-exception-with-get_image.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fwu-fwu_arm_psa-Disable-trial-state-handl.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-arm-corstone1000-add-mmc-for-fvp.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-fwu_arm_psa-Add-FWU-acceptance-mechanism.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-corstone1000-add-compressed-kernel-support.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-fwu_arm_psa-Add-ESRT-support.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-arm-corstone1000-esrt-support.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-fwu_arm_psa-Add-ExitBootService-notification-handler.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-corstone1000-enable-distro-booting-command.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-capsule-Add-runtime-capsule-flags-checks.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-corstone1000-add-fwu-metadata-store-info.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-fwu_arm_psa-corstone1000-Enable-FWU-support.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_arm_psa-corstone1000-Perform-bank-logic-when-rea.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_metadata-make-sure-structures-are-packed.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-corstone1000-add-boot-index.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-fwu_arm_psa-corstone1000-Notify-SE-Proxy-SP-on-ExitB.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-corstone1000-adjust-boot-bank-and-kernel-location.patch create mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-fwu_arm_psa-corstone1000-Set-Boot0001-for-on-disk-FW.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-add-nvmxip-fwu-mdata-and-gpt-options.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-nvmxip-move-header-to-include.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-corstone1000-set-kernel_addr-based-on-boot_idx.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-corstone1000-boot-index-from-active.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0029-corstone1000-enable-PSCI-reset.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0030-Enable-EFI-set-get-time-services.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0031-corstone1000-detect-inflated-kernel-size.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0032-corstone1000-ESRT-add-unique-firmware-GUID.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0033-dt-Provide-a-way-to-remove-non-compliant-nodes-and-p.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0034-bootefi-Call-the-EVT_FT_FIXUP-event-handler.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0035-corstone1000-purge-U-Boot-specific-DT-nodes.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0036-corstone1000-add-signature-device-tree-overlay.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0037-corstone1000-enable-authenticated-capsule-config.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0038-corstone1000-introduce-EFI-authenticated-capsule-upd.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0039-enables-ondisk-capsule-update-feature.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0040-fix-runtime-capsule-update-flags-checks.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0041-scatter-gather-flag-workaround.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0042-corstone1000-enable-virtio-net-support.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0043-firmware-psci-Fix-bind_smccc_features-psci-check.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0044-corstone1000-set-unique-GUID-for-fvp-and-mps3.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0045-efi-corstone1000-fwu-update-RPC-ABI.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0046-Corstone1000-Change-MMCOMM-buffer-location.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0047-corstone1000-dts-add-external-system-node.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0048-corstone1000-Enable-UEFI-Secure-boot.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0049-corstone1000-Add-secondary-cores-cpu-nodes-for-FVP.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0050-fwu-Use-metadata-v2.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0051-corstone1000-purge-remoteproc-dts-node.patch delete mode 100644 meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0052-reserve-memory-for-se-comm.patch diff --git a/meta-arm-bsp/conf/machine/include/corstone1000.inc b/meta-arm-bsp/conf/machine/include/corstone1000.inc index ecaea64d..af077083 100644 --- a/meta-arm-bsp/conf/machine/include/corstone1000.inc +++ b/meta-arm-bsp/conf/machine/include/corstone1000.inc @@ -23,8 +23,8 @@ TS_SP_SE_PROXY_CONFIG = "corstone1000" # Include smm-gateway and se-proxy SPs into optee-os binary MACHINE_FEATURES += "ts-smm-gateway ts-se-proxy" -# u-boot -PREFERRED_VERSION_u-boot ?= "2023.07%" +# U-Boot +PREFERRED_VERSION_u-boot ?= "2025.04%" MACHINE_FEATURES += "efi" EFI_PROVIDER ?= "grub-efi" diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot-corstone1000.inc b/meta-arm-bsp/recipes-bsp/u-boot/u-boot-corstone1000.inc index bb9da10d..e19034f7 100644 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot-corstone1000.inc +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot-corstone1000.inc @@ -15,70 +15,41 @@ UBOOT_EXTLINUX = "0" SYSROOT_DIRS:append = " /boot" +# FWU patches SRC_URI:append = " \ - file://0001-FF-A-v15-arm64-smccc-add-support-for-SMCCCv1.2-x0-x1.patch \ - file://0002-FF-A-v15-lib-uuid-introduce-uuid_str_to_le_bin-funct.patch \ - file://0003-FF-A-v15-lib-uuid-introduce-testcase-for-uuid_str_to.patch \ - file://0004-FF-A-v15-arm_ffa-introduce-Arm-FF-A-support.patch \ - file://0005-FF-A-v15-arm_ffa-introduce-armffa-command.patch \ - file://0006-FF-A-v15-arm_ffa-introduce-sandbox-FF-A-support.patch \ - file://0007-FF-A-v15-arm_ffa-introduce-sandbox-test-cases-for-UC.patch \ - file://0008-FF-A-v15-arm_ffa-introduce-armffa-command-Sandbox-te.patch \ - file://0009-FF-A-v15-arm_ffa-efi-introduce-FF-A-MM-communication.patch \ - file://0010-FF-A-v15-arm_ffa-efi-corstone1000-enable-MM-communic.patch \ - file://0011-efi-corstone1000-fwu-introduce-EFI-capsule-update.patch \ - file://0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch \ - file://0013-efi_loader-corstone1000-remove-guid-check-from-corst.patch \ - file://0014-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch \ - file://0015-efi_firmware-add-get_image_info-for-corstone1000.patch \ - file://0016-efi_loader-fix-null-pointer-exception-with-get_image.patch \ - file://0017-arm-corstone1000-add-mmc-for-fvp.patch \ - file://0018-corstone1000-add-compressed-kernel-support.patch \ - file://0019-arm-corstone1000-esrt-support.patch \ - file://0020-corstone1000-enable-distro-booting-command.patch \ - file://0021-corstone1000-add-fwu-metadata-store-info.patch \ - file://0022-fwu_metadata-make-sure-structures-are-packed.patch \ - file://0023-corstone1000-add-boot-index.patch \ - file://0024-corstone1000-adjust-boot-bank-and-kernel-location.patch \ - file://0025-corstone1000-add-nvmxip-fwu-mdata-and-gpt-options.patch \ - file://0026-nvmxip-move-header-to-include.patch \ - file://0027-corstone1000-set-kernel_addr-based-on-boot_idx.patch \ - file://0028-corstone1000-boot-index-from-active.patch \ - file://0029-corstone1000-enable-PSCI-reset.patch \ - file://0030-Enable-EFI-set-get-time-services.patch \ - file://0031-corstone1000-detect-inflated-kernel-size.patch \ - file://0032-corstone1000-ESRT-add-unique-firmware-GUID.patch \ - file://0033-dt-Provide-a-way-to-remove-non-compliant-nodes-and-p.patch \ - file://0034-bootefi-Call-the-EVT_FT_FIXUP-event-handler.patch \ - file://0035-corstone1000-purge-U-Boot-specific-DT-nodes.patch \ - file://0036-corstone1000-add-signature-device-tree-overlay.patch \ - file://0037-corstone1000-enable-authenticated-capsule-config.patch \ - file://0038-corstone1000-introduce-EFI-authenticated-capsule-upd.patch \ - file://0039-enables-ondisk-capsule-update-feature.patch \ - file://0040-fix-runtime-capsule-update-flags-checks.patch \ - file://0041-scatter-gather-flag-workaround.patch \ - file://0042-corstone1000-enable-virtio-net-support.patch \ - file://0043-firmware-psci-Fix-bind_smccc_features-psci-check.patch \ - file://0044-corstone1000-set-unique-GUID-for-fvp-and-mps3.patch \ - file://0045-efi-corstone1000-fwu-update-RPC-ABI.patch \ - file://0046-Corstone1000-Change-MMCOMM-buffer-location.patch \ - file://0047-corstone1000-dts-add-external-system-node.patch \ - file://0048-corstone1000-Enable-UEFI-Secure-boot.patch \ - file://0049-corstone1000-Add-secondary-cores-cpu-nodes-for-FVP.patch \ - file://0050-fwu-Use-metadata-v2.patch \ - ${@bb.utils.contains('MACHINE_FEATURES', 'corstone1000-extsys', \ - '', 'file://0051-corstone1000-purge-remoteproc-dts-node.patch' , d)} \ - file://0052-reserve-memory-for-se-comm.patch \ + file://0001-arm_ffa-Add-NULL-pointer-check-to-the-uclass-driver-.patch \ + file://0002-arm_ffa-Add-FFA_MEM_SHARE-support.patch \ + file://0003-arm_ffa-Add-FFA_MEM_RECLAIM-support.patch \ + file://0004-arm_ffa-sandbox-Replace-the-emulator-error-log-with-.patch \ + file://0005-arm_ffa-sandbox-Improve-the-readability-of-clearing-.patch \ + file://0006-arm_ffa-sandbox-Add-FFA_MEM_SHARE-emulation.patch \ + file://0007-arm_ffa-sandbox-Add-FFA_MEM_SHARE-tests.patch \ + file://0008-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-emulation.patch \ + file://0009-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-tests.patch \ + file://0010-fwu_arm_psa-Initialize-the-update-agent.patch \ + file://0011-fwu_arm_psa-Read-the-FWU-directory-through-get_image.patch \ + file://0012-fwu_arm_psa-Add-staging-ABIs.patch \ + file://0013-efi_loader-fwu_arm_psa-Add-set_image-and-get_image_i.patch \ + file://0014-efi_loader-fwu_arm_psa-Keep-the-FMP-payload-header.patch \ + file://0015-efi_loader-fwu_arm_psa-Skip-accepting-the-payload-af.patch \ + file://0016-efi_loader-fwu-fwu_arm_psa-Disable-trial-state-handl.patch \ + file://0017-fwu_arm_psa-Add-FWU-acceptance-mechanism.patch \ + file://0018-fwu_arm_psa-Add-ESRT-support.patch \ + file://0019-fwu_arm_psa-Add-ExitBootService-notification-handler.patch \ + file://0020-efi_loader-capsule-Add-runtime-capsule-flags-checks.patch \ + file://0021-fwu_arm_psa-corstone1000-Enable-FWU-support.patch \ + file://0022-fwu_arm_psa-corstone1000-Perform-bank-logic-when-rea.patch \ + file://0023-fwu_arm_psa-corstone1000-Notify-SE-Proxy-SP-on-ExitB.patch \ + file://0024-fwu_arm_psa-corstone1000-Set-Boot0001-for-on-disk-FW.patch \ " do_configure:append() { - openssl req -x509 -sha256 -newkey rsa:2048 -subj /CN=CRT/ -keyout ${B}/CRT.key -out ${B}/CRT.crt -nodes -days 365 - cert-to-efi-sig-list ${B}/CRT.crt ${B}/corstone1000_defconfig/CRT.esl + openssl req -x509 -sha256 -newkey rsa:2048 -subj /CN=CRT/ -keyout ${B}/CRT.key -out ${B}/corstone1000_defconfig/CRT.crt -nodes -days 365 } FILES:${PN} += "/corstone1000_capsule_*" do_install:append() { - install -D -p -m 0644 ${B}/CRT.crt ${D}/corstone1000_capsule_cert.crt + install -D -p -m 0644 ${B}/corstone1000_defconfig/CRT.crt ${D}/corstone1000_capsule_cert.crt install -D -p -m 0644 ${B}/CRT.key ${D}/corstone1000_capsule_key.key } diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-FF-A-v15-arm64-smccc-add-support-for-SMCCCv1.2-x0-x1.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-FF-A-v15-arm64-smccc-add-support-for-SMCCCv1.2-x0-x1.patch deleted file mode 100644 index 0e467a85..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-FF-A-v15-arm64-smccc-add-support-for-SMCCCv1.2-x0-x1.patch +++ /dev/null @@ -1,198 +0,0 @@ -From cc651db9a1370e697fd2525ce58b81ff7e112474 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Fri, 29 Jul 2022 13:06:19 +0100 -Subject: [PATCH] FF-A v15: arm64: smccc: add support for SMCCCv1.2 x0-x17 - registers - -add support for x0-x17 registers used by the SMC calls - -In SMCCC v1.2 [1] arguments are passed in registers x1-x17. -Results are returned in x0-x17. - -This work is inspired from the following kernel commit: - -arm64: smccc: Add support for SMCCCv1.2 extended input/output registers - -[1]: https://documentation-service.arm.com/static/5f8edaeff86e16515cdbe4c6?token= - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Ilias Apalodimas -Reviewed-by: Jens Wiklander -Reviewed-by: Simon Glass -Cc: Tom Rini -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - arch/arm/cpu/armv8/smccc-call.S | 57 ++++++++++++++++++++++++++++++++- - arch/arm/lib/asm-offsets.c | 16 +++++++++ - include/linux/arm-smccc.h | 45 ++++++++++++++++++++++++++ - 3 files changed, 117 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/cpu/armv8/smccc-call.S b/arch/arm/cpu/armv8/smccc-call.S -index dc92b28777..93f66d3366 100644 ---- a/arch/arm/cpu/armv8/smccc-call.S -+++ b/arch/arm/cpu/armv8/smccc-call.S -@@ -1,7 +1,11 @@ - /* SPDX-License-Identifier: GPL-2.0 */ - /* - * Copyright (c) 2015, Linaro Limited -- */ -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+*/ - #include - #include - #include -@@ -45,3 +49,54 @@ ENDPROC(__arm_smccc_smc) - ENTRY(__arm_smccc_hvc) - SMCCC hvc - ENDPROC(__arm_smccc_hvc) -+ -+#ifdef CONFIG_ARM64 -+ -+ .macro SMCCC_1_2 instr -+ /* Save `res` and free a GPR that won't be clobbered */ -+ stp x1, x19, [sp, #-16]! -+ -+ /* Ensure `args` won't be clobbered while loading regs in next step */ -+ mov x19, x0 -+ -+ /* Load the registers x0 - x17 from the struct arm_smccc_1_2_regs */ -+ ldp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS] -+ ldp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS] -+ ldp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS] -+ ldp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS] -+ ldp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS] -+ ldp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS] -+ ldp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS] -+ ldp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS] -+ ldp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS] -+ -+ \instr #0 -+ -+ /* Load the `res` from the stack */ -+ ldr x19, [sp] -+ -+ /* Store the registers x0 - x17 into the result structure */ -+ stp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS] -+ stp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS] -+ stp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS] -+ stp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS] -+ stp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS] -+ stp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS] -+ stp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS] -+ stp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS] -+ stp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS] -+ -+ /* Restore original x19 */ -+ ldp xzr, x19, [sp], #16 -+ ret -+ .endm -+ -+/* -+ * void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args, -+ * struct arm_smccc_1_2_regs *res); -+ */ -+ENTRY(arm_smccc_1_2_smc) -+ SMCCC_1_2 smc -+ENDPROC(arm_smccc_1_2_smc) -+ -+#endif -diff --git a/arch/arm/lib/asm-offsets.c b/arch/arm/lib/asm-offsets.c -index 6de0ce9152..181a8ac4c2 100644 ---- a/arch/arm/lib/asm-offsets.c -+++ b/arch/arm/lib/asm-offsets.c -@@ -9,6 +9,11 @@ - * generate asm statements containing #defines, - * compile this file to assembler, and then extract the - * #defines from the assembly-language output. -+ * -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi - */ - - #include -@@ -90,6 +95,17 @@ int main(void) - DEFINE(ARM_SMCCC_RES_X2_OFFS, offsetof(struct arm_smccc_res, a2)); - DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id)); - DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state)); -+#ifdef CONFIG_ARM64 -+ DEFINE(ARM_SMCCC_1_2_REGS_X0_OFFS, offsetof(struct arm_smccc_1_2_regs, a0)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X2_OFFS, offsetof(struct arm_smccc_1_2_regs, a2)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X4_OFFS, offsetof(struct arm_smccc_1_2_regs, a4)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X6_OFFS, offsetof(struct arm_smccc_1_2_regs, a6)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X8_OFFS, offsetof(struct arm_smccc_1_2_regs, a8)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X10_OFFS, offsetof(struct arm_smccc_1_2_regs, a10)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X12_OFFS, offsetof(struct arm_smccc_1_2_regs, a12)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X14_OFFS, offsetof(struct arm_smccc_1_2_regs, a14)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X16_OFFS, offsetof(struct arm_smccc_1_2_regs, a16)); -+#endif - #endif - - return 0; -diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h -index e1d09884a1..f44e9e8f93 100644 ---- a/include/linux/arm-smccc.h -+++ b/include/linux/arm-smccc.h -@@ -1,6 +1,10 @@ - /* SPDX-License-Identifier: GPL-2.0 */ - /* - * Copyright (c) 2015, Linaro Limited -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi - */ - #ifndef __LINUX_ARM_SMCCC_H - #define __LINUX_ARM_SMCCC_H -@@ -70,6 +74,47 @@ struct arm_smccc_res { - unsigned long a3; - }; - -+#ifdef CONFIG_ARM64 -+/** -+ * struct arm_smccc_1_2_regs - Arguments for or Results from SMC call -+ * @a0-a17 argument values from registers 0 to 17 -+ */ -+struct arm_smccc_1_2_regs { -+ unsigned long a0; -+ unsigned long a1; -+ unsigned long a2; -+ unsigned long a3; -+ unsigned long a4; -+ unsigned long a5; -+ unsigned long a6; -+ unsigned long a7; -+ unsigned long a8; -+ unsigned long a9; -+ unsigned long a10; -+ unsigned long a11; -+ unsigned long a12; -+ unsigned long a13; -+ unsigned long a14; -+ unsigned long a15; -+ unsigned long a16; -+ unsigned long a17; -+}; -+ -+/** -+ * arm_smccc_1_2_smc() - make SMC calls -+ * @args: arguments passed via struct arm_smccc_1_2_regs -+ * @res: result values via struct arm_smccc_1_2_regs -+ * -+ * This function is used to make SMC calls following SMC Calling Convention -+ * v1.2 or above. The content of the supplied param are copied from the -+ * structure to registers prior to the SMC instruction. The return values -+ * are updated with the content from registers on return from the SMC -+ * instruction. -+ */ -+asmlinkage void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args, -+ struct arm_smccc_1_2_regs *res); -+#endif -+ - /** - * struct arm_smccc_quirk - Contains quirk information - * @id: quirk identification diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-arm_ffa-Add-NULL-pointer-check-to-the-uclass-driver-.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-arm_ffa-Add-NULL-pointer-check-to-the-uclass-driver-.patch new file mode 100644 index 00000000..a2a6f348 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0001-arm_ffa-Add-NULL-pointer-check-to-the-uclass-driver-.patch @@ -0,0 +1,64 @@ +From 9b001c37347aa8fa5ecbd68f12714a12c74b6ea5 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Wed, 30 Oct 2024 14:10:43 +0000 +Subject: [PATCH 01/36] arm_ffa: Add NULL pointer check to the uclass driver + operations + +Add NULL pointer check for ops + +The device driver can miss defining an operations structure. +So, ffa_get_ops() can return NULL. +This commit adds checks for ops in the uclass driver operations +and an error is returned when ops is NULL. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + drivers/firmware/arm-ffa/arm-ffa-uclass.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/drivers/firmware/arm-ffa/arm-ffa-uclass.c b/drivers/firmware/arm-ffa/arm-ffa-uclass.c +index 96c64964bb7..f8d231204db 100644 +--- a/drivers/firmware/arm-ffa/arm-ffa-uclass.c ++++ b/drivers/firmware/arm-ffa/arm-ffa-uclass.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -954,6 +954,9 @@ int ffa_partition_info_get(struct udevice *dev, const char *uuid_str, + { + struct ffa_bus_ops *ops = ffa_get_ops(dev); + ++ if (!ops) ++ return -EINVAL; ++ + if (!ops->partition_info_get) + return -ENOSYS; + +@@ -979,6 +982,9 @@ int ffa_sync_send_receive(struct udevice *dev, u16 dst_part_id, + { + struct ffa_bus_ops *ops = ffa_get_ops(dev); + ++ if (!ops) ++ return -EINVAL; ++ + if (!ops->sync_send_receive) + return -ENOSYS; + +@@ -1000,6 +1006,9 @@ int ffa_rxtx_unmap(struct udevice *dev) + { + struct ffa_bus_ops *ops = ffa_get_ops(dev); + ++ if (!ops) ++ return -EINVAL; ++ + if (!ops->rxtx_unmap) + return -ENOSYS; + +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-FF-A-v15-lib-uuid-introduce-uuid_str_to_le_bin-funct.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-FF-A-v15-lib-uuid-introduce-uuid_str_to_le_bin-funct.patch deleted file mode 100644 index 2fc5caaf..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-FF-A-v15-lib-uuid-introduce-uuid_str_to_le_bin-funct.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 4c1eaa36a882f9f921c3bc3b1352bbb04a939c4f Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Thu, 4 Aug 2022 16:46:47 +0100 -Subject: [PATCH] FF-A v15: lib: uuid: introduce uuid_str_to_le_bin function - -convert UUID string to little endian binary data - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Cc: Tom Rini -Cc: Ilias Apalodimas -Cc: Jens Wiklander -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - include/uuid.h | 15 +++++++++++++++ - lib/uuid.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 63 insertions(+) - -diff --git a/include/uuid.h b/include/uuid.h -index 4a4883d3b5..89b93e642b 100644 ---- a/include/uuid.h -+++ b/include/uuid.h -@@ -2,6 +2,10 @@ - /* - * Copyright (C) 2014 Samsung Electronics - * Przemyslaw Marczak -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi - */ - #ifndef __UUID_H__ - #define __UUID_H__ -@@ -44,4 +48,15 @@ int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin); - const char *uuid_guid_get_str(const unsigned char *guid_bin); - void gen_rand_uuid(unsigned char *uuid_bin); - void gen_rand_uuid_str(char *uuid_str, int str_format); -+ -+/** -+ * uuid_str_to_le_bin() - Convert string UUID to little endian binary data. -+ * @uuid_str: pointer to UUID string -+ * @uuid_bin: pointer to allocated array for little endian output [16B] -+ * Return: -+ * uuid_bin filled with little endian UUID data -+ * On success 0 is returned. Otherwise, failure code. -+ */ -+int uuid_str_to_le_bin(const char *uuid_str, unsigned char *uuid_bin); -+ - #endif -diff --git a/lib/uuid.c b/lib/uuid.c -index 96e1af3c8b..45f325d964 100644 ---- a/lib/uuid.c -+++ b/lib/uuid.c -@@ -1,6 +1,10 @@ - // SPDX-License-Identifier: GPL-2.0+ - /* - * Copyright 2011 Calxeda, Inc. -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi - */ - - #include -@@ -354,6 +358,50 @@ int uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin, - return 0; - } - -+/** -+ * uuid_str_to_le_bin() - Convert string UUID to little endian binary data. -+ * @uuid_str: pointer to UUID string -+ * @uuid_bin: pointer to allocated array for little endian output [16B] -+ * -+ * UUID string is 36 characters (36 bytes): -+ * -+ * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -+ * -+ * where x is a hexadecimal character. Fields are separated by '-'s. -+ * When converting to a little endian binary UUID, the string fields are reversed. -+ * -+ * Return: -+ * -+ * uuid_bin filled with little endian UUID data -+ * On success 0 is returned. Otherwise, failure code. -+ */ -+int uuid_str_to_le_bin(const char *uuid_str, unsigned char *uuid_bin) -+{ -+ u16 tmp16; -+ u32 tmp32; -+ u64 tmp64; -+ -+ if (!uuid_str_valid(uuid_str) || !uuid_bin) -+ return -EINVAL; -+ -+ tmp32 = cpu_to_le32(hextoul(uuid_str, NULL)); -+ memcpy(uuid_bin, &tmp32, 4); -+ -+ tmp16 = cpu_to_le16(hextoul(uuid_str + 9, NULL)); -+ memcpy(uuid_bin + 4, &tmp16, 2); -+ -+ tmp16 = cpu_to_le16(hextoul(uuid_str + 14, NULL)); -+ memcpy(uuid_bin + 6, &tmp16, 2); -+ -+ tmp16 = cpu_to_le16(hextoul(uuid_str + 19, NULL)); -+ memcpy(uuid_bin + 8, &tmp16, 2); -+ -+ tmp64 = cpu_to_le64(simple_strtoull(uuid_str + 24, NULL, 16)); -+ memcpy(uuid_bin + 10, &tmp64, 6); -+ -+ return 0; -+} -+ - /* - * uuid_bin_to_str() - convert big endian binary data to string UUID or GUID. - * diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm_ffa-Add-FFA_MEM_SHARE-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm_ffa-Add-FFA_MEM_SHARE-support.patch new file mode 100644 index 00000000..68578e32 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0002-arm_ffa-Add-FFA_MEM_SHARE-support.patch @@ -0,0 +1,598 @@ +From 7d4fbdc82bb004a4a7852016f94b56a82a9c3e7e Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Tue, 29 Oct 2024 17:22:35 +0000 +Subject: [PATCH 02/36] arm_ffa: Add FFA_MEM_SHARE support + +Add to the FF-A bus FFA_MEM_SHARE ABI + +The FFA_MEM_SHARE is a memory management ABI described in the FF-A v1.0 +specification [1]. + +This ABI starts a transaction to grant access to a memory region +to one or more Borrowers (aka Secure Partitions or endpoints). + +This work is based on the implementation in Linux kernel [2]. + +[1]: https://developer.arm.com/documentation/den0077/a/?lang=en +[2]: commit cc2195fe536c28e192df5d07e6dd277af36814b4 + Files: drivers/firmware/arm_ffa/driver.c , include/linux/arm_ffa.h + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + doc/arch/arm64.ffa.rst | 2 + + drivers/firmware/arm-ffa/arm-ffa-uclass.c | 210 ++++++++++++++++++++++ + drivers/firmware/arm-ffa/arm-ffa.c | 3 +- + include/arm_ffa.h | 86 ++++++++- + include/arm_ffa_priv.h | 142 ++++++++++++++- + 5 files changed, 439 insertions(+), 4 deletions(-) + +diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst +index f966f8ba6af..3eec735d741 100644 +--- a/doc/arch/arm64.ffa.rst ++++ b/doc/arch/arm64.ffa.rst +@@ -185,6 +185,7 @@ The following features are provided: + - FFA_INTERRUPT + - FFA_MSG_SEND_DIRECT_REQ + - FFA_MSG_SEND_DIRECT_RESP ++ - FFA_MEM_SHARE + + - Support for the 64-bit version of the following ABIs: + +@@ -203,6 +204,7 @@ The following features are provided: + - ffa_partition_info_get + - ffa_sync_send_receive + - ffa_rxtx_unmap ++ - ffa_memory_share + + - FF-A bus discovery makes sure FF-A framework is responsive and compatible + with the driver +diff --git a/drivers/firmware/arm-ffa/arm-ffa-uclass.c b/drivers/firmware/arm-ffa/arm-ffa-uclass.c +index f8d231204db..2ba0b925fa6 100644 +--- a/drivers/firmware/arm-ffa/arm-ffa-uclass.c ++++ b/drivers/firmware/arm-ffa/arm-ffa-uclass.c +@@ -95,6 +95,20 @@ static struct ffa_abi_errmap err_msg_map[FFA_ERRMAP_COUNT] = { + "DENIED: Buffer pair already registered", + }, + }, ++ [FFA_ID_TO_ERRMAP_ID(FFA_MEM_SHARE)] = { ++ { ++ [ABORTED] = ++ "ABORTED: Failure in the transmission of fragments or in time slicing", ++ [INVALID_PARAMETERS] = ++ "INVALID_PARAMETERS: Validation failed for the Memory Transaction or the Endpoint memory access descriptor", ++ [NO_MEMORY] = ++ "NO_MEMORY: Insufficient memory to complete this operation", ++ [BUSY] = ++ "BUSY: The TX buffer is busy", ++ [DENIED] = ++ "DENIED: Memory region ownership, permission, access or attributes error", ++ }, ++ }, + }; + + /** +@@ -929,6 +943,177 @@ int ffa_msg_send_direct_req_hdlr(struct udevice *dev, u16 dst_part_id, + return ffa_to_std_errno(ffa_errno); + } + ++/** ++ * ffa_mem_desc_offset() - helper for descriptors offset calculation ++ * @count: An integer defining the number of Endpoint memory access descriptors ++ * ++ * Calculate the offset of the Endpoint memory access descriptor and ++ * the Composite memory region descriptor. ++ * ++ * Return: ++ * ++ * The descriptor offset. ++ */ ++static inline u32 ffa_mem_desc_offset(int count) ++{ ++ u32 offset = count * sizeof(struct ffa_mem_region_attributes); ++ ++ offset += sizeof(struct ffa_mem_region); ++ ++ return offset; ++} ++ ++/** ++ * ffa_setup_and_transmit() - set up the memory and transmit data using FF-A ++ * @dev: The FF-A bus device ++ * @func_id: An integer identifying the function ++ * @buffer: A pointer to the data to be transmitted (FF-A TX buffer) ++ * @args: A pointer to a structure containing additional user arguments ++ * ++ * Setup the memory transaction related to the access to a specified ++ * memory region. ++ * Currently we support FFA_MEM_SHARE only. ++ * ++ * Return: ++ * ++ * 0 on success. . Otherwise, failure ++ */ ++static int ffa_setup_and_transmit(struct udevice *dev, u32 func_id, ++ void *buffer, struct ffa_mem_ops_args *args) ++{ ++ ffa_value_t res = {0}; ++ int ffa_errno; ++ u32 composite_offset; ++ u32 total_length; ++ struct ffa_mem_region *mem_region = buffer; ++ struct ffa_composite_mem_region *composite; ++ struct ffa_mem_region_addr_range *constituent; ++ struct ffa_mem_region_attributes *ep_mem_access; ++ u32 idx; ++ struct ffa_priv *uc_priv; ++ ++ uc_priv = dev_get_uclass_priv(dev); ++ ++ mem_region->tag = args->tag; ++ mem_region->flags = args->flags; ++ mem_region->sender_id = uc_priv->id; ++ ++ /* ++ * These attributes are only valid for FFA_MEM_SHARE. ++ * They are not valid for FFA_MEM_LEND (no implemented). ++ */ ++ if (func_id == FFA_MEM_SHARE) ++ mem_region->attributes = FFA_MEM_NORMAL | FFA_MEM_WRITE_BACK ++ | FFA_MEM_INNER_SHAREABLE; ++ else ++ mem_region->attributes = 0; ++ ++ mem_region->handle = 0; ++ mem_region->ep_count = args->nattrs; ++ mem_region->reserved1 = 0; ++ mem_region->reserved2 = 0; ++ ++ ep_mem_access = buffer + ffa_mem_desc_offset(0); ++ ++ composite_offset = ffa_mem_desc_offset(args->nattrs); ++ ++ /* Multiple borrowers supported */ ++ for (idx = 0; idx < args->nattrs; idx++, ep_mem_access++) { ++ ep_mem_access->receiver = args->attrs[idx].receiver; ++ ep_mem_access->attrs = args->attrs[idx].attrs; ++ ep_mem_access->composite_off = composite_offset; ++ ep_mem_access->flag = 0; ++ ep_mem_access->reserved = 0; ++ } ++ ++ /* Only one Composite and one Constituent memory region supported */ ++ composite = buffer + composite_offset; ++ composite->total_pg_cnt = args->pg_cnt; ++ composite->addr_range_cnt = FFA_MEM_CONSTITUENTS; ++ composite->reserved = 0; ++ ++ constituent = &composite->constituents[0]; ++ constituent->address = map_to_sysmem(args->address); ++ constituent->pg_cnt = args->pg_cnt; ++ constituent->reserved = 0; ++ ++ total_length = composite_offset + sizeof(*composite) + ++ sizeof(*constituent); ++ ++ /* ++ * Note: Time slicing is not supported. ++ * It's only available to EL1 and S-EL1 endpoints. ++ */ ++ ++ invoke_ffa_fn((ffa_value_t){ ++ .a0 = FFA_SMC_32(func_id), ++ .a1 = total_length, ++ .a2 = total_length, ++ .a3 = 0, /* the TX buffer is used */ ++ .a4 = 0, /* the TX buffer is used */ ++ }, ++ &res ++ ); ++ ++ if (res.a0 != FFA_SMC_32(FFA_SUCCESS)) { ++ ffa_errno = res.a2; ++ ffa_print_error_log(func_id, ffa_errno); ++ return ffa_to_std_errno(ffa_errno); ++ } ++ ++ args->g_handle = PACK_HANDLE(res.a2, res.a3); ++ return 0; ++} ++ ++/** ++ * ffa_memory_ops() - wrapper for the memory management ABIs ++ * @dev: The FF-A bus device ++ * @func_id: An integer identifying the function ++ * @args: A pointer to a structure containing additional user arguments ++ * ++ * Verify the use of the TX buffer then call ffa_setup_and_transmit(). ++ * Currently we support FFA_MEM_SHARE only. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int ffa_memory_ops(struct udevice *dev, u32 func_id, ++ struct ffa_mem_ops_args *args) ++{ ++ void *buffer; ++ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); ++ ++ if (!args->use_txbuf) { ++ log_err("only TX buffer supported\n"); ++ return -EPROTONOSUPPORT; ++ } ++ ++ buffer = uc_priv->pair.txbuf; ++ ++ if (!buffer || !args->attrs || !args->address) ++ return -EINVAL; ++ ++ return ffa_setup_and_transmit(dev, func_id, buffer, args); ++} ++ ++/** ++ * ffa_memory_share_hdlr() - FFA_MEM_SHARE handler function ++ * @dev: The FF-A bus device ++ * @args: A pointer to a structure containing additional user arguments ++ * ++ * Implement FFA_MEM_SHARE FF-A function ++ * to grant access to a memory region to one or more Borrowers. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++int ffa_memory_share_hdlr(struct udevice *dev, struct ffa_mem_ops_args *args) ++{ ++ return ffa_memory_ops(dev, FFA_MEM_SHARE, args); ++} ++ + /* FF-A driver operations (used by clients for communicating with FF-A)*/ + + /** +@@ -1015,6 +1200,31 @@ int ffa_rxtx_unmap(struct udevice *dev) + return ops->rxtx_unmap(dev); + } + ++/** ++ * ffa_memory_share() - FFA_MEM_SHARE driver operation ++ * @dev: The FF-A bus device ++ * @args: A pointer to a structure containing additional user arguments ++ * ++ * Driver operation for FFA_MEM_SHARE. ++ * Please see ffa_memory_share_hdlr() description for more details. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++int ffa_memory_share(struct udevice *dev, struct ffa_mem_ops_args *args) ++{ ++ struct ffa_bus_ops *ops = ffa_get_ops(dev); ++ ++ if (!ops || !args) ++ return -EINVAL; ++ ++ if (!ops->memory_share) ++ return -ENOSYS; ++ ++ return ops->memory_share(dev, args); ++} ++ + /** + * ffa_do_probe() - probing FF-A framework + * @dev: the FF-A bus device (arm_ffa) +diff --git a/drivers/firmware/arm-ffa/arm-ffa.c b/drivers/firmware/arm-ffa/arm-ffa.c +index 94e6105cb38..df904cae412 100644 +--- a/drivers/firmware/arm-ffa/arm-ffa.c ++++ b/drivers/firmware/arm-ffa/arm-ffa.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -84,6 +84,7 @@ static const struct ffa_bus_ops ffa_ops = { + .partition_info_get = ffa_get_partitions_info_hdlr, + .sync_send_receive = ffa_msg_send_direct_req_hdlr, + .rxtx_unmap = ffa_unmap_rxtx_buffers_hdlr, ++ .memory_share = ffa_memory_share_hdlr, + }; + + /* Registering the FF-A driver as an SMCCC feature driver */ +diff --git a/include/arm_ffa.h b/include/arm_ffa.h +index db9b1be995e..4d2ea7fd1a6 100644 +--- a/include/arm_ffa.h ++++ b/include/arm_ffa.h +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0+ */ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -81,11 +81,74 @@ struct ffa_send_direct_data { + + struct udevice; + ++/** ++ * struct ffa_mem_region_attributes - Endpoint memory access descriptor ++ * ++ * The data structure used in memory management transactions to create an ++ * association between an endpoint, memory access permissions and a composite ++ * memory region description. ++ * ++ * For more details, please refer to Table 5.16 and Table 5.15 in the FF-A ++ * specification v1.0. ++ * ++ * This structure was taken from Linux. ++ */ ++struct ffa_mem_region_attributes { ++ /* The ID of the VM to which the memory is being given or shared. */ ++ u16 receiver; ++ /* ++ * The permissions with which the memory region should be mapped in the ++ * receiver's page table. ++ */ ++#define FFA_MEM_EXEC BIT(3) ++#define FFA_MEM_NO_EXEC BIT(2) ++#define FFA_MEM_RW BIT(1) ++#define FFA_MEM_RO BIT(0) ++ u8 attrs; ++ /* ++ * Flags used during FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP ++ * for memory regions with multiple borrowers. ++ */ ++#define FFA_MEM_RETRIEVE_SELF_BORROWER BIT(0) ++ u8 flag; ++ /* ++ * Offset in bytes from the start of the outer `ffa_memory_region` to ++ * an `struct ffa_mem_region_addr_range`. ++ */ ++ u32 composite_off; ++ u64 reserved; ++}; ++ ++/** ++ * struct ffa_mem_ops_args - User arguments to the memory management ABIs ++ * @use_txbuf: Whether to use the TX buffer for the memory transaction ++ * @nattrs: Number of the borrowers ++ * @flags: Memory transaction flags ++ * @tag: The tag associated with the transaction ++ * @g_handle: Globally unique Handle to identify the memory region (out) ++ * @address: Virtual address of the memory region ++ * @attrs: Memory access permissions of each borrower ++ * ++ * The structured filled by the user and passed to the memory ++ * management ABIs (e.g: FFA_MEM_SHARE) ++ */ ++struct ffa_mem_ops_args { ++ bool use_txbuf; ++ u32 nattrs; ++ u32 flags; ++ u64 tag; ++ u64 g_handle; ++ void *address; ++ u32 pg_cnt; ++ struct ffa_mem_region_attributes *attrs; ++}; ++ + /** + * struct ffa_bus_ops - Operations for FF-A + * @partition_info_get: callback for the FFA_PARTITION_INFO_GET + * @sync_send_receive: callback for the FFA_MSG_SEND_DIRECT_REQ + * @rxtx_unmap: callback for the FFA_RXTX_UNMAP ++ * @memory_share: callback for the FFA_MEM_SHARE + * + * The data structure providing all the operations supported by the driver. + * This structure is EFI runtime resident. +@@ -97,6 +160,7 @@ struct ffa_bus_ops { + struct ffa_send_direct_data *msg, + bool is_smc64); + int (*rxtx_unmap)(struct udevice *dev); ++ int (*memory_share)(struct udevice *dev, struct ffa_mem_ops_args *args); + }; + + #define ffa_get_ops(dev) ((struct ffa_bus_ops *)(dev)->driver->ops) +@@ -196,6 +260,26 @@ int ffa_partition_info_get(struct udevice *dev, const char *uuid_str, + int ffa_get_partitions_info_hdlr(struct udevice *dev, const char *uuid_str, + u32 *sp_count, struct ffa_partition_desc **sp_descs); + ++/** ++ * ffa_memory_share() - FFA_MEM_SHARE driver operation ++ * Please see ffa_memory_share_hdlr() description for more details. ++ */ ++int ffa_memory_share(struct udevice *dev, struct ffa_mem_ops_args *args); ++ ++/** ++ * ffa_memory_share_hdlr() - FFA_MEM_SHARE handler function ++ * @dev: The FF-A bus device ++ * @args: A pointer to a structure containing additional user arguments ++ * ++ * Implement FFA_MEM_SHARE FF-A function ++ * to grant access to a memory region to one or more Borrowers. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++int ffa_memory_share_hdlr(struct udevice *dev, struct ffa_mem_ops_args *args); ++ + struct ffa_priv; + + /** +diff --git a/include/arm_ffa_priv.h b/include/arm_ffa_priv.h +index d564c33c647..a259911d5b9 100644 +--- a/include/arm_ffa_priv.h ++++ b/include/arm_ffa_priv.h +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0+ */ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -132,10 +132,11 @@ enum ffa_abis { + FFA_RUN = 0x6d, + FFA_MSG_SEND_DIRECT_REQ = 0x6f, + FFA_MSG_SEND_DIRECT_RESP = 0x70, ++ FFA_MEM_SHARE = 0x73, + + /* To be updated when adding new FFA IDs */ + FFA_FIRST_ID = FFA_ERROR, /* Lowest number ID */ +- FFA_LAST_ID = FFA_MSG_SEND_DIRECT_RESP, /* Highest number ID */ ++ FFA_LAST_ID = FFA_MEM_SHARE, /* Highest number ID */ + }; + + enum ffa_abi_errcode { +@@ -219,6 +220,143 @@ struct ffa_priv { + struct ffa_rxtxpair pair; + }; + ++/* FF-A memory management ABIs data structures */ ++ ++/** ++ * struct ffa_mem_region - Lend, donate or share memory transaction descriptor ++ * ++ * Specifies the data structure that must be used by the Owner/Lender and a ++ * Borrower/Receiver in a transaction to donate, lend or share a memory region. ++ * It specifies the memory region description, properties and other transaction ++ * attributes in an invocation of the following ABIs. ++ * ++ * FFA_MEM_DONATE. ++ * FFA_MEM_LEND. ++ * FFA_MEM_SHARE. ++ * FFA_MEM_RETRIEVE_REQ. ++ * FFA_MEM_RETRIEVE_RESP. ++ * ++ * For more details, please refer to the Table 5.19 in the FF-A specification ++ * v1.0. ++ * ++ * The interpretation of some fields depends on the ABI this structure is used ++ * with. This variance in behavior is also specified in the Table 5.19. ++ * ++ * This structure was taken from Linux and adapted to FF-A v1.0. ++ */ ++struct ffa_mem_region { ++ /* The ID of the VM/owner which originally sent the memory region */ ++ u16 sender_id; ++#define FFA_MEM_NORMAL BIT(5) ++#define FFA_MEM_DEVICE BIT(4) ++ ++#define FFA_MEM_WRITE_BACK (3 << 2) ++#define FFA_MEM_NON_CACHEABLE BIT(2) ++ ++#define FFA_DEV_nGnRnE (0 << 2) ++#define FFA_DEV_nGnRE BIT(2) ++#define FFA_DEV_nGRE (2 << 2) ++#define FFA_DEV_GRE (3 << 2) ++ ++#define FFA_MEM_NON_SHAREABLE (0) ++#define FFA_MEM_OUTER_SHAREABLE (2) ++#define FFA_MEM_INNER_SHAREABLE (3) ++ /* Memory region attributes */ ++ u8 attributes; ++ ++ u8 reserved1; ++ ++/* ++ * Clear memory region contents after unmapping it from the sender and ++ * before mapping it for any receiver. ++ */ ++#define FFA_MEM_CLEAR BIT(0) ++/* ++ * Whether the hypervisor may time slice the memory sharing or retrieval ++ * operation. ++ */ ++#define FFA_TIME_SLICE_ENABLE BIT(1) ++ ++#define FFA_MEM_RETRIEVE_TYPE_IN_RESP (0 << 3) ++#define FFA_MEM_RETRIEVE_TYPE_SHARE BIT(3) ++#define FFA_MEM_RETRIEVE_TYPE_LEND (2 << 3) ++#define FFA_MEM_RETRIEVE_TYPE_DONATE (3 << 3) ++ ++#define FFA_MEM_RETRIEVE_ADDR_ALIGN_HINT BIT(9) ++#define FFA_MEM_RETRIEVE_ADDR_ALIGN(x) ((x) << 5) ++ /* Flags to control behaviour of the transaction. */ ++ u32 flags; ++#define HANDLE_LOW_MASK GENMASK_ULL(31, 0) ++#define HANDLE_HIGH_MASK GENMASK_ULL(63, 32) ++#define HANDLE_LOW(x) ((u32)(FIELD_GET(HANDLE_LOW_MASK, (x)))) ++#define HANDLE_HIGH(x) ((u32)(FIELD_GET(HANDLE_HIGH_MASK, (x)))) ++ ++#define PACK_HANDLE(l, h) \ ++ (FIELD_PREP(HANDLE_LOW_MASK, (l)) | FIELD_PREP(HANDLE_HIGH_MASK, (h))) ++ /* ++ * A globally-unique ID assigned by the hypervisor for a region ++ * of memory being sent between VMs. ++ */ ++ u64 handle; ++ /* ++ * An implementation defined value associated with the receiver and the ++ * memory region. ++ */ ++ u64 tag; ++ ++ u32 reserved2; ++ ++ /* ++ * The number of `ffa_mem_region_attributes` entries included in this ++ * transaction. ++ */ ++ u32 ep_count; ++}; ++ ++/** ++ * struct ffa_mem_region_addr_range - Constituent memory region descriptor ++ * ++ * Each descriptor specifies the base address and size of a virtually or ++ * physically contiguous memory region. ++ * ++ * For more details, please refer to Table 5.14 in the FF-A ++ * specification v1.0. ++ * ++ * This structure was taken from Linux. ++ */ ++struct ffa_mem_region_addr_range { ++ /* The base IPA of the constituent memory region, aligned to 4 kiB */ ++ u64 address; ++ /* The number of 4 kiB pages in the constituent memory region. */ ++ u32 pg_cnt; ++ u32 reserved; ++}; ++ ++/** ++ * struct ffa_composite_mem_region - Composite memory region descriptor ++ * ++ * For more details, please refer to Table 5.13 in the FF-A ++ * specification v1.0. ++ * ++ * This structure was taken from Linux. ++ */ ++struct ffa_composite_mem_region { ++ /* ++ * The total number of 4 kiB pages included in this memory region. This ++ * must be equal to the sum of page counts specified in each ++ * `struct ffa_mem_region_addr_range`. ++ */ ++ u32 total_pg_cnt; ++ /* The number of constituents included in this memory region range */ ++#define FFA_MEM_CONSTITUENTS (1) ++ u32 addr_range_cnt; ++ u64 reserved; ++ /** An array of `addr_range_cnt` memory region constituents. */ ++ struct ffa_mem_region_addr_range constituents[]; ++}; ++ ++/* Functions prototypes */ ++ + /** + * ffa_get_version_hdlr() - FFA_VERSION handler function + * @dev: The FF-A bus device +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-FF-A-v15-lib-uuid-introduce-testcase-for-uuid_str_to.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-FF-A-v15-lib-uuid-introduce-testcase-for-uuid_str_to.patch deleted file mode 100644 index bec856e1..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-FF-A-v15-lib-uuid-introduce-testcase-for-uuid_str_to.patch +++ /dev/null @@ -1,91 +0,0 @@ -From fe51e27e4f0033e9737a1099d0dd06f976a60705 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 27 Mar 2023 16:24:29 +0100 -Subject: [PATCH] FF-A v15: lib: uuid: introduce testcase for - uuid_str_to_le_bin - -provide a test case - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Cc: Tom Rini -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - MAINTAINERS | 5 +++++ - test/lib/Makefile | 1 + - test/lib/uuid.c | 41 +++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 47 insertions(+) - create mode 100644 test/lib/uuid.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index 3bf60c4643..a1122afb01 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1632,3 +1632,8 @@ S: Maintained - F: arch/arm/dts/ls1021a-twr-u-boot.dtsi - F: drivers/crypto/fsl/ - F: include/fsl_sec.h -+ -+UUID testing -+M: Abdellatif El Khlifi -+S: Maintained -+F: test/lib/uuid.c -diff --git a/test/lib/Makefile b/test/lib/Makefile -index e0bd9e04e8..e75a263e6a 100644 ---- a/test/lib/Makefile -+++ b/test/lib/Makefile -@@ -22,6 +22,7 @@ obj-$(CONFIG_AES) += test_aes.o - obj-$(CONFIG_GETOPT) += getopt.o - obj-$(CONFIG_CRC8) += test_crc8.o - obj-$(CONFIG_UT_LIB_CRYPT) += test_crypt.o -+obj-$(CONFIG_LIB_UUID) += uuid.o - else - obj-$(CONFIG_SANDBOX) += kconfig_spl.o - endif -diff --git a/test/lib/uuid.c b/test/lib/uuid.c -new file mode 100644 -index 0000000000..e24331a136 ---- /dev/null -+++ b/test/lib/uuid.c -@@ -0,0 +1,41 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Functional tests for UCLASS_FFA class -+ * -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+/* test UUID */ -+#define TEST_SVC_UUID "ed32d533-4209-99e6-2d72-cdd998a79cc0" -+ -+#define UUID_SIZE 16 -+ -+/* The UUID binary data (little-endian format) */ -+static const u8 ref_uuid_bin[UUID_SIZE] = { -+ 0x33, 0xd5, 0x32, 0xed, -+ 0x09, 0x42, 0xe6, 0x99, -+ 0x72, 0x2d, 0xc0, 0x9c, -+ 0xa7, 0x98, 0xd9, 0xcd -+}; -+ -+static int lib_test_uuid_to_le(struct unit_test_state *uts) -+{ -+ const char *uuid_str = TEST_SVC_UUID; -+ u8 ret_uuid_bin[UUID_SIZE] = {0}; -+ -+ ut_assertok(uuid_str_to_le_bin(uuid_str, ret_uuid_bin)); -+ ut_asserteq_mem(ref_uuid_bin, ret_uuid_bin, UUID_SIZE); -+ -+ return 0; -+} -+ -+LIB_TEST(lib_test_uuid_to_le, 0); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-arm_ffa-Add-FFA_MEM_RECLAIM-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-arm_ffa-Add-FFA_MEM_RECLAIM-support.patch new file mode 100644 index 00000000..a1d3e812 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0003-arm_ffa-Add-FFA_MEM_RECLAIM-support.patch @@ -0,0 +1,232 @@ +From 09d9e3d05845de1c18672e3bcfabb3ef78092653 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Tue, 29 Oct 2024 17:24:43 +0000 +Subject: [PATCH 03/36] arm_ffa: Add FFA_MEM_RECLAIM support + +Add to the FF-A bus FFA_MEM_RECLAIM ABI + +The FFA_MEM_RECLAIM is a memory management ABI described in the FF-A +v1.0 specification [1]. + +This ABI restores exclusive access to a memory region back to its Owner. + +This work is based on the implementation in Linux [2]. + +[1]: https://developer.arm.com/documentation/den0077/a/?lang=en +[2]: commit cc2195fe536c28e192df5d07e6dd277af36814b4 + File: drivers/firmware/arm_ffa/driver.c + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + doc/arch/arm64.ffa.rst | 2 + + drivers/firmware/arm-ffa/arm-ffa-uclass.c | 76 +++++++++++++++++++++++ + drivers/firmware/arm-ffa/arm-ffa.c | 1 + + include/arm_ffa.h | 25 +++++++- + include/arm_ffa_priv.h | 3 +- + 5 files changed, 105 insertions(+), 2 deletions(-) + +diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst +index 3eec735d741..d2c4fb49f79 100644 +--- a/doc/arch/arm64.ffa.rst ++++ b/doc/arch/arm64.ffa.rst +@@ -186,6 +186,7 @@ The following features are provided: + - FFA_MSG_SEND_DIRECT_REQ + - FFA_MSG_SEND_DIRECT_RESP + - FFA_MEM_SHARE ++ - FFA_MEM_RECLAIM + + - Support for the 64-bit version of the following ABIs: + +@@ -205,6 +206,7 @@ The following features are provided: + - ffa_sync_send_receive + - ffa_rxtx_unmap + - ffa_memory_share ++ - ffa_memory_reclaim + + - FF-A bus discovery makes sure FF-A framework is responsive and compatible + with the driver +diff --git a/drivers/firmware/arm-ffa/arm-ffa-uclass.c b/drivers/firmware/arm-ffa/arm-ffa-uclass.c +index 2ba0b925fa6..597b4e994b4 100644 +--- a/drivers/firmware/arm-ffa/arm-ffa-uclass.c ++++ b/drivers/firmware/arm-ffa/arm-ffa-uclass.c +@@ -109,6 +109,18 @@ static struct ffa_abi_errmap err_msg_map[FFA_ERRMAP_COUNT] = { + "DENIED: Memory region ownership, permission, access or attributes error", + }, + }, ++ [FFA_ID_TO_ERRMAP_ID(FFA_MEM_RECLAIM)] = { ++ { ++ [ABORTED] = ++ "ABORTED: ABI invocation failure", ++ [INVALID_PARAMETERS] = ++ "INVALID_PARAMETERS: Invalid handle or flags", ++ [NO_MEMORY] = ++ "NO_MEMORY: Failure to create the Owner's mapping", ++ [DENIED] = ++ "DENIED: Memory region state issue", ++ }, ++ }, + }; + + /** +@@ -1114,6 +1126,44 @@ int ffa_memory_share_hdlr(struct udevice *dev, struct ffa_mem_ops_args *args) + return ffa_memory_ops(dev, FFA_MEM_SHARE, args); + } + ++/** ++ * ffa_memory_reclaim_hdlr() - FFA_MEM_RECLAIM handler function ++ * @dev: The FF-A bus device ++ * @g_handle: The memory region globally unique Handle ++ * @flags: Zero memory and time slicing flags ++ * ++ * Implement FFA_MEM_RECLAIM FF-A function ++ * to restore exclusive access to a memory region back to its Owner. ++ * Note: FFA_MEM_RECLAIM can not be used at EFI runtime because memory that was ++ * lent as per the memory map during boot time can not be reclaimed into the ++ * memory map during runtime. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++int ffa_memory_reclaim_hdlr(struct udevice *dev, u64 g_handle, u32 flags) ++{ ++ ffa_value_t res; ++ int ffa_errno; ++ ++ invoke_ffa_fn((ffa_value_t){ ++ .a0 = FFA_SMC_32(FFA_MEM_RECLAIM), ++ .a1 = HANDLE_LOW(g_handle), .a2 = HANDLE_HIGH(g_handle), ++ .a3 = flags, ++ }, ++ &res ++ ); ++ ++ if (res.a0 != FFA_SMC_32(FFA_SUCCESS)) { ++ ffa_errno = res.a2; ++ ffa_print_error_log(FFA_MEM_RECLAIM, ffa_errno); ++ return ffa_to_std_errno(ffa_errno); ++ } ++ ++ return 0; ++} ++ + /* FF-A driver operations (used by clients for communicating with FF-A)*/ + + /** +@@ -1225,6 +1275,32 @@ int ffa_memory_share(struct udevice *dev, struct ffa_mem_ops_args *args) + return ops->memory_share(dev, args); + } + ++/** ++ * ffa_memory_reclaim() - FFA_MEM_RECLAIM driver operation ++ * @dev: The FF-A bus device ++ * @g_handle: The memory region globally unique Handle ++ * @flags: Zero memory and time slicing flags ++ * ++ * Driver operation for FFA_MEM_RECLAIM. ++ * Please see ffa_memory_reclaim_hdlr() description for more details. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++int ffa_memory_reclaim(struct udevice *dev, u64 g_handle, u32 flags) ++{ ++ struct ffa_bus_ops *ops = ffa_get_ops(dev); ++ ++ if (!ops) ++ return -EINVAL; ++ ++ if (!ops->memory_reclaim) ++ return -ENOSYS; ++ ++ return ops->memory_reclaim(dev, g_handle, flags); ++} ++ + /** + * ffa_do_probe() - probing FF-A framework + * @dev: the FF-A bus device (arm_ffa) +diff --git a/drivers/firmware/arm-ffa/arm-ffa.c b/drivers/firmware/arm-ffa/arm-ffa.c +index df904cae412..de36f5647d2 100644 +--- a/drivers/firmware/arm-ffa/arm-ffa.c ++++ b/drivers/firmware/arm-ffa/arm-ffa.c +@@ -85,6 +85,7 @@ static const struct ffa_bus_ops ffa_ops = { + .sync_send_receive = ffa_msg_send_direct_req_hdlr, + .rxtx_unmap = ffa_unmap_rxtx_buffers_hdlr, + .memory_share = ffa_memory_share_hdlr, ++ .memory_reclaim = ffa_memory_reclaim_hdlr, + }; + + /* Registering the FF-A driver as an SMCCC feature driver */ +diff --git a/include/arm_ffa.h b/include/arm_ffa.h +index 4d2ea7fd1a6..a36f461662c 100644 +--- a/include/arm_ffa.h ++++ b/include/arm_ffa.h +@@ -147,8 +147,9 @@ struct ffa_mem_ops_args { + * struct ffa_bus_ops - Operations for FF-A + * @partition_info_get: callback for the FFA_PARTITION_INFO_GET + * @sync_send_receive: callback for the FFA_MSG_SEND_DIRECT_REQ +- * @rxtx_unmap: callback for the FFA_RXTX_UNMAP ++ * @rxtx_unmap: callback for the FFA_RXTX_UNMAP + * @memory_share: callback for the FFA_MEM_SHARE ++ * @memory_reclaim: callback for the FFA_MEM_RECLAIM + * + * The data structure providing all the operations supported by the driver. + * This structure is EFI runtime resident. +@@ -161,6 +162,7 @@ struct ffa_bus_ops { + bool is_smc64); + int (*rxtx_unmap)(struct udevice *dev); + int (*memory_share)(struct udevice *dev, struct ffa_mem_ops_args *args); ++ int (*memory_reclaim)(struct udevice *dev, u64 g_handle, u32 flags); + }; + + #define ffa_get_ops(dev) ((struct ffa_bus_ops *)(dev)->driver->ops) +@@ -280,6 +282,27 @@ int ffa_memory_share(struct udevice *dev, struct ffa_mem_ops_args *args); + */ + int ffa_memory_share_hdlr(struct udevice *dev, struct ffa_mem_ops_args *args); + ++/** ++ * ffa_memory_reclaim() - FFA_MEM_RECLAIM driver operation ++ * Please see ffa_memory_reclaim_hdlr() description for more details. ++ */ ++int ffa_memory_reclaim(struct udevice *dev, u64 g_handle, u32 flags); ++ ++/** ++ * ffa_memory_reclaim_hdlr() - FFA_MEM_RECLAIM handler function ++ * @dev: The FF-A bus device ++ * @g_handle: The memory region globally unique Handle ++ * @flags: Zero memory and time slicing flags ++ * ++ * Implement FFA_MEM_RECLAIM FF-A function ++ * to restore exclusive access to a memory region back to its Owner. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++int ffa_memory_reclaim_hdlr(struct udevice *dev, u64 g_handle, u32 flags); ++ + struct ffa_priv; + + /** +diff --git a/include/arm_ffa_priv.h b/include/arm_ffa_priv.h +index a259911d5b9..54196199ce3 100644 +--- a/include/arm_ffa_priv.h ++++ b/include/arm_ffa_priv.h +@@ -133,10 +133,11 @@ enum ffa_abis { + FFA_MSG_SEND_DIRECT_REQ = 0x6f, + FFA_MSG_SEND_DIRECT_RESP = 0x70, + FFA_MEM_SHARE = 0x73, ++ FFA_MEM_RECLAIM = 0x77, + + /* To be updated when adding new FFA IDs */ + FFA_FIRST_ID = FFA_ERROR, /* Lowest number ID */ +- FFA_LAST_ID = FFA_MEM_SHARE, /* Highest number ID */ ++ FFA_LAST_ID = FFA_MEM_RECLAIM, /* Highest number ID */ + }; + + enum ffa_abi_errcode { +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-FF-A-v15-arm_ffa-introduce-Arm-FF-A-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-FF-A-v15-arm_ffa-introduce-Arm-FF-A-support.patch deleted file mode 100644 index dcbc5744..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-FF-A-v15-arm_ffa-introduce-Arm-FF-A-support.patch +++ /dev/null @@ -1,2129 +0,0 @@ -From d1f0d01f1d863c2b98cc181dfc752f6c71faefaf Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 17 Jul 2023 15:11:43 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: introduce Arm FF-A support - -Add Arm FF-A support implementing Arm Firmware Framework for Armv8-A v1.0 - -The Firmware Framework for Arm A-profile processors (FF-A v1.0) [1] -describes interfaces (ABIs) that standardize communication -between the Secure World and Normal World leveraging TrustZone -technology. - -This driver uses 64-bit registers as per SMCCCv1.2 spec and comes -on top of the SMCCC layer. The driver provides the FF-A ABIs needed for -querying the FF-A framework from the secure world. - -The driver uses SMC32 calling convention which means using the first -32-bit data of the Xn registers. - -All supported ABIs come with their 32-bit version except FFA_RXTX_MAP -which has 64-bit version supported. - -Both 32-bit and 64-bit direct messaging are supported which allows both -32-bit and 64-bit clients to use the FF-A bus. - -FF-A is a discoverable bus and similar to architecture features. -FF-A bus is discovered using ARM_SMCCC_FEATURES mechanism performed -by the PSCI driver. - -Clients are able to probe then use the FF-A bus by calling the DM class -searching APIs (e.g: uclass_first_device). - -The Secure World is considered as one entity to communicate with -using the FF-A bus. FF-A communication is handled by one device and -one instance (the bus). This FF-A driver takes care of all the -interactions between Normal world and Secure World. - -The driver exports its operations to be used by upper layers. - -Exported operations: - -- ffa_partition_info_get -- ffa_sync_send_receive -- ffa_rxtx_unmap - -Generic FF-A methods are implemented in the Uclass (arm-ffa-uclass.c). -Arm specific methods are implemented in the Arm driver (arm-ffa.c). - -For more details please refer to the driver documentation [2]. - -[1]: https://developer.arm.com/documentation/den0077/latest/ -[2]: doc/arch/arm64.ffa.rst - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - MAINTAINERS | 8 + - doc/arch/arm64.ffa.rst | 238 ++++ - doc/arch/index.rst | 1 + - drivers/Makefile | 1 + - drivers/firmware/Kconfig | 1 + - drivers/firmware/arm-ffa/Kconfig | 36 + - drivers/firmware/arm-ffa/Makefile | 8 + - drivers/firmware/arm-ffa/arm-ffa-uclass.c | 1065 +++++++++++++++++ - drivers/firmware/arm-ffa/arm-ffa.c | 104 ++ - .../firmware/arm-ffa/sandbox_arm_ffa_priv.h | 14 + - include/arm_ffa.h | 213 ++++ - include/arm_ffa_priv.h | 246 ++++ - include/dm/uclass-id.h | 6 + - 13 files changed, 1941 insertions(+) - create mode 100644 doc/arch/arm64.ffa.rst - create mode 100644 drivers/firmware/arm-ffa/Kconfig - create mode 100644 drivers/firmware/arm-ffa/Makefile - create mode 100644 drivers/firmware/arm-ffa/arm-ffa-uclass.c - create mode 100644 drivers/firmware/arm-ffa/arm-ffa.c - create mode 100644 drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h - create mode 100644 include/arm_ffa.h - create mode 100644 include/arm_ffa_priv.h - -diff --git a/MAINTAINERS b/MAINTAINERS -index a1122afb01..9c5ebf312c 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -266,6 +266,14 @@ F: drivers/net/cortina_ni.h - F: drivers/net/phy/ca_phy.c - F: configs/cortina_presidio-asic-pnand_defconfig - -+ARM FF-A -+M: Abdellatif El Khlifi -+S: Maintained -+F: doc/arch/arm64.ffa.rst -+F: drivers/firmware/arm-ffa/ -+F: include/arm_ffa.h -+F: include/sandbox_arm_ffa.h -+ - ARM FREESCALE IMX - M: Stefano Babic - M: Fabio Estevam -diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst -new file mode 100644 -index 0000000000..4f817f053c ---- /dev/null -+++ b/doc/arch/arm64.ffa.rst -@@ -0,0 +1,238 @@ -+.. SPDX-License-Identifier: GPL-2.0+ -+ -+Arm FF-A Support -+================ -+ -+Summary -+------- -+ -+FF-A stands for Firmware Framework for Arm A-profile processors. -+ -+FF-A specifies interfaces that enable a pair of software execution environments aka partitions to -+communicate with each other. A partition could be a VM in the Normal or Secure world, an -+application in S-EL0, or a Trusted OS in S-EL1. -+ -+The U-Boot FF-A support (the bus) implements the interfaces to communicate -+with partitions in the Secure world aka Secure partitions (SPs). -+ -+The FF-A support specifically focuses on communicating with SPs that -+isolate portions of EFI runtime services that must run in a protected -+environment which is inaccessible by the Host OS or Hypervisor. -+Examples of such services are set/get variables. -+ -+The FF-A support uses the SMC ABIs defined by the FF-A specification to: -+ -+- Discover the presence of SPs of interest -+- Access an SP's service through communication protocols -+ e.g. EFI MM communication protocol -+ -+At this stage of development only EFI boot-time services are supported. -+Runtime support will be added in future developments. -+ -+The U-Boot FF-A support provides the following parts: -+ -+- A Uclass driver providing generic FF-A methods. -+- An Arm FF-A device driver providing Arm-specific methods and reusing the Uclass methods. -+ -+FF-A and SMC specifications -+------------------------------------------- -+ -+The current implementation of the U-Boot FF-A support relies on -+`FF-A v1.0 specification`_ and uses SMC32 calling convention which -+means using the first 32-bit data of the Xn registers. -+ -+At this stage we only need the FF-A v1.0 features. -+ -+The FF-A support has been tested with OP-TEE which supports SMC32 calling -+convention. -+ -+Hypervisors are supported if they are configured to trap SMC calls. -+ -+The FF-A support uses 64-bit registers as per `SMC Calling Convention v1.2 specification`_. -+ -+Supported hardware -+-------------------------------- -+ -+Aarch64 plaforms -+ -+Configuration -+---------------------- -+ -+CONFIG_ARM_FFA_TRANSPORT -+ Enables the FF-A support. Turn this on if you want to use FF-A -+ communication. -+ When using an Arm 64-bit platform, the Arm FF-A driver will be used. -+ -+FF-A ABIs under the hood -+--------------------------------------- -+ -+Invoking an FF-A ABI involves providing to the secure world/hypervisor the -+expected arguments from the ABI. -+ -+On an Arm 64-bit platform, the ABI arguments are stored in x0 to x7 registers. -+Then, an SMC instruction is executed. -+ -+At the secure side level or hypervisor the ABI is handled at a higher exception -+level and the arguments are read and processed. -+ -+The response is put back through x0 to x7 registers and control is given back -+to the U-Boot Arm FF-A driver (non-secure world). -+ -+The driver reads the response and processes it accordingly. -+ -+This methodology applies to all the FF-A ABIs. -+ -+FF-A bus discovery on Arm 64-bit platforms -+--------------------------------------------- -+ -+When CONFIG_ARM_FFA_TRANSPORT is enabled, the FF-A bus is considered as -+an architecture feature and discovered using ARM_SMCCC_FEATURES mechanism. -+This discovery mechanism is performed by the PSCI driver. -+ -+The PSCI driver comes with a PSCI device tree node which is the root node for all -+architecture features including FF-A bus. -+ -+:: -+ -+ => dm tree -+ -+ Class Index Probed Driver Name -+ ----------------------------------------------------------- -+ ... -+ firmware 0 [ + ] psci |-- psci -+ ffa 0 [ ] arm_ffa | `-- arm_ffa -+ ... -+ -+The PSCI driver is bound to the PSCI device and when probed it tries to discover -+the architecture features by calling a callback the features drivers provide. -+ -+In case of FF-A, the callback is arm_ffa_is_supported() which tries to discover the -+FF-A framework by querying the FF-A framework version from secure world using -+FFA_VERSION ABI. When discovery is successful, the ARM_SMCCC_FEATURES -+mechanism creates a U-Boot device for the FF-A bus and binds the Arm FF-A driver -+with the device using device_bind_driver(). -+ -+At this stage the FF-A bus is registered with the DM and can be interacted with using -+the DM APIs. -+ -+Clients are able to probe then use the FF-A bus by calling uclass_first_device(). -+Please refer to the armffa command implementation as an example of how to probe -+and interact with the FF-A bus. -+ -+When calling uclass_first_device(), the FF-A driver is probed and ends up calling -+ffa_do_probe() provided by the Uclass which does the following: -+ -+ - saving the FF-A framework version in uc_priv -+ - querying from secure world the u-boot endpoint ID -+ - querying from secure world the supported features of FFA_RXTX_MAP -+ - mapping the RX/TX buffers -+ - querying from secure world all the partitions information -+ -+When one of the above actions fails, probing fails and the driver stays not active -+and can be probed again if needed. -+ -+Requirements for clients -+------------------------------------- -+ -+When using the FF-A bus with EFI, clients must query the SPs they are looking for -+during EFI boot-time mode using the service UUID. -+ -+The RX/TX buffers are only available at EFI boot-time. Querying partitions is -+done at boot time and data is cached for future use. -+ -+RX/TX buffers should be unmapped before EFI runtime mode starts. -+The driver provides a bus operation for that called ffa_rxtx_unmap(). -+ -+The user should call ffa_rxtx_unmap() to unmap the RX/TX buffers when required -+(e.g: at efi_exit_boot_services()). -+ -+The Linux kernel allocates its own RX/TX buffers. To be able to register these kernel buffers -+with secure world, the U-Boot's RX/TX buffers should be unmapped before EFI runtime starts. -+ -+When invoking FF-A direct messaging, clients should specify which ABI protocol -+they want to use (32-bit vs 64-bit). Selecting the protocol means using -+the 32-bit or 64-bit version of FFA_MSG_SEND_DIRECT_{REQ, RESP}. -+The calling convention between U-Boot and the secure world stays the same: SMC32. -+ -+Requirements for user drivers -+------------------------------------- -+ -+Users who want to implement their custom FF-A device driver while reusing the FF-A Uclass can do so -+by implementing their own invoke_ffa_fn() in the user driver. -+ -+The bus driver layer -+------------------------------ -+ -+FF-A support comes on top of the SMCCC layer and is implemented by the FF-A Uclass drivers/firmware/arm-ffa/arm-ffa-uclass.c -+ -+The following features are provided: -+ -+- Support for the 32-bit version of the following ABIs: -+ -+ - FFA_VERSION -+ - FFA_ID_GET -+ - FFA_FEATURES -+ - FFA_PARTITION_INFO_GET -+ - FFA_RXTX_UNMAP -+ - FFA_RX_RELEASE -+ - FFA_RUN -+ - FFA_ERROR -+ - FFA_SUCCESS -+ - FFA_INTERRUPT -+ - FFA_MSG_SEND_DIRECT_REQ -+ - FFA_MSG_SEND_DIRECT_RESP -+ -+- Support for the 64-bit version of the following ABIs: -+ -+ - FFA_RXTX_MAP -+ - FFA_MSG_SEND_DIRECT_REQ -+ - FFA_MSG_SEND_DIRECT_RESP -+ -+- Processing the received data from the secure world/hypervisor and caching it -+ -+- Hiding from upper layers the FF-A protocol and registers details. Upper -+ layers focus on exchanged data, FF-A support takes care of how to transport -+ that to the secure world/hypervisor using FF-A -+ -+- FF-A support provides driver operations to be used by upper layers: -+ -+ - ffa_partition_info_get -+ - ffa_sync_send_receive -+ - ffa_rxtx_unmap -+ -+- FF-A bus discovery makes sure FF-A framework is responsive and compatible -+ with the driver -+ -+- FF-A bus can be compiled and used without EFI -+ -+Example of boot logs with FF-A enabled -+-------------------------------------- -+ -+For example, when using FF-A with Corstone-1000 the logs are as follows: -+ -+:: -+ -+ U-Boot 2023.01 (May 10 2023 - 11:08:07 +0000) corstone1000 aarch64 -+ -+ DRAM: 2 GiB -+ Arm FF-A framework discovery -+ FF-A driver 1.0 -+ FF-A framework 1.0 -+ FF-A versions are compatible -+ ... -+ FF-A driver 1.0 -+ FF-A framework 1.0 -+ FF-A versions are compatible -+ EFI: MM partition ID 0x8003 -+ ... -+ EFI stub: Booting Linux Kernel... -+ ... -+ Linux version 6.1.9-yocto-standard (oe-user@oe-host) (aarch64-poky-linux-musl-gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.40.202301193 -+ Machine model: ARM Corstone1000 FPGA MPS3 board -+ -+Contributors -+------------ -+ * Abdellatif El Khlifi -+ -+.. _`FF-A v1.0 specification`: https://documentation-service.arm.com/static/5fb7e8a6ca04df4095c1d65e -+.. _`SMC Calling Convention v1.2 specification`: https://documentation-service.arm.com/static/5f8edaeff86e16515cdbe4c6 -diff --git a/doc/arch/index.rst b/doc/arch/index.rst -index b8da4b8c8e..2f916f4026 100644 ---- a/doc/arch/index.rst -+++ b/doc/arch/index.rst -@@ -8,6 +8,7 @@ Architecture-specific doc - - arc - arm64 -+ arm64.ffa - m68k - mips - nios2 -diff --git a/drivers/Makefile b/drivers/Makefile -index 29be78a3f2..6094fac50d 100644 ---- a/drivers/Makefile -+++ b/drivers/Makefile -@@ -114,6 +114,7 @@ obj-y += iommu/ - obj-y += smem/ - obj-y += thermal/ - obj-$(CONFIG_TEE) += tee/ -+obj-$(CONFIG_ARM_FFA_TRANSPORT) += firmware/arm-ffa/ - obj-y += axi/ - obj-y += ufs/ - obj-$(CONFIG_W1) += w1/ -diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig -index eae1c8ddc9..8789b1ea14 100644 ---- a/drivers/firmware/Kconfig -+++ b/drivers/firmware/Kconfig -@@ -45,4 +45,5 @@ config ARM_SMCCC_FEATURES - the PSCI driver is always probed and binds dirvers registered to the Arm SMCCC - services if any and reported as supported by the SMCCC firmware. - -+source "drivers/firmware/arm-ffa/Kconfig" - source "drivers/firmware/scmi/Kconfig" -diff --git a/drivers/firmware/arm-ffa/Kconfig b/drivers/firmware/arm-ffa/Kconfig -new file mode 100644 -index 0000000000..9200c8028b ---- /dev/null -+++ b/drivers/firmware/arm-ffa/Kconfig -@@ -0,0 +1,36 @@ -+# SPDX-License-Identifier: GPL-2.0 -+ -+config ARM_FFA_TRANSPORT -+ bool "Enable Arm Firmware Framework for Armv8-A driver" -+ depends on DM && ARM64 -+ select ARM_SMCCC -+ select ARM_SMCCC_FEATURES -+ select LIB_UUID -+ select DEVRES -+ help -+ The Firmware Framework for Arm A-profile processors (FF-A) -+ describes interfaces (ABIs) that standardize communication -+ between the Secure World and Normal World leveraging TrustZone -+ technology. -+ -+ The FF-A support in U-Boot is based on FF-A specification v1.0 and uses SMC32 -+ calling convention. -+ -+ FF-A specification: -+ -+ https://developer.arm.com/documentation/den0077/a/?lang=en -+ -+ In U-Boot FF-A design, FF-A is considered as a discoverable bus. -+ FF-A bus is discovered using ARM_SMCCC_FEATURES mechanism performed -+ by the PSCI driver. -+ The Secure World is considered as one entity to communicate with -+ using the FF-A bus. -+ FF-A communication is handled by one device and one instance (the bus). -+ The FF-A support on U-Boot takes care of all the interactions between Normal -+ world and Secure World. -+ -+ Generic FF-A methods are implemented in the Uclass (arm-ffa-uclass.c). -+ Arm specific methods are implemented in the Arm driver (arm-ffa.c). -+ -+ For more details about the FF-A support, please refer to doc/arch/arm64.ffa.rst -+ -diff --git a/drivers/firmware/arm-ffa/Makefile b/drivers/firmware/arm-ffa/Makefile -new file mode 100644 -index 0000000000..11b1766285 ---- /dev/null -+++ b/drivers/firmware/arm-ffa/Makefile -@@ -0,0 +1,8 @@ -+# SPDX-License-Identifier: GPL-2.0+ -+# -+# Copyright 2022-2023 Arm Limited and/or its affiliates -+# -+# Authors: -+# Abdellatif El Khlifi -+ -+obj-y += arm-ffa-uclass.o arm-ffa.o -diff --git a/drivers/firmware/arm-ffa/arm-ffa-uclass.c b/drivers/firmware/arm-ffa/arm-ffa-uclass.c -new file mode 100644 -index 0000000000..ffa9d81fa7 ---- /dev/null -+++ b/drivers/firmware/arm-ffa/arm-ffa-uclass.c -@@ -0,0 +1,1065 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+DECLARE_GLOBAL_DATA_PTR; -+ -+/* Error mapping declarations */ -+ -+int ffa_to_std_errmap[MAX_NUMBER_FFA_ERR] = { -+ [NOT_SUPPORTED] = -EOPNOTSUPP, -+ [INVALID_PARAMETERS] = -EINVAL, -+ [NO_MEMORY] = -ENOMEM, -+ [BUSY] = -EBUSY, -+ [INTERRUPTED] = -EINTR, -+ [DENIED] = -EACCES, -+ [RETRY] = -EAGAIN, -+ [ABORTED] = -ECANCELED, -+}; -+ -+static struct ffa_abi_errmap err_msg_map[FFA_ERRMAP_COUNT] = { -+ [FFA_ID_TO_ERRMAP_ID(FFA_VERSION)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: A Firmware Framework implementation does not exist", -+ }, -+ }, -+ [FFA_ID_TO_ERRMAP_ID(FFA_ID_GET)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: This function is not implemented at this FF-A instance", -+ }, -+ }, -+ [FFA_ID_TO_ERRMAP_ID(FFA_FEATURES)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: FFA_RXTX_MAP is not implemented at this FF-A instance", -+ }, -+ }, -+ [FFA_ID_TO_ERRMAP_ID(FFA_PARTITION_INFO_GET)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: This function is not implemented at this FF-A instance", -+ [INVALID_PARAMETERS] = -+ "INVALID_PARAMETERS: Unrecognized UUID", -+ [NO_MEMORY] = -+ "NO_MEMORY: Results cannot fit in RX buffer of the caller", -+ [BUSY] = -+ "BUSY: RX buffer of the caller is not free", -+ [DENIED] = -+ "DENIED: Callee is not in a state to handle this request", -+ }, -+ }, -+ [FFA_ID_TO_ERRMAP_ID(FFA_RXTX_UNMAP)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: FFA_RXTX_UNMAP is not implemented at this FF-A instance", -+ [INVALID_PARAMETERS] = -+ "INVALID_PARAMETERS: No buffer pair registered on behalf of the caller", -+ }, -+ }, -+ [FFA_ID_TO_ERRMAP_ID(FFA_RX_RELEASE)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: FFA_RX_RELEASE is not implemented at this FF-A instance", -+ [DENIED] = -+ "DENIED: Caller did not have ownership of the RX buffer", -+ }, -+ }, -+ [FFA_ID_TO_ERRMAP_ID(FFA_RXTX_MAP)] = { -+ { -+ [NOT_SUPPORTED] = -+ "NOT_SUPPORTED: This function is not implemented at this FF-A instance", -+ [INVALID_PARAMETERS] = -+ "INVALID_PARAMETERS: Field(s) in input parameters incorrectly encoded", -+ [NO_MEMORY] = -+ "NO_MEMORY: Not enough memory", -+ [DENIED] = -+ "DENIED: Buffer pair already registered", -+ }, -+ }, -+}; -+ -+/** -+ * ffa_to_std_errno() - convert FF-A error code to standard error code -+ * @ffa_errno: Error code returned by the FF-A ABI -+ * -+ * Map the given FF-A error code as specified -+ * by the spec to a u-boot standard error code. -+ * -+ * Return: -+ * -+ * The standard error code on success. . Otherwise, failure -+ */ -+static int ffa_to_std_errno(int ffa_errno) -+{ -+ int err_idx = -ffa_errno; -+ -+ /* Map the FF-A error code to the standard u-boot error code */ -+ if (err_idx > 0 && err_idx < MAX_NUMBER_FFA_ERR) -+ return ffa_to_std_errmap[err_idx]; -+ return -EINVAL; -+} -+ -+/** -+ * ffa_print_error_log() - print the error log corresponding to the selected FF-A ABI -+ * @ffa_id: FF-A ABI ID -+ * @ffa_errno: Error code returned by the FF-A ABI -+ * -+ * Map the FF-A error code to the error log relevant to the -+ * selected FF-A ABI. Then the error log is printed. -+ * -+ * Return: -+ * -+ * 0 on success. . Otherwise, failure -+ */ -+static int ffa_print_error_log(u32 ffa_id, int ffa_errno) -+{ -+ int err_idx = -ffa_errno, abi_idx = 0; -+ -+ /* Map the FF-A error code to the corresponding error log */ -+ -+ if (err_idx <= 0 || err_idx >= MAX_NUMBER_FFA_ERR) -+ return -EINVAL; -+ -+ if (ffa_id < FFA_FIRST_ID || ffa_id > FFA_LAST_ID) -+ return -EINVAL; -+ -+ abi_idx = FFA_ID_TO_ERRMAP_ID(ffa_id); -+ if (abi_idx < 0 || abi_idx >= FFA_ERRMAP_COUNT) -+ return -EINVAL; -+ -+ if (!err_msg_map[abi_idx].err_str[err_idx]) -+ return -EINVAL; -+ -+ log_err("%s\n", err_msg_map[abi_idx].err_str[err_idx]); -+ -+ return 0; -+} -+ -+/* FF-A ABIs implementation (U-Boot side) */ -+ -+/** -+ * invoke_ffa_fn() - SMC wrapper -+ * @args: FF-A ABI arguments to be copied to Xn registers -+ * @res: FF-A ABI return data to be copied from Xn registers -+ * -+ * Calls low level SMC implementation. -+ * This function should be implemented by the user driver. -+ */ -+void __weak invoke_ffa_fn(ffa_value_t args, ffa_value_t *res) -+{ -+} -+ -+/** -+ * ffa_get_version_hdlr() - FFA_VERSION handler function -+ * @dev: The FF-A bus device -+ * -+ * Implement FFA_VERSION FF-A function -+ * to get from the secure world the FF-A framework version -+ * FFA_VERSION is used to discover the FF-A framework. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_get_version_hdlr(struct udevice *dev) -+{ -+ u16 major, minor; -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ struct ffa_priv *uc_priv; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_VERSION), .a1 = FFA_VERSION_1_0, -+ }, &res); -+ -+ ffa_errno = res.a0; -+ if (ffa_errno < 0) { -+ ffa_print_error_log(FFA_VERSION, ffa_errno); -+ return ffa_to_std_errno(ffa_errno); -+ } -+ -+ major = GET_FFA_MAJOR_VERSION(res.a0); -+ minor = GET_FFA_MINOR_VERSION(res.a0); -+ -+ log_info("FF-A driver %d.%d\nFF-A framework %d.%d\n", -+ FFA_MAJOR_VERSION, FFA_MINOR_VERSION, major, minor); -+ -+ if (major == FFA_MAJOR_VERSION && minor >= FFA_MINOR_VERSION) { -+ log_info("FF-A versions are compatible\n"); -+ -+ if (dev) { -+ uc_priv = dev_get_uclass_priv(dev); -+ if (uc_priv) -+ uc_priv->fwk_version = res.a0; -+ } -+ -+ return 0; -+ } -+ -+ log_err("versions are incompatible\nExpected: %d.%d , Found: %d.%d\n", -+ FFA_MAJOR_VERSION, FFA_MINOR_VERSION, major, minor); -+ -+ return -EPROTONOSUPPORT; -+} -+ -+/** -+ * ffa_get_endpoint_id() - FFA_ID_GET handler function -+ * @dev: The FF-A bus device -+ * -+ * Implement FFA_ID_GET FF-A function -+ * to get from the secure world u-boot endpoint ID -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_get_endpoint_id(struct udevice *dev) -+{ -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_ID_GET), -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) { -+ uc_priv->id = GET_SELF_ENDPOINT_ID((u32)res.a2); -+ log_debug("FF-A endpoint ID is %u\n", uc_priv->id); -+ -+ return 0; -+ } -+ -+ ffa_errno = res.a2; -+ -+ ffa_print_error_log(FFA_ID_GET, ffa_errno); -+ -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/** -+ * ffa_set_rxtx_buffers_pages_cnt() - set the minimum number of pages in each of the RX/TX buffers -+ * @dev: The FF-A bus device -+ * @prop_field: properties field obtained from FFA_FEATURES ABI -+ * -+ * Set the minimum number of pages in each of the RX/TX buffers in uc_priv -+ * -+ * Return: -+ * -+ * rxtx_min_pages field contains the returned number of pages -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_set_rxtx_buffers_pages_cnt(struct udevice *dev, u32 prop_field) -+{ -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ switch (prop_field) { -+ case RXTX_4K: -+ uc_priv->pair.rxtx_min_pages = 1; -+ break; -+ case RXTX_16K: -+ uc_priv->pair.rxtx_min_pages = 4; -+ break; -+ case RXTX_64K: -+ uc_priv->pair.rxtx_min_pages = 16; -+ break; -+ default: -+ log_err("RX/TX buffer size not supported\n"); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+/** -+ * ffa_get_rxtx_map_features_hdlr() - FFA_FEATURES handler function with FFA_RXTX_MAP argument -+ * @dev: The FF-A bus device -+ * -+ * Implement FFA_FEATURES FF-A function to retrieve the FFA_RXTX_MAP features -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_get_rxtx_map_features_hdlr(struct udevice *dev) -+{ -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_FEATURES), -+ .a1 = FFA_SMC_64(FFA_RXTX_MAP), -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) -+ return ffa_set_rxtx_buffers_pages_cnt(dev, res.a2); -+ -+ ffa_errno = res.a2; -+ ffa_print_error_log(FFA_FEATURES, ffa_errno); -+ -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/** -+ * ffa_free_rxtx_buffers() - free the RX/TX buffers -+ * @dev: The FF-A bus device -+ * -+ * Free the RX/TX buffers -+ */ -+static void ffa_free_rxtx_buffers(struct udevice *dev) -+{ -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ log_debug("Freeing FF-A RX/TX buffers\n"); -+ -+ if (uc_priv->pair.rxbuf) { -+ free(uc_priv->pair.rxbuf); -+ uc_priv->pair.rxbuf = NULL; -+ } -+ -+ if (uc_priv->pair.txbuf) { -+ free(uc_priv->pair.txbuf); -+ uc_priv->pair.txbuf = NULL; -+ } -+} -+ -+/** -+ * ffa_alloc_rxtx_buffers() - allocate the RX/TX buffers -+ * @dev: The FF-A bus device -+ * -+ * Used by ffa_map_rxtx_buffers to allocate -+ * the RX/TX buffers before mapping them. The allocated memory is physically -+ * contiguous since memalign ends up calling malloc which allocates -+ * contiguous memory in u-boot. -+ * The size of the memory allocated is the minimum allowed. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_alloc_rxtx_buffers(struct udevice *dev) -+{ -+ u64 bytes; -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ log_debug("Using %lu 4KB page(s) for FF-A RX/TX buffers size\n", -+ uc_priv->pair.rxtx_min_pages); -+ -+ bytes = uc_priv->pair.rxtx_min_pages * SZ_4K; -+ -+ /* -+ * The alignment of the RX and TX buffers must be equal -+ * to the larger translation granule size -+ * Assumption: Memory allocated with memalign is always physically contiguous -+ */ -+ -+ uc_priv->pair.rxbuf = memalign(bytes, bytes); -+ if (!uc_priv->pair.rxbuf) { -+ log_err("failure to allocate RX buffer\n"); -+ return -ENOBUFS; -+ } -+ -+ log_debug("FF-A RX buffer at virtual address %p\n", uc_priv->pair.rxbuf); -+ -+ uc_priv->pair.txbuf = memalign(bytes, bytes); -+ if (!uc_priv->pair.txbuf) { -+ free(uc_priv->pair.rxbuf); -+ uc_priv->pair.rxbuf = NULL; -+ log_err("failure to allocate the TX buffer\n"); -+ return -ENOBUFS; -+ } -+ -+ log_debug("FF-A TX buffer at virtual address %p\n", uc_priv->pair.txbuf); -+ -+ /* Make sure the buffers are cleared before use */ -+ memset(uc_priv->pair.rxbuf, 0, bytes); -+ memset(uc_priv->pair.txbuf, 0, bytes); -+ -+ return 0; -+} -+ -+/** -+ * ffa_map_rxtx_buffers_hdlr() - FFA_RXTX_MAP handler function -+ * @dev: The FF-A bus device -+ * -+ * Implement FFA_RXTX_MAP FF-A function to map the RX/TX buffers -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_map_rxtx_buffers_hdlr(struct udevice *dev) -+{ -+ int ret; -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ ret = ffa_alloc_rxtx_buffers(dev); -+ if (ret) -+ return ret; -+ -+ /* -+ * we need to pass the physical addresses of the RX/TX buffers -+ * in u-boot physical/virtual mapping is 1:1 -+ * no need to convert from virtual to physical -+ */ -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_64(FFA_RXTX_MAP), -+ .a1 = map_to_sysmem(uc_priv->pair.txbuf), -+ .a2 = map_to_sysmem(uc_priv->pair.rxbuf), -+ .a3 = uc_priv->pair.rxtx_min_pages, -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) { -+ log_debug("FF-A RX/TX buffers mapped\n"); -+ return 0; -+ } -+ -+ ffa_errno = res.a2; -+ ffa_print_error_log(FFA_RXTX_MAP, ffa_errno); -+ -+ ffa_free_rxtx_buffers(dev); -+ -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/** -+ * ffa_unmap_rxtx_buffers_hdlr() - FFA_RXTX_UNMAP handler function -+ * @dev: The FF-A bus device -+ * -+ * Implement FFA_RXTX_UNMAP FF-A function to unmap the RX/TX buffers -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_unmap_rxtx_buffers_hdlr(struct udevice *dev) -+{ -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ struct ffa_priv *uc_priv; -+ -+ log_debug("unmapping FF-A RX/TX buffers\n"); -+ -+ uc_priv = dev_get_uclass_priv(dev); -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_RXTX_UNMAP), -+ .a1 = PREP_SELF_ENDPOINT_ID(uc_priv->id), -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) { -+ ffa_free_rxtx_buffers(dev); -+ return 0; -+ } -+ -+ ffa_errno = res.a2; -+ ffa_print_error_log(FFA_RXTX_UNMAP, ffa_errno); -+ -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/** -+ * ffa_release_rx_buffer_hdlr() - FFA_RX_RELEASE handler function -+ * @dev: The FF-A bus device -+ * -+ * Invoke FFA_RX_RELEASE FF-A function to release the ownership of the RX buffer -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_release_rx_buffer_hdlr(struct udevice *dev) -+{ -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_RX_RELEASE), -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) -+ return 0; -+ -+ ffa_errno = res.a2; -+ ffa_print_error_log(FFA_RX_RELEASE, ffa_errno); -+ -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/** -+ * ffa_uuid_are_identical() - check whether two given UUIDs are identical -+ * @uuid1: first UUID -+ * @uuid2: second UUID -+ * -+ * Used by ffa_read_partitions_info to search for a UUID in the partitions descriptors table -+ * -+ * Return: -+ * -+ * 1 when UUIDs match. Otherwise, 0 -+ */ -+static bool ffa_uuid_are_identical(const struct ffa_partition_uuid *uuid1, -+ const struct ffa_partition_uuid *uuid2) -+{ -+ if (!uuid1 || !uuid2) -+ return 0; -+ -+ return !memcmp(uuid1, uuid2, sizeof(struct ffa_partition_uuid)); -+} -+ -+/** -+ * ffa_read_partitions_info() - read queried partition data -+ * @dev: The FF-A bus device -+ * @count: The number of partitions queried -+ * @part_uuid: Pointer to the partition(s) UUID -+ * -+ * Read the partitions information returned by the FFA_PARTITION_INFO_GET and saves it in uc_priv -+ * -+ * Return: -+ * -+ * uc_priv is updated with the partition(s) information -+ * 0 is returned on success. Otherwise, failure -+ */ -+static int ffa_read_partitions_info(struct udevice *dev, u32 count, -+ struct ffa_partition_uuid *part_uuid) -+{ -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ if (!count) { -+ log_err("no partition detected\n"); -+ return -ENODATA; -+ } -+ -+ log_debug("Reading FF-A partitions data from the RX buffer\n"); -+ -+ if (!part_uuid) { -+ /* Querying information of all partitions */ -+ u64 buf_bytes; -+ u64 data_bytes; -+ u32 desc_idx; -+ struct ffa_partition_info *parts_info; -+ -+ data_bytes = count * sizeof(struct ffa_partition_desc); -+ -+ buf_bytes = uc_priv->pair.rxtx_min_pages * SZ_4K; -+ -+ if (data_bytes > buf_bytes) { -+ log_err("partitions data size exceeds the RX buffer size:\n"); -+ log_err(" sizes in bytes: data %llu , RX buffer %llu\n", -+ data_bytes, -+ buf_bytes); -+ -+ return -ENOMEM; -+ } -+ -+ uc_priv->partitions.descs = devm_kmalloc(dev, data_bytes, __GFP_ZERO); -+ if (!uc_priv->partitions.descs) { -+ log_err("cannot allocate partitions data buffer\n"); -+ return -ENOMEM; -+ } -+ -+ parts_info = uc_priv->pair.rxbuf; -+ -+ for (desc_idx = 0 ; desc_idx < count ; desc_idx++) { -+ uc_priv->partitions.descs[desc_idx].info = -+ parts_info[desc_idx]; -+ -+ log_debug("FF-A partition ID %x : info cached\n", -+ uc_priv->partitions.descs[desc_idx].info.id); -+ } -+ -+ uc_priv->partitions.count = count; -+ -+ log_debug("%d FF-A partition(s) found and cached\n", count); -+ -+ } else { -+ u32 rx_desc_idx, cached_desc_idx; -+ struct ffa_partition_info *parts_info; -+ u8 desc_found; -+ -+ parts_info = uc_priv->pair.rxbuf; -+ -+ /* -+ * Search for the SP IDs read from the RX buffer -+ * in the already cached SPs. -+ * Update the UUID when ID found. -+ */ -+ for (rx_desc_idx = 0; rx_desc_idx < count ; rx_desc_idx++) { -+ desc_found = 0; -+ -+ /* Search the current ID in the cached partitions */ -+ for (cached_desc_idx = 0; -+ cached_desc_idx < uc_priv->partitions.count; -+ cached_desc_idx++) { -+ /* Save the UUID */ -+ if (uc_priv->partitions.descs[cached_desc_idx].info.id == -+ parts_info[rx_desc_idx].id) { -+ uc_priv->partitions.descs[cached_desc_idx].sp_uuid = -+ *part_uuid; -+ -+ desc_found = 1; -+ break; -+ } -+ } -+ -+ if (!desc_found) -+ return -ENODATA; -+ } -+ } -+ -+ return 0; -+} -+ -+/** -+ * ffa_query_partitions_info() - invoke FFA_PARTITION_INFO_GET and save partitions data -+ * @dev: The FF-A bus device -+ * @part_uuid: Pointer to the partition(s) UUID -+ * @pcount: Pointer to the number of partitions variable filled when querying -+ * -+ * Execute the FFA_PARTITION_INFO_GET to query the partitions data. -+ * Then, call ffa_read_partitions_info to save the data in uc_priv. -+ * -+ * After reading the data the RX buffer is released using ffa_release_rx_buffer -+ * -+ * Return: -+ * -+ * When part_uuid is NULL, all partitions data are retrieved from secure world -+ * When part_uuid is non NULL, data for partitions matching the given UUID are -+ * retrieved and the number of partitions is returned -+ * 0 is returned on success. Otherwise, failure -+ */ -+static int ffa_query_partitions_info(struct udevice *dev, struct ffa_partition_uuid *part_uuid, -+ u32 *pcount) -+{ -+ struct ffa_partition_uuid query_uuid = {0}; -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ -+ /* -+ * If a UUID is specified. Information for one or more -+ * partitions in the system is queried. Otherwise, information -+ * for all installed partitions is queried -+ */ -+ -+ if (part_uuid) { -+ if (!pcount) -+ return -EINVAL; -+ -+ query_uuid = *part_uuid; -+ } else if (pcount) { -+ return -EINVAL; -+ } -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_PARTITION_INFO_GET), -+ .a1 = query_uuid.a1, -+ .a2 = query_uuid.a2, -+ .a3 = query_uuid.a3, -+ .a4 = query_uuid.a4, -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) { -+ int ret; -+ -+ /* -+ * res.a2 contains the count of partition information descriptors -+ * populated in the RX buffer -+ */ -+ if (res.a2) { -+ ret = ffa_read_partitions_info(dev, (u32)res.a2, part_uuid); -+ if (ret) { -+ log_err("failed reading SP(s) data , err (%d)\n", ret); -+ ffa_release_rx_buffer_hdlr(dev); -+ return -EINVAL; -+ } -+ } -+ -+ /* Return the SP count (when querying using a UUID) */ -+ if (pcount) -+ *pcount = (u32)res.a2; -+ -+ /* -+ * After calling FFA_PARTITION_INFO_GET the buffer ownership -+ * is assigned to the consumer (u-boot). So, we need to give -+ * the ownership back to the SPM or hypervisor -+ */ -+ ret = ffa_release_rx_buffer_hdlr(dev); -+ -+ return ret; -+ } -+ -+ ffa_errno = res.a2; -+ ffa_print_error_log(FFA_PARTITION_INFO_GET, ffa_errno); -+ -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/** -+ * ffa_get_partitions_info_hdlr() - FFA_PARTITION_INFO_GET handler function -+ * @uuid_str: pointer to the UUID string -+ * @sp_count: address of the variable containing the number of partitions matching the UUID -+ * The variable is set by the driver -+ * @sp_descs: address of the descriptors of the partitions matching the UUID -+ * The address is set by the driver -+ * -+ * Return the number of partitions and their descriptors matching the UUID -+ * -+ * Query the secure partition data from uc_priv. -+ * If not found, invoke FFA_PARTITION_INFO_GET FF-A function to query the partition information -+ * from secure world. -+ * -+ * A client of the FF-A driver should know the UUID of the service it wants to -+ * access. It should use the UUID to request the FF-A driver to provide the -+ * partition(s) information of the service. The FF-A driver uses -+ * PARTITION_INFO_GET to obtain this information. This is implemented through -+ * ffa_get_partitions_info_hdlr() function. -+ * If the partition(s) matching the UUID found, the partition(s) information and the -+ * number are returned. -+ * If no partition matching the UUID is found in the cached area, a new FFA_PARTITION_INFO_GET -+ * call is issued. -+ * If not done yet, the UUID is updated in the cached area. -+ * This assumes that partitions data does not change in the secure world. -+ * Otherwise u-boot will have an outdated partition data. The benefit of caching -+ * the information in the FF-A driver is to accommodate discovery after -+ * ExitBootServices(). -+ * -+ * Return: -+ * -+ * @sp_count: the number of partitions -+ * @sp_descs: address of the partitions descriptors -+ * -+ * On success 0 is returned. Otherwise, failure -+ */ -+int ffa_get_partitions_info_hdlr(struct udevice *dev, const char *uuid_str, -+ u32 *sp_count, struct ffa_partition_desc **sp_descs) -+{ -+ u32 i; -+ struct ffa_partition_uuid part_uuid = {0}; -+ struct ffa_priv *uc_priv; -+ struct ffa_partition_desc *rx_descs; -+ -+ uc_priv = dev_get_uclass_priv(dev); -+ -+ if (!uc_priv->partitions.count || !uc_priv->partitions.descs) { -+ log_err("no partition installed\n"); -+ return -EINVAL; -+ } -+ -+ if (!uuid_str) { -+ log_err("no UUID provided\n"); -+ return -EINVAL; -+ } -+ -+ if (!sp_count) { -+ log_err("no count argument provided\n"); -+ return -EINVAL; -+ } -+ -+ if (!sp_descs) { -+ log_err("no info argument provided\n"); -+ return -EINVAL; -+ } -+ -+ if (uuid_str_to_le_bin(uuid_str, (unsigned char *)&part_uuid)) { -+ log_err("invalid UUID\n"); -+ return -EINVAL; -+ } -+ -+ log_debug("Searching FF-A partitions using the provided UUID\n"); -+ -+ *sp_count = 0; -+ *sp_descs = uc_priv->pair.rxbuf; -+ rx_descs = *sp_descs; -+ -+ /* Search in the cached partitions */ -+ for (i = 0; i < uc_priv->partitions.count; i++) -+ if (ffa_uuid_are_identical(&uc_priv->partitions.descs[i].sp_uuid, -+ &part_uuid)) { -+ log_debug("FF-A partition ID %x matches the provided UUID\n", -+ uc_priv->partitions.descs[i].info.id); -+ -+ (*sp_count)++; -+ *rx_descs++ = uc_priv->partitions.descs[i]; -+ } -+ -+ if (!(*sp_count)) { -+ int ret; -+ -+ log_debug("No FF-A partition found. Querying framework ...\n"); -+ -+ ret = ffa_query_partitions_info(dev, &part_uuid, sp_count); -+ -+ if (!ret) { -+ log_debug("Number of FF-A partition(s) matching the UUID: %d\n", *sp_count); -+ -+ if (*sp_count) -+ ret = ffa_get_partitions_info_hdlr(dev, uuid_str, sp_count, -+ sp_descs); -+ else -+ ret = -ENODATA; -+ } -+ -+ return ret; -+ } -+ -+ return 0; -+} -+ -+/** -+ * ffa_cache_partitions_info() - Query and saves all secure partitions data -+ * @dev: The FF-A bus device -+ * -+ * Invoke FFA_PARTITION_INFO_GET FF-A function to query from secure world -+ * all partitions information. -+ * -+ * The FFA_PARTITION_INFO_GET call is issued with nil UUID as an argument. -+ * All installed partitions information are returned. We cache them in uc_priv -+ * and we keep the UUID field empty (in FF-A 1.0 UUID is not provided by the partition descriptor) -+ * -+ * Called at the device probing level. -+ * ffa_cache_partitions_info uses ffa_query_partitions_info to get the data -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_cache_partitions_info(struct udevice *dev) -+{ -+ return ffa_query_partitions_info(dev, NULL, NULL); -+} -+ -+/** -+ * ffa_msg_send_direct_req_hdlr() - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function -+ * @dev: The FF-A bus device -+ * @dst_part_id: destination partition ID -+ * @msg: pointer to the message data preallocated by the client (in/out) -+ * @is_smc64: select 64-bit or 32-bit FF-A ABI -+ * -+ * Implement FFA_MSG_SEND_DIRECT_{REQ,RESP} -+ * FF-A functions. -+ * -+ * FFA_MSG_SEND_DIRECT_REQ is used to send the data to the secure partition. -+ * The response from the secure partition is handled by reading the -+ * FFA_MSG_SEND_DIRECT_RESP arguments. -+ * -+ * The maximum size of the data that can be exchanged is 40 bytes which is -+ * sizeof(struct ffa_send_direct_data) as defined by the FF-A specification 1.0 -+ * in the section relevant to FFA_MSG_SEND_DIRECT_{REQ,RESP} -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_msg_send_direct_req_hdlr(struct udevice *dev, u16 dst_part_id, -+ struct ffa_send_direct_data *msg, bool is_smc64) -+{ -+ ffa_value_t res = {0}; -+ int ffa_errno; -+ u64 req_mode, resp_mode; -+ struct ffa_priv *uc_priv; -+ -+ uc_priv = dev_get_uclass_priv(dev); -+ -+ /* No partition installed */ -+ if (!uc_priv->partitions.count || !uc_priv->partitions.descs) -+ return -ENODEV; -+ -+ if (is_smc64) { -+ req_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ); -+ resp_mode = FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP); -+ } else { -+ req_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_REQ); -+ resp_mode = FFA_SMC_32(FFA_MSG_SEND_DIRECT_RESP); -+ } -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = req_mode, -+ .a1 = PREP_SELF_ENDPOINT_ID(uc_priv->id) | -+ PREP_PART_ENDPOINT_ID(dst_part_id), -+ .a2 = 0, -+ .a3 = msg->data0, -+ .a4 = msg->data1, -+ .a5 = msg->data2, -+ .a6 = msg->data3, -+ .a7 = msg->data4, -+ }, &res); -+ -+ while (res.a0 == FFA_SMC_32(FFA_INTERRUPT)) -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_SMC_32(FFA_RUN), -+ .a1 = res.a1, -+ }, &res); -+ -+ if (res.a0 == FFA_SMC_32(FFA_SUCCESS)) { -+ /* Message sent with no response */ -+ return 0; -+ } -+ -+ if (res.a0 == resp_mode) { -+ /* Message sent with response extract the return data */ -+ msg->data0 = res.a3; -+ msg->data1 = res.a4; -+ msg->data2 = res.a5; -+ msg->data3 = res.a6; -+ msg->data4 = res.a7; -+ -+ return 0; -+ } -+ -+ ffa_errno = res.a2; -+ return ffa_to_std_errno(ffa_errno); -+} -+ -+/* FF-A driver operations (used by clients for communicating with FF-A)*/ -+ -+/** -+ * ffa_partition_info_get() - FFA_PARTITION_INFO_GET driver operation -+ * @uuid_str: pointer to the UUID string -+ * @sp_count: address of the variable containing the number of partitions matching the UUID -+ * The variable is set by the driver -+ * @sp_descs: address of the descriptors of the partitions matching the UUID -+ * The address is set by the driver -+ * -+ * Driver operation for FFA_PARTITION_INFO_GET. -+ * Please see ffa_get_partitions_info_hdlr() description for more details. -+ * -+ * Return: -+ * -+ * @sp_count: the number of partitions -+ * @sp_descs: address of the partitions descriptors -+ * -+ * On success 0 is returned. Otherwise, failure -+ */ -+int ffa_partition_info_get(struct udevice *dev, const char *uuid_str, -+ u32 *sp_count, struct ffa_partition_desc **sp_descs) -+{ -+ struct ffa_bus_ops *ops = ffa_get_ops(dev); -+ -+ if (!ops->partition_info_get) -+ return -ENOSYS; -+ -+ return ops->partition_info_get(dev, uuid_str, sp_count, sp_descs); -+} -+ -+/** -+ * ffa_sync_send_receive() - FFA_MSG_SEND_DIRECT_{REQ,RESP} driver operation -+ * @dev: The FF-A bus device -+ * @dst_part_id: destination partition ID -+ * @msg: pointer to the message data preallocated by the client (in/out) -+ * @is_smc64: select 64-bit or 32-bit FF-A ABI -+ * -+ * Driver operation for FFA_MSG_SEND_DIRECT_{REQ,RESP}. -+ * Please see ffa_msg_send_direct_req_hdlr() description for more details. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_sync_send_receive(struct udevice *dev, u16 dst_part_id, -+ struct ffa_send_direct_data *msg, bool is_smc64) -+{ -+ struct ffa_bus_ops *ops = ffa_get_ops(dev); -+ -+ if (!ops->sync_send_receive) -+ return -ENOSYS; -+ -+ return ops->sync_send_receive(dev, dst_part_id, msg, is_smc64); -+} -+ -+/** -+ * ffa_rxtx_unmap() - FFA_RXTX_UNMAP driver operation -+ * @dev: The FF-A bus device -+ * -+ * Driver operation for FFA_RXTX_UNMAP. -+ * Please see ffa_unmap_rxtx_buffers_hdlr() description for more details. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_rxtx_unmap(struct udevice *dev) -+{ -+ struct ffa_bus_ops *ops = ffa_get_ops(dev); -+ -+ if (!ops->rxtx_unmap) -+ return -ENOSYS; -+ -+ return ops->rxtx_unmap(dev); -+} -+ -+/** -+ * ffa_do_probe() - probing FF-A framework -+ * @dev: the FF-A bus device (arm_ffa) -+ * -+ * Probing is triggered on demand by clients searching for the uclass. -+ * At probe level the following actions are done: -+ * - saving the FF-A framework version in uc_priv -+ * - querying from secure world the u-boot endpoint ID -+ * - querying from secure world the supported features of FFA_RXTX_MAP -+ * - mapping the RX/TX buffers -+ * - querying from secure world all the partitions information -+ * -+ * All data queried from secure world is saved in uc_priv. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_do_probe(struct udevice *dev) -+{ -+ int ret; -+ -+ ret = ffa_get_version_hdlr(dev); -+ if (ret) -+ return ret; -+ -+ ret = ffa_get_endpoint_id(dev); -+ if (ret) -+ return ret; -+ -+ ret = ffa_get_rxtx_map_features_hdlr(dev); -+ if (ret) -+ return ret; -+ -+ ret = ffa_map_rxtx_buffers_hdlr(dev); -+ if (ret) -+ return ret; -+ -+ ret = ffa_cache_partitions_info(dev); -+ if (ret) { -+ ffa_unmap_rxtx_buffers_hdlr(dev); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+UCLASS_DRIVER(ffa) = { -+ .name = "ffa", -+ .id = UCLASS_FFA, -+ .pre_probe = ffa_do_probe, -+ .pre_remove = ffa_unmap_rxtx_buffers_hdlr, -+ .per_device_auto = sizeof(struct ffa_priv) -+}; -diff --git a/drivers/firmware/arm-ffa/arm-ffa.c b/drivers/firmware/arm-ffa/arm-ffa.c -new file mode 100644 -index 0000000000..68df75bd9e ---- /dev/null -+++ b/drivers/firmware/arm-ffa/arm-ffa.c -@@ -0,0 +1,104 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+DECLARE_GLOBAL_DATA_PTR; -+ -+/** -+ * invoke_ffa_fn() - SMC wrapper -+ * @args: FF-A ABI arguments to be copied to Xn registers -+ * @res: FF-A ABI return data to be copied from Xn registers -+ * -+ * Calls low level SMC assembly function -+ */ -+void invoke_ffa_fn(ffa_value_t args, ffa_value_t *res) -+{ -+ arm_smccc_1_2_smc(&args, res); -+} -+ -+/** -+ * arm_ffa_discover() - perform FF-A discovery -+ * @dev: The Arm FF-A bus device (arm_ffa) -+ * Try to discover the FF-A framework. Discovery is performed by -+ * querying the FF-A framework version from secure world using the FFA_VERSION ABI. -+ * Return: -+ * -+ * true on success. Otherwise, false. -+ */ -+static bool arm_ffa_discover(struct udevice *dev) -+{ -+ int ret; -+ -+ log_info("Arm FF-A framework discovery\n"); -+ -+ ret = ffa_get_version_hdlr(dev); -+ if (ret) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * arm_ffa_is_supported() - FF-A bus discovery callback -+ * @invoke_fn: legacy SMC invoke function (not used) -+ * -+ * Perform FF-A discovery by calling arm_ffa_discover(). -+ * Discovery is performed by querying the FF-A framework version from -+ * secure world using the FFA_VERSION ABI. -+ * -+ * The FF-A driver is registered as an SMCCC feature driver. So, features discovery -+ * callbacks are called by the PSCI driver (PSCI device is the SMCCC features -+ * root device). -+ * -+ * The FF-A driver supports the SMCCCv1.2 extended input/output registers. -+ * So, the legacy SMC invocation is not used. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static bool arm_ffa_is_supported(void (*invoke_fn)(ulong a0, ulong a1, -+ ulong a2, ulong a3, -+ ulong a4, ulong a5, -+ ulong a6, ulong a7, -+ struct arm_smccc_res *res)) -+{ -+ return arm_ffa_discover(NULL); -+} -+ -+/* Arm FF-A driver operations */ -+ -+static const struct ffa_bus_ops ffa_ops = { -+ .partition_info_get = ffa_get_partitions_info_hdlr, -+ .sync_send_receive = ffa_msg_send_direct_req_hdlr, -+ .rxtx_unmap = ffa_unmap_rxtx_buffers_hdlr, -+}; -+ -+/* Registering the FF-A driver as an SMCCC feature driver */ -+ -+ARM_SMCCC_FEATURE_DRIVER(arm_ffa) = { -+ .driver_name = FFA_DRV_NAME, -+ .is_supported = arm_ffa_is_supported, -+}; -+ -+/* Declaring the FF-A driver under UCLASS_FFA */ -+ -+U_BOOT_DRIVER(arm_ffa) = { -+ .name = FFA_DRV_NAME, -+ .id = UCLASS_FFA, -+ .flags = DM_REMOVE_OS_PREPARE, -+ .ops = &ffa_ops, -+}; -diff --git a/drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h b/drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h -new file mode 100644 -index 0000000000..4338f9c9b1 ---- /dev/null -+++ b/drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h -@@ -0,0 +1,14 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#ifndef __SANDBOX_ARM_FFA_PRV_H -+#define __SANDBOX_ARM_FFA_PRV_H -+ -+/* Future sandbox support private declarations */ -+ -+#endif -diff --git a/include/arm_ffa.h b/include/arm_ffa.h -new file mode 100644 -index 0000000000..db9b1be995 ---- /dev/null -+++ b/include/arm_ffa.h -@@ -0,0 +1,213 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#ifndef __ARM_FFA_H -+#define __ARM_FFA_H -+ -+#include -+ -+/* -+ * This header is public. It can be used by clients to access -+ * data structures and definitions they need -+ */ -+ -+/* -+ * struct ffa_partition_info - Partition information descriptor -+ * @id: Partition ID -+ * @exec_ctxt: Execution context count -+ * @properties: Partition properties -+ * -+ * Data structure containing information about partitions instantiated in the system -+ * This structure is filled with the data queried by FFA_PARTITION_INFO_GET -+ */ -+struct ffa_partition_info { -+ u16 id; -+ u16 exec_ctxt; -+/* partition supports receipt of direct requests */ -+#define FFA_PARTITION_DIRECT_RECV BIT(0) -+/* partition can send direct requests. */ -+#define FFA_PARTITION_DIRECT_SEND BIT(1) -+/* partition can send and receive indirect messages. */ -+#define FFA_PARTITION_INDIRECT_MSG BIT(2) -+ u32 properties; -+}; -+ -+/* -+ * struct ffa_partition_uuid - 16 bytes UUID transmitted by FFA_PARTITION_INFO_GET -+ * @a1-4: 32-bit words access to the UUID data -+ * -+ */ -+struct ffa_partition_uuid { -+ u32 a1; /* w1 */ -+ u32 a2; /* w2 */ -+ u32 a3; /* w3 */ -+ u32 a4; /* w4 */ -+}; -+ -+/** -+ * struct ffa_partition_desc - the secure partition descriptor -+ * @info: partition information -+ * @sp_uuid: the secure partition UUID -+ * -+ * Each partition has its descriptor containing the partitions information and the UUID -+ */ -+struct ffa_partition_desc { -+ struct ffa_partition_info info; -+ struct ffa_partition_uuid sp_uuid; -+}; -+ -+/* -+ * struct ffa_send_direct_data - Data structure hosting the data -+ * used by FFA_MSG_SEND_DIRECT_{REQ,RESP} -+ * @data0-4: Data read/written from/to x3-x7 registers -+ * -+ * Data structure containing the data to be sent by FFA_MSG_SEND_DIRECT_REQ -+ * or read from FFA_MSG_SEND_DIRECT_RESP -+ */ -+ -+/* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */ -+struct ffa_send_direct_data { -+ ulong data0; /* w3/x3 */ -+ ulong data1; /* w4/x4 */ -+ ulong data2; /* w5/x5 */ -+ ulong data3; /* w6/x6 */ -+ ulong data4; /* w7/x7 */ -+}; -+ -+struct udevice; -+ -+/** -+ * struct ffa_bus_ops - Operations for FF-A -+ * @partition_info_get: callback for the FFA_PARTITION_INFO_GET -+ * @sync_send_receive: callback for the FFA_MSG_SEND_DIRECT_REQ -+ * @rxtx_unmap: callback for the FFA_RXTX_UNMAP -+ * -+ * The data structure providing all the operations supported by the driver. -+ * This structure is EFI runtime resident. -+ */ -+struct ffa_bus_ops { -+ int (*partition_info_get)(struct udevice *dev, const char *uuid_str, -+ u32 *sp_count, struct ffa_partition_desc **sp_descs); -+ int (*sync_send_receive)(struct udevice *dev, u16 dst_part_id, -+ struct ffa_send_direct_data *msg, -+ bool is_smc64); -+ int (*rxtx_unmap)(struct udevice *dev); -+}; -+ -+#define ffa_get_ops(dev) ((struct ffa_bus_ops *)(dev)->driver->ops) -+ -+/** -+ * ffa_rxtx_unmap() - FFA_RXTX_UNMAP driver operation -+ * Please see ffa_unmap_rxtx_buffers_hdlr() description for more details. -+ */ -+int ffa_rxtx_unmap(struct udevice *dev); -+ -+/** -+ * ffa_unmap_rxtx_buffers_hdlr() - FFA_RXTX_UNMAP handler function -+ * @dev: The arm_ffa bus device -+ * -+ * This function implements FFA_RXTX_UNMAP FF-A function -+ * to unmap the RX/TX buffers -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_unmap_rxtx_buffers_hdlr(struct udevice *dev); -+ -+/** -+ * ffa_sync_send_receive() - FFA_MSG_SEND_DIRECT_{REQ,RESP} driver operation -+ * Please see ffa_msg_send_direct_req_hdlr() description for more details. -+ */ -+int ffa_sync_send_receive(struct udevice *dev, u16 dst_part_id, -+ struct ffa_send_direct_data *msg, bool is_smc64); -+ -+/** -+ * ffa_msg_send_direct_req_hdlr() - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function -+ * @dev: The arm_ffa bus device -+ * @dst_part_id: destination partition ID -+ * @msg: pointer to the message data preallocated by the client (in/out) -+ * @is_smc64: select 64-bit or 32-bit FF-A ABI -+ * -+ * This function implements FFA_MSG_SEND_DIRECT_{REQ,RESP} -+ * FF-A functions. -+ * -+ * FFA_MSG_SEND_DIRECT_REQ is used to send the data to the secure partition. -+ * The response from the secure partition is handled by reading the -+ * FFA_MSG_SEND_DIRECT_RESP arguments. -+ * -+ * The maximum size of the data that can be exchanged is 40 bytes which is -+ * sizeof(struct ffa_send_direct_data) as defined by the FF-A specification 1.0 -+ * in the section relevant to FFA_MSG_SEND_DIRECT_{REQ,RESP} -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_msg_send_direct_req_hdlr(struct udevice *dev, u16 dst_part_id, -+ struct ffa_send_direct_data *msg, bool is_smc64); -+ -+/** -+ * ffa_partition_info_get() - FFA_PARTITION_INFO_GET driver operation -+ * Please see ffa_get_partitions_info_hdlr() description for more details. -+ */ -+int ffa_partition_info_get(struct udevice *dev, const char *uuid_str, -+ u32 *sp_count, struct ffa_partition_desc **sp_descs); -+ -+/** -+ * ffa_get_partitions_info_hdlr() - FFA_PARTITION_INFO_GET handler function -+ * @uuid_str: pointer to the UUID string -+ * @sp_count: address of the variable containing the number of partitions matching the UUID -+ * The variable is set by the driver -+ * @sp_descs: address of the descriptors of the partitions matching the UUID -+ * The address is set by the driver -+ * -+ * Return the number of partitions and their descriptors matching the UUID -+ * -+ * Query the secure partition data from uc_priv. -+ * If not found, invoke FFA_PARTITION_INFO_GET -+ * FF-A function to query the partition information from secure world. -+ * -+ * A client of the FF-A driver should know the UUID of the service it wants to -+ * access. It should use the UUID to request the FF-A driver to provide the -+ * partition(s) information of the service. The FF-A driver uses -+ * PARTITION_INFO_GET to obtain this information. This is implemented through -+ * ffa_get_partitions_info_hdlr() function. -+ * A new FFA_PARTITION_INFO_GET call is issued (first one performed through -+ * ffa_cache_partitions_info) allowing to retrieve the partition(s) information. -+ * They are not saved (already done). We only update the UUID in the cached area. -+ * This assumes that partitions data does not change in the secure world. -+ * Otherwise u-boot will have an outdated partition data. The benefit of caching -+ * the information in the FF-A driver is to accommodate discovery after -+ * ExitBootServices(). -+ * -+ * Return: -+ * -+ * @sp_count: the number of partitions -+ * @sp_descs: address of the partitions descriptors -+ * -+ * On success 0 is returned. Otherwise, failure -+ */ -+int ffa_get_partitions_info_hdlr(struct udevice *dev, const char *uuid_str, -+ u32 *sp_count, struct ffa_partition_desc **sp_descs); -+ -+struct ffa_priv; -+ -+/** -+ * ffa_set_smc_conduit() - Set the SMC conduit -+ * @dev: The FF-A bus device -+ * -+ * Selects the SMC conduit by setting the FF-A ABI invoke function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_set_smc_conduit(struct udevice *dev); -+ -+#endif -diff --git a/include/arm_ffa_priv.h b/include/arm_ffa_priv.h -new file mode 100644 -index 0000000000..d564c33c64 ---- /dev/null -+++ b/include/arm_ffa_priv.h -@@ -0,0 +1,246 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#ifndef __ARM_FFA_PRV_H -+#define __ARM_FFA_PRV_H -+ -+#include -+#include -+#include -+ -+/* This header is exclusively used by the FF-A Uclass and FF-A driver(s) */ -+ -+/* Arm FF-A driver name */ -+#define FFA_DRV_NAME "arm_ffa" -+ -+/* The FF-A SMC function definitions */ -+ -+#if CONFIG_IS_ENABLED(SANDBOX) -+ -+/* Providing Arm SMCCC declarations to sandbox */ -+ -+/** -+ * struct sandbox_smccc_1_2_regs - emulated SMC call arguments or results -+ * @a0-a17 argument values from registers 0 to 17 -+ */ -+struct sandbox_smccc_1_2_regs { -+ ulong a0; -+ ulong a1; -+ ulong a2; -+ ulong a3; -+ ulong a4; -+ ulong a5; -+ ulong a6; -+ ulong a7; -+ ulong a8; -+ ulong a9; -+ ulong a10; -+ ulong a11; -+ ulong a12; -+ ulong a13; -+ ulong a14; -+ ulong a15; -+ ulong a16; -+ ulong a17; -+}; -+ -+typedef struct sandbox_smccc_1_2_regs ffa_value_t; -+ -+#define ARM_SMCCC_FAST_CALL 1UL -+#define ARM_SMCCC_OWNER_STANDARD 4 -+#define ARM_SMCCC_SMC_32 0 -+#define ARM_SMCCC_SMC_64 1 -+#define ARM_SMCCC_TYPE_SHIFT 31 -+#define ARM_SMCCC_CALL_CONV_SHIFT 30 -+#define ARM_SMCCC_OWNER_MASK 0x3f -+#define ARM_SMCCC_OWNER_SHIFT 24 -+#define ARM_SMCCC_FUNC_MASK 0xffff -+ -+#define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \ -+ (((type) << ARM_SMCCC_TYPE_SHIFT) | \ -+ ((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \ -+ (((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \ -+ ((func_num) & ARM_SMCCC_FUNC_MASK)) -+ -+#else -+/* CONFIG_ARM64 */ -+#include -+typedef struct arm_smccc_1_2_regs ffa_value_t; -+#endif -+ -+/* Defining the function pointer type for the function executing the FF-A ABIs */ -+typedef void (*invoke_ffa_fn_t)(ffa_value_t args, ffa_value_t *res); -+ -+/* FF-A driver version definitions */ -+ -+#define MAJOR_VERSION_MASK GENMASK(30, 16) -+#define MINOR_VERSION_MASK GENMASK(15, 0) -+#define GET_FFA_MAJOR_VERSION(x) \ -+ ((u16)(FIELD_GET(MAJOR_VERSION_MASK, (x)))) -+#define GET_FFA_MINOR_VERSION(x) \ -+ ((u16)(FIELD_GET(MINOR_VERSION_MASK, (x)))) -+#define PACK_VERSION_INFO(major, minor) \ -+ (FIELD_PREP(MAJOR_VERSION_MASK, (major)) | \ -+ FIELD_PREP(MINOR_VERSION_MASK, (minor))) -+ -+#define FFA_MAJOR_VERSION (1) -+#define FFA_MINOR_VERSION (0) -+#define FFA_VERSION_1_0 \ -+ PACK_VERSION_INFO(FFA_MAJOR_VERSION, FFA_MINOR_VERSION) -+ -+/* Endpoint ID mask (u-boot endpoint ID) */ -+ -+#define GET_SELF_ENDPOINT_ID_MASK GENMASK(15, 0) -+#define GET_SELF_ENDPOINT_ID(x) \ -+ ((u16)(FIELD_GET(GET_SELF_ENDPOINT_ID_MASK, (x)))) -+ -+#define PREP_SELF_ENDPOINT_ID_MASK GENMASK(31, 16) -+#define PREP_SELF_ENDPOINT_ID(x) \ -+ (FIELD_PREP(PREP_SELF_ENDPOINT_ID_MASK, (x))) -+ -+/* Partition endpoint ID mask (partition with which u-boot communicates with) */ -+ -+#define PREP_PART_ENDPOINT_ID_MASK GENMASK(15, 0) -+#define PREP_PART_ENDPOINT_ID(x) \ -+ (FIELD_PREP(PREP_PART_ENDPOINT_ID_MASK, (x))) -+ -+/* Definitions of the Arm FF-A interfaces supported by the Arm FF-A driver */ -+ -+#define FFA_SMC(calling_convention, func_num) \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, (calling_convention), \ -+ ARM_SMCCC_OWNER_STANDARD, (func_num)) -+ -+#define FFA_SMC_32(func_num) FFA_SMC(ARM_SMCCC_SMC_32, (func_num)) -+#define FFA_SMC_64(func_num) FFA_SMC(ARM_SMCCC_SMC_64, (func_num)) -+ -+enum ffa_abis { -+ FFA_ERROR = 0x60, -+ FFA_SUCCESS = 0x61, -+ FFA_INTERRUPT = 0x62, -+ FFA_VERSION = 0x63, -+ FFA_FEATURES = 0x64, -+ FFA_RX_RELEASE = 0x65, -+ FFA_RXTX_MAP = 0x66, -+ FFA_RXTX_UNMAP = 0x67, -+ FFA_PARTITION_INFO_GET = 0x68, -+ FFA_ID_GET = 0x69, -+ FFA_RUN = 0x6d, -+ FFA_MSG_SEND_DIRECT_REQ = 0x6f, -+ FFA_MSG_SEND_DIRECT_RESP = 0x70, -+ -+ /* To be updated when adding new FFA IDs */ -+ FFA_FIRST_ID = FFA_ERROR, /* Lowest number ID */ -+ FFA_LAST_ID = FFA_MSG_SEND_DIRECT_RESP, /* Highest number ID */ -+}; -+ -+enum ffa_abi_errcode { -+ NOT_SUPPORTED = 1, -+ INVALID_PARAMETERS, -+ NO_MEMORY, -+ BUSY, -+ INTERRUPTED, -+ DENIED, -+ RETRY, -+ ABORTED, -+ MAX_NUMBER_FFA_ERR -+}; -+ -+extern int ffa_to_std_errmap[MAX_NUMBER_FFA_ERR]; -+ -+/* Container structure and helper macros to map between an FF-A error and relevant error log */ -+struct ffa_abi_errmap { -+ char *err_str[MAX_NUMBER_FFA_ERR]; -+}; -+ -+#define FFA_ERRMAP_COUNT (FFA_LAST_ID - FFA_FIRST_ID + 1) -+#define FFA_ID_TO_ERRMAP_ID(ffa_id) ((ffa_id) - FFA_FIRST_ID) -+ -+/** -+ * enum ffa_rxtx_buf_sizes - minimum sizes supported -+ * for the RX/TX buffers -+ */ -+enum ffa_rxtx_buf_sizes { -+ RXTX_4K, -+ RXTX_64K, -+ RXTX_16K -+}; -+ -+/** -+ * struct ffa_rxtxpair - Hosts the RX/TX buffers virtual addresses -+ * @rxbuf: virtual address of the RX buffer -+ * @txbuf: virtual address of the TX buffer -+ * @rxtx_min_pages: RX/TX buffers minimum size in pages -+ * -+ * Hosts the virtual addresses of the mapped RX/TX buffers -+ * These addresses are used by the FF-A functions that use the RX/TX buffers -+ */ -+struct ffa_rxtxpair { -+ void *rxbuf; /* Virtual address returned by memalign */ -+ void *txbuf; /* Virtual address returned by memalign */ -+ size_t rxtx_min_pages; /* Minimum number of pages in each of the RX/TX buffers */ -+}; -+ -+struct ffa_partition_desc; -+ -+/** -+ * struct ffa_partitions - descriptors for all secure partitions -+ * @count: The number of partitions descriptors -+ * @descs The partitions descriptors table -+ * -+ * Contains the partitions descriptors table -+ */ -+struct ffa_partitions { -+ u32 count; -+ struct ffa_partition_desc *descs; /* Virtual address */ -+}; -+ -+/** -+ * struct ffa_priv - the driver private data structure -+ * -+ * @fwk_version: FF-A framework version -+ * @emul: FF-A sandbox emulator -+ * @id: u-boot endpoint ID -+ * @partitions: The partitions descriptors structure -+ * @pair: The RX/TX buffers pair -+ * -+ * The device private data structure containing all the -+ * data read from secure world. -+ */ -+struct ffa_priv { -+ u32 fwk_version; -+ struct udevice *emul; -+ u16 id; -+ struct ffa_partitions partitions; -+ struct ffa_rxtxpair pair; -+}; -+ -+/** -+ * ffa_get_version_hdlr() - FFA_VERSION handler function -+ * @dev: The FF-A bus device -+ * -+ * Implement FFA_VERSION FF-A function -+ * to get from the secure world the FF-A framework version -+ * FFA_VERSION is used to discover the FF-A framework. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_get_version_hdlr(struct udevice *dev); -+ -+/** -+ * invoke_ffa_fn() - SMC wrapper -+ * @args: FF-A ABI arguments to be copied to Xn registers -+ * @res: FF-A ABI return data to be copied from Xn registers -+ * -+ * Calls low level SMC implementation. -+ * This function should be implemented by the user driver. -+ */ -+void invoke_ffa_fn(ffa_value_t args, ffa_value_t *res); -+ -+#endif -diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h -index 307ad6931c..3c6af2e3d2 100644 ---- a/include/dm/uclass-id.h -+++ b/include/dm/uclass-id.h -@@ -4,6 +4,11 @@ - * - * (C) Copyright 2012 - * Pavel Herrmann -+ * -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi - */ - - #ifndef _DM_UCLASS_ID_H -@@ -57,6 +62,7 @@ enum uclass_id { - UCLASS_ETH, /* Ethernet device */ - UCLASS_ETH_PHY, /* Ethernet PHY device */ - UCLASS_EXTCON, /* External Connector Class */ -+ UCLASS_FFA, /* Arm Firmware Framework for Armv8-A */ - UCLASS_FIRMWARE, /* Firmware */ - UCLASS_FPGA, /* FPGA device */ - UCLASS_FUZZING_ENGINE, /* Fuzzing engine */ diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-arm_ffa-sandbox-Replace-the-emulator-error-log-with-.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-arm_ffa-sandbox-Replace-the-emulator-error-log-with-.patch new file mode 100644 index 00000000..5ffb7a06 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0004-arm_ffa-sandbox-Replace-the-emulator-error-log-with-.patch @@ -0,0 +1,43 @@ +From 939406ee3612ad261a51c002655e90431741aa78 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 17 Oct 2024 22:11:22 +0100 +Subject: [PATCH 04/36] arm_ffa: sandbox: Replace the emulator error log with + debug log + +Set the log to a debug log and reformulate the message + +The message is about showing what the emulated FF-A ABI decided +based on the user arguments. The log is just for information purposes +and helpful when debugging. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + drivers/firmware/arm-ffa/ffa-emul-uclass.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/firmware/arm-ffa/ffa-emul-uclass.c b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +index 1521d9b66ac..d2f051f7e2a 100644 +--- a/drivers/firmware/arm-ffa/ffa-emul-uclass.c ++++ b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -658,8 +658,7 @@ void sandbox_arm_ffa_smccc_smc(ffa_value_t *args, ffa_value_t *res) + args->a0); + } + +- if (ret != 0) +- log_err("FF-A ABI internal failure (%d)\n", ret); ++ log_debug("Emulated FF-A ABI feedback (%d)\n", ret); + } + + /** +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-FF-A-v15-arm_ffa-introduce-armffa-command.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-FF-A-v15-arm_ffa-introduce-armffa-command.patch deleted file mode 100644 index 8672652b..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-FF-A-v15-arm_ffa-introduce-armffa-command.patch +++ /dev/null @@ -1,433 +0,0 @@ -From 57e4d6e9c5fc174a96366268150bc85de75baa79 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Wed, 10 May 2023 17:27:01 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: introduce armffa command - -Provide armffa command showcasing the use of the U-Boot FF-A support - -armffa is a command showcasing how to invoke FF-A operations. -This provides a guidance to the client developers on how to -call the FF-A bus interfaces. The command also allows to gather secure -partitions information and ping these partitions. The command is also -helpful in testing the communication with secure partitions. - -For more details please refer to the command documentation [1]. - -[1]: doc/usage/cmd/armffa.rst - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Cc: Tom Rini -Cc: Ilias Apalodimas -Cc: Jens Wiklander -Cc: Heinrich Schuchardt -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - MAINTAINERS | 2 + - cmd/Kconfig | 10 ++ - cmd/Makefile | 1 + - cmd/armffa.c | 202 +++++++++++++++++++++++++++++++ - doc/arch/arm64.ffa.rst | 7 ++ - doc/usage/cmd/armffa.rst | 93 ++++++++++++++ - doc/usage/index.rst | 1 + - drivers/firmware/arm-ffa/Kconfig | 1 + - 8 files changed, 317 insertions(+) - create mode 100644 cmd/armffa.c - create mode 100644 doc/usage/cmd/armffa.rst - -diff --git a/MAINTAINERS b/MAINTAINERS -index 9c5ebf312c..4ae82229fc 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -269,7 +269,9 @@ F: configs/cortina_presidio-asic-pnand_defconfig - ARM FF-A - M: Abdellatif El Khlifi - S: Maintained -+F: cmd/armffa.c - F: doc/arch/arm64.ffa.rst -+F: doc/usage/cmd/armffa.rst - F: drivers/firmware/arm-ffa/ - F: include/arm_ffa.h - F: include/sandbox_arm_ffa.h -diff --git a/cmd/Kconfig b/cmd/Kconfig -index 02e54f1e50..79b4f8367a 100644 ---- a/cmd/Kconfig -+++ b/cmd/Kconfig -@@ -935,6 +935,16 @@ endmenu - - menu "Device access commands" - -+config CMD_ARMFFA -+ bool "Arm FF-A test command" -+ depends on ARM_FFA_TRANSPORT -+ help -+ Provides a test command for the FF-A support -+ supported options: -+ - Listing the partition(s) info -+ - Sending a data pattern to the specified partition -+ - Displaying the arm_ffa device info -+ - config CMD_ARMFLASH - #depends on FLASH_CFI_DRIVER - bool "armflash" -diff --git a/cmd/Makefile b/cmd/Makefile -index 6c37521b4e..7d20a85a46 100644 ---- a/cmd/Makefile -+++ b/cmd/Makefile -@@ -12,6 +12,7 @@ obj-y += panic.o - obj-y += version.o - - # command -+obj-$(CONFIG_CMD_ARMFFA) += armffa.o - obj-$(CONFIG_CMD_2048) += 2048.o - obj-$(CONFIG_CMD_ACPI) += acpi.o - obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o -diff --git a/cmd/armffa.c b/cmd/armffa.c -new file mode 100644 -index 0000000000..7e6eafc03a ---- /dev/null -+++ b/cmd/armffa.c -@@ -0,0 +1,202 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Select the right physical address formatting according to the platform */ -+#ifdef CONFIG_PHYS_64BIT -+#define PhysAddrLength "ll" -+#else -+#define PhysAddrLength "" -+#endif -+#define PHYS_ADDR_LN "%" PhysAddrLength "x" -+ -+/** -+ * ffa_get_dev() - Return the FF-A device -+ * @devp: pointer to the FF-A device -+ * -+ * Search for the FF-A device. -+ * -+ * Return: -+ * 0 on success. Otherwise, failure -+ */ -+static int ffa_get_dev(struct udevice **devp) -+{ -+ int ret; -+ -+ ret = uclass_first_device_err(UCLASS_FFA, devp); -+ if (ret) { -+ log_err("Cannot find FF-A bus device\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+/** -+ * do_ffa_getpart() - implementation of the getpart subcommand -+ * @cmdtp: Command Table -+ * @flag: flags -+ * @argc: number of arguments -+ * @argv: arguments -+ * -+ * Query a secure partition information. The secure partition UUID is provided -+ * as an argument. The function uses the arm_ffa driver -+ * partition_info_get operation which implements FFA_PARTITION_INFO_GET -+ * ABI to retrieve the data. The input UUID string is expected to be in big -+ * endian format. -+ * -+ * Return: -+ * -+ * CMD_RET_SUCCESS: on success, otherwise failure -+ */ -+static int do_ffa_getpart(struct cmd_tbl *cmdtp, int flag, int argc, -+ char *const argv[]) -+{ -+ u32 count = 0; -+ int ret; -+ struct ffa_partition_desc *descs; -+ u32 i; -+ struct udevice *dev; -+ -+ if (argc != 2) { -+ log_err("Missing argument\n"); -+ return CMD_RET_USAGE; -+ } -+ -+ ret = ffa_get_dev(&dev); -+ if (ret) -+ return CMD_RET_FAILURE; -+ -+ /* Ask the driver to fill the buffer with the SPs info */ -+ -+ ret = ffa_partition_info_get(dev, argv[1], &count, &descs); -+ if (ret) { -+ log_err("Failure in querying partition(s) info (error code: %d)\n", ret); -+ return CMD_RET_FAILURE; -+ } -+ -+ /* SPs found , show the partition information */ -+ for (i = 0; i < count ; i++) { -+ log_info("Partition: id = %x , exec_ctxt %x , properties %x\n", -+ descs[i].info.id, -+ descs[i].info.exec_ctxt, -+ descs[i].info.properties); -+ } -+ -+ return CMD_RET_SUCCESS; -+} -+ -+/** -+ * do_ffa_ping() - implementation of the ping subcommand -+ * @cmdtp: Command Table -+ * @flag: flags -+ * @argc: number of arguments -+ * @argv: arguments -+ * -+ * Send data to a secure partition. The secure partition UUID is provided -+ * as an argument. Use the arm_ffa driver sync_send_receive operation -+ * which implements FFA_MSG_SEND_DIRECT_{REQ,RESP} ABIs to send/receive data. -+ * -+ * Return: -+ * -+ * CMD_RET_SUCCESS: on success, otherwise failure -+ */ -+static int do_ffa_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) -+{ -+ struct ffa_send_direct_data msg = { -+ .data0 = 0xaaaaaaaa, -+ .data1 = 0xbbbbbbbb, -+ .data2 = 0xcccccccc, -+ .data3 = 0xdddddddd, -+ .data4 = 0xeeeeeeee, -+ }; -+ u16 part_id; -+ int ret; -+ struct udevice *dev; -+ -+ if (argc != 2) { -+ log_err("Missing argument\n"); -+ return CMD_RET_USAGE; -+ } -+ -+ part_id = strtoul(argv[1], NULL, 16); -+ if (!part_id) { -+ log_err("Partition ID can not be 0\n"); -+ return CMD_RET_USAGE; -+ } -+ -+ ret = ffa_get_dev(&dev); -+ if (ret) -+ return CMD_RET_FAILURE; -+ -+ ret = ffa_sync_send_receive(dev, part_id, &msg, 1); -+ if (!ret) { -+ u8 cnt; -+ -+ log_info("SP response:\n[LSB]\n"); -+ for (cnt = 0; -+ cnt < sizeof(struct ffa_send_direct_data) / sizeof(u64); -+ cnt++) -+ log_info("%llx\n", ((u64 *)&msg)[cnt]); -+ return CMD_RET_SUCCESS; -+ } -+ -+ log_err("Sending direct request error (%d)\n", ret); -+ return CMD_RET_FAILURE; -+} -+ -+/** -+ *do_ffa_devlist() - implementation of the devlist subcommand -+ * @cmdtp: [in] Command Table -+ * @flag: flags -+ * @argc: number of arguments -+ * @argv: arguments -+ * -+ * Query the device belonging to the UCLASS_FFA -+ * class. -+ * -+ * Return: -+ * -+ * CMD_RET_SUCCESS: on success, otherwise failure -+ */ -+static int do_ffa_devlist(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) -+{ -+ struct udevice *dev; -+ int ret; -+ -+ ret = ffa_get_dev(&dev); -+ if (ret) -+ return CMD_RET_FAILURE; -+ -+ log_info("device %s, addr " PHYS_ADDR_LN ", driver %s, ops " PHYS_ADDR_LN "\n", -+ dev->name, -+ map_to_sysmem(dev), -+ dev->driver->name, -+ map_to_sysmem(dev->driver->ops)); -+ -+ return CMD_RET_SUCCESS; -+} -+ -+static char armffa_help_text[] = -+ "getpart \n" -+ " - lists the partition(s) info\n" -+ "ping \n" -+ " - sends a data pattern to the specified partition\n" -+ "devlist\n" -+ " - displays information about the FF-A device/driver\n"; -+ -+U_BOOT_CMD_WITH_SUBCMDS(armffa, "Arm FF-A test command", armffa_help_text, -+ U_BOOT_SUBCMD_MKENT(getpart, 2, 1, do_ffa_getpart), -+ U_BOOT_SUBCMD_MKENT(ping, 2, 1, do_ffa_ping), -+ U_BOOT_SUBCMD_MKENT(devlist, 1, 1, do_ffa_devlist)); -diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst -index 4f817f053c..aefd527447 100644 ---- a/doc/arch/arm64.ffa.rst -+++ b/doc/arch/arm64.ffa.rst -@@ -205,6 +205,13 @@ The following features are provided: - - - FF-A bus can be compiled and used without EFI - -+The armffa command -+----------------------------------- -+ -+armffa is a command showcasing how to use the FF-A bus and how to invoke the driver operations. -+ -+Please refer the command documentation at :doc:`../usage/cmd/armffa` -+ - Example of boot logs with FF-A enabled - -------------------------------------- - -diff --git a/doc/usage/cmd/armffa.rst b/doc/usage/cmd/armffa.rst -new file mode 100644 -index 0000000000..3d422686c1 ---- /dev/null -+++ b/doc/usage/cmd/armffa.rst -@@ -0,0 +1,93 @@ -+.. SPDX-License-Identifier: GPL-2.0+: -+ -+armffa command -+============== -+ -+Synopsis -+-------- -+ -+:: -+ -+ armffa [sub-command] [arguments] -+ -+ sub-commands: -+ -+ getpart [partition UUID] -+ -+ lists the partition(s) info -+ -+ ping [partition ID] -+ -+ sends a data pattern to the specified partition -+ -+ devlist -+ -+ displays information about the FF-A device/driver -+ -+Description -+----------- -+ -+armffa is a command showcasing how to use the FF-A bus and how to invoke its operations. -+ -+This provides a guidance to the client developers on how to call the FF-A bus interfaces. -+ -+The command also allows to gather secure partitions information and ping these partitions. -+ -+The command is also helpful in testing the communication with secure partitions. -+ -+Example -+------- -+ -+The following examples are run on Corstone-1000 platform. -+ -+* ping -+ -+:: -+ -+ corstone1000# armffa ping 0x8003 -+ SP response: -+ [LSB] -+ fffffffe -+ 0 -+ 0 -+ 0 -+ 0 -+ -+* ping (failure case) -+ -+:: -+ -+ corstone1000# armffa ping 0 -+ Sending direct request error (-22) -+ -+* getpart -+ -+:: -+ -+ corstone1000# armffa getpart 33d532ed-e699-0942-c09c-a798d9cd722d -+ Partition: id = 8003 , exec_ctxt 1 , properties 3 -+ -+* getpart (failure case) -+ -+:: -+ -+ corstone1000# armffa getpart 33d532ed-e699-0942-c09c-a798d9cd7221 -+ INVALID_PARAMETERS: Unrecognized UUID -+ Failure in querying partitions count (error code: -22) -+ -+* devlist -+ -+:: -+ -+ corstone1000# armffa devlist -+ device name arm_ffa, dev 00000000fdf41c30, driver name arm_ffa, ops 00000000fffc0e98 -+ -+Configuration -+------------- -+ -+The command is available if CONFIG_CMD_ARMFFA=y and CONFIG_ARM_FFA_TRANSPORT=y. -+ -+Return value -+------------ -+ -+The return value $? is 0 (true) on success, 1 (false) on failure. -diff --git a/doc/usage/index.rst b/doc/usage/index.rst -index 388e59f173..e462de2806 100644 ---- a/doc/usage/index.rst -+++ b/doc/usage/index.rst -@@ -22,6 +22,7 @@ Shell commands - - cmd/acpi - cmd/addrmap -+ cmd/armffa - cmd/askenv - cmd/base - cmd/bdinfo -diff --git a/drivers/firmware/arm-ffa/Kconfig b/drivers/firmware/arm-ffa/Kconfig -index 9200c8028b..a7d5392859 100644 ---- a/drivers/firmware/arm-ffa/Kconfig -+++ b/drivers/firmware/arm-ffa/Kconfig -@@ -5,6 +5,7 @@ config ARM_FFA_TRANSPORT - depends on DM && ARM64 - select ARM_SMCCC - select ARM_SMCCC_FEATURES -+ imply CMD_ARMFFA - select LIB_UUID - select DEVRES - help diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-arm_ffa-sandbox-Improve-the-readability-of-clearing-.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-arm_ffa-sandbox-Improve-the-readability-of-clearing-.patch new file mode 100644 index 00000000..f3d4eefa --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0005-arm_ffa-sandbox-Improve-the-readability-of-clearing-.patch @@ -0,0 +1,128 @@ +From 20f7e4fcd4aec29729c7c3ab2e9dbfe69a04d167 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Tue, 11 Feb 2025 17:54:45 +0000 +Subject: [PATCH 05/36] arm_ffa: sandbox: Improve the readability of clearing + the X registers + +Make clearing the must be zero registers more readable in the emulator + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + .../sandbox/include/asm/sandbox_arm_ffa_priv.h | 15 ++------------- + drivers/firmware/arm-ffa/ffa-emul-uclass.c | 18 +++++++++--------- + 2 files changed, 11 insertions(+), 22 deletions(-) + +diff --git a/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h b/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h +index b0881822d78..5c46547beab 100644 +--- a/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h ++++ b/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h +@@ -39,19 +39,8 @@ + #define RXTX_BUFFERS_MIN_SIZE (RXTX_4K) + #define RXTX_BUFFERS_MIN_PAGES (1) + +-/* MBZ registers info */ +- +-/* x1-x7 MBZ */ +-#define FFA_X1X7_MBZ_CNT (7) +-#define FFA_X1X7_MBZ_REG_START (&res->a1) +- +-/* x4-x7 MBZ */ +-#define FFA_X4X7_MBZ_CNT (4) +-#define FFA_X4X7_MBZ_REG_START (&res->a4) +- +-/* x3-x7 MBZ */ +-#define FFA_X3X7_MBZ_CNT (5) +-#define FFA_X3_MBZ_REG_START (&res->a3) ++/* A helper macro used for clearing registers that Must Be Zero (MBZ) */ ++#define FFA_X_REG_SIZE_IN_BYTE sizeof((((ffa_value_t *)0)->a0)) + + /* number of emulated FF-A secure partitions (SPs) */ + #define SANDBOX_PARTITIONS_CNT (4) +diff --git a/drivers/firmware/arm-ffa/ffa-emul-uclass.c b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +index d2f051f7e2a..dcf5bce9435 100644 +--- a/drivers/firmware/arm-ffa/ffa-emul-uclass.c ++++ b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +@@ -83,7 +83,7 @@ static int sandbox_ffa_version(struct udevice *emul, ffa_value_t *pargs, ffa_val + res->a0 = priv->fwk_version; + + /* x1-x7 MBZ */ +- memset(FFA_X1X7_MBZ_REG_START, 0, FFA_X1X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a1, 0, 7 * FFA_X_REG_SIZE_IN_BYTE); + + return 0; + } +@@ -111,7 +111,7 @@ static int sandbox_ffa_id_get(struct udevice *emul, ffa_value_t *pargs, ffa_valu + res->a2 = priv->id; + + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + + return 0; + } +@@ -136,14 +136,14 @@ static int sandbox_ffa_features(ffa_value_t *pargs, ffa_value_t *res) + res->a2 = RXTX_BUFFERS_MIN_SIZE; + res->a3 = 0; + /* x4-x7 MBZ */ +- memset(FFA_X4X7_MBZ_REG_START, 0, FFA_X4X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a4, 0, 4 * FFA_X_REG_SIZE_IN_BYTE); + return 0; + } + + res->a0 = FFA_SMC_32(FFA_ERROR); + res->a2 = -NOT_SUPPORTED; + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + log_err("FF-A interface %lx not implemented\n", pargs->a1); + + return ffa_to_std_errmap[NOT_SUPPORTED]; +@@ -248,7 +248,7 @@ cleanup: + res->a1 = 0; + + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + + return ret; + } +@@ -305,7 +305,7 @@ feedback: + res->a1 = 0; + + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + + return ret; + } +@@ -352,7 +352,7 @@ feedback: + res->a1 = 0; + + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + + return ret; + } +@@ -388,7 +388,7 @@ static int sandbox_ffa_rx_release(struct udevice *emul, ffa_value_t *pargs, ffa_ + res->a1 = 0; + + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + + return ret; + } +@@ -448,7 +448,7 @@ static int sandbox_ffa_msg_send_direct_req(struct udevice *emul, + res->a2 = -INVALID_PARAMETERS; + + /* x3-x7 MBZ */ +- memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); + + return ffa_to_std_errmap[INVALID_PARAMETERS]; + } +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-FF-A-v15-arm_ffa-introduce-sandbox-FF-A-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-FF-A-v15-arm_ffa-introduce-sandbox-FF-A-support.patch deleted file mode 100644 index c0078b80..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-FF-A-v15-arm_ffa-introduce-sandbox-FF-A-support.patch +++ /dev/null @@ -1,1311 +0,0 @@ -From b05ab0973850069d819872e26fae2aecbbf75f0e Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 17 Jul 2023 15:18:58 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: introduce sandbox FF-A support - -Emulate Secure World's FF-A ABIs and allow testing U-Boot FF-A support - -Features of the sandbox FF-A support: - -- Introduce an FF-A emulator -- Introduce an FF-A device driver for FF-A comms with emulated Secure World -- Provides test methods allowing to read the status of the inspected ABIs - -The sandbox FF-A emulator supports only 64-bit direct messaging. - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - MAINTAINERS | 3 +- - arch/sandbox/dts/sandbox.dtsi | 9 + - arch/sandbox/dts/test.dts | 9 + - arch/sandbox/include/asm/sandbox_arm_ffa.h | 72 ++ - .../include/asm/sandbox_arm_ffa_priv.h | 121 +++ - configs/sandbox64_defconfig | 2 + - configs/sandbox_defconfig | 2 + - doc/arch/arm64.ffa.rst | 19 +- - doc/arch/sandbox/sandbox.rst | 1 + - drivers/firmware/arm-ffa/Kconfig | 13 +- - drivers/firmware/arm-ffa/Makefile | 10 +- - drivers/firmware/arm-ffa/ffa-emul-uclass.c | 720 ++++++++++++++++++ - .../firmware/arm-ffa/sandbox_arm_ffa_priv.h | 14 - - drivers/firmware/arm-ffa/sandbox_ffa.c | 110 +++ - include/dm/uclass-id.h | 1 + - 15 files changed, 1084 insertions(+), 22 deletions(-) - create mode 100644 arch/sandbox/include/asm/sandbox_arm_ffa.h - create mode 100644 arch/sandbox/include/asm/sandbox_arm_ffa_priv.h - create mode 100644 drivers/firmware/arm-ffa/ffa-emul-uclass.c - delete mode 100644 drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h - create mode 100644 drivers/firmware/arm-ffa/sandbox_ffa.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index 4ae82229fc..679a3acdd8 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -269,12 +269,13 @@ F: configs/cortina_presidio-asic-pnand_defconfig - ARM FF-A - M: Abdellatif El Khlifi - S: Maintained -+F: arch/sandbox/include/asm/sandbox_arm_ffa.h -+F: arch/sandbox/include/asm/sandbox_arm_ffa_priv.h - F: cmd/armffa.c - F: doc/arch/arm64.ffa.rst - F: doc/usage/cmd/armffa.rst - F: drivers/firmware/arm-ffa/ - F: include/arm_ffa.h --F: include/sandbox_arm_ffa.h - - ARM FREESCALE IMX - M: Stefano Babic -diff --git a/arch/sandbox/dts/sandbox.dtsi b/arch/sandbox/dts/sandbox.dtsi -index 30a305c4d2..94a08814b8 100644 ---- a/arch/sandbox/dts/sandbox.dtsi -+++ b/arch/sandbox/dts/sandbox.dtsi -@@ -445,6 +445,15 @@ - thermal { - compatible = "sandbox,thermal"; - }; -+ -+ arm-ffa-emul { -+ compatible = "sandbox,arm-ffa-emul"; -+ -+ sandbox-arm-ffa { -+ compatible = "sandbox,arm-ffa"; -+ }; -+ }; -+ - }; - - &cros_ec { -diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts -index ff9f9222e6..c6807ee031 100644 ---- a/arch/sandbox/dts/test.dts -+++ b/arch/sandbox/dts/test.dts -@@ -1820,6 +1820,15 @@ - extcon { - compatible = "sandbox,extcon"; - }; -+ -+ arm-ffa-emul { -+ compatible = "sandbox,arm-ffa-emul"; -+ -+ sandbox-arm-ffa { -+ compatible = "sandbox,arm-ffa"; -+ }; -+ }; -+ - }; - - #include "sandbox_pmic.dtsi" -diff --git a/arch/sandbox/include/asm/sandbox_arm_ffa.h b/arch/sandbox/include/asm/sandbox_arm_ffa.h -new file mode 100644 -index 0000000000..be2790f496 ---- /dev/null -+++ b/arch/sandbox/include/asm/sandbox_arm_ffa.h -@@ -0,0 +1,72 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#ifndef __SANDBOX_ARM_FFA_H -+#define __SANDBOX_ARM_FFA_H -+ -+#include -+ -+/* -+ * This header provides public sandbox FF-A emulator declarations -+ * and declarations needed by FF-A sandbox clients -+ */ -+ -+/* UUIDs strings of the emulated services */ -+#define SANDBOX_SERVICE1_UUID "ed32d533-4209-99e6-2d72-cdd998a79cc0" -+#define SANDBOX_SERVICE2_UUID "ed32d544-4209-99e6-2d72-cdd998a79cc0" -+ -+/* IDs of the emulated secure partitions (SPs) */ -+#define SANDBOX_SP1_ID 0x1245 -+#define SANDBOX_SP2_ID 0x9836 -+#define SANDBOX_SP3_ID 0x6452 -+#define SANDBOX_SP4_ID 0x7814 -+ -+/* Invalid service UUID (no matching SP) */ -+#define SANDBOX_SERVICE3_UUID "55d532ed-0942-e699-722d-c09ca798d9cd" -+ -+/* Invalid service UUID (invalid UUID string format) */ -+#define SANDBOX_SERVICE4_UUID "32ed-0942-e699-722d-c09ca798d9cd" -+ -+/* Number of valid services */ -+#define SANDBOX_SP_COUNT_PER_VALID_SERVICE 2 -+ -+/** -+ * struct ffa_sandbox_data - query ABI state data structure -+ * @data0_size: size of the first argument -+ * @data0: pointer to the first argument -+ * @data1_size>: size of the second argument -+ * @data1: pointer to the second argument -+ * -+ * Used to pass various types of data with different sizes between -+ * the test cases and the sandbox emulator. -+ * The data is for querying FF-A ABIs state. -+ */ -+struct ffa_sandbox_data { -+ u32 data0_size; /* size of the first argument */ -+ void *data0; /* pointer to the first argument */ -+ u32 data1_size; /* size of the second argument */ -+ void *data1; /* pointer to the second argument */ -+}; -+ -+/* The sandbox FF-A emulator public functions */ -+ -+/** -+ * sandbox_query_ffa_emul_state() - Inspect the FF-A ABIs -+ * @queried_func_id: The FF-A function to be queried -+ * @func_data: Pointer to the FF-A function arguments container structure -+ * -+ * Query the status of FF-A ABI specified in the input argument. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int sandbox_query_ffa_emul_state(u32 queried_func_id, -+ struct ffa_sandbox_data *func_data); -+ -+#endif -diff --git a/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h b/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h -new file mode 100644 -index 0000000000..b0881822d7 ---- /dev/null -+++ b/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h -@@ -0,0 +1,121 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#ifndef __SANDBOX_ARM_FFA_PRV_H -+#define __SANDBOX_ARM_FFA_PRV_H -+ -+#include -+ -+/* This header is exclusively used by the Sandbox FF-A driver and emulator */ -+ -+/* Non-secure physical FF-A instance */ -+#define NS_PHYS_ENDPOINT_ID (0) -+ -+#define GET_NS_PHYS_ENDPOINT_ID_MASK GENMASK(31, 16) -+#define GET_NS_PHYS_ENDPOINT_ID(x) \ -+ ((u16)(FIELD_GET(GET_NS_PHYS_ENDPOINT_ID_MASK, (x)))) -+ -+/* Helper macro for reading the destination partition ID */ -+#define GET_DST_SP_ID_MASK GENMASK(15, 0) -+#define GET_DST_SP_ID(x) \ -+ ((u16)(FIELD_GET(GET_DST_SP_ID_MASK, (x)))) -+ -+/* Helper macro for setting the source partition ID */ -+#define PREP_SRC_SP_ID_MASK GENMASK(31, 16) -+#define PREP_SRC_SP_ID(x) \ -+ (FIELD_PREP(PREP_SRC_SP_ID_MASK, (x))) -+ -+/* Helper macro for setting the destination endpoint ID */ -+#define PREP_NS_PHYS_ENDPOINT_ID_MASK GENMASK(15, 0) -+#define PREP_NS_PHYS_ENDPOINT_ID(x) \ -+ (FIELD_PREP(PREP_NS_PHYS_ENDPOINT_ID_MASK, (x))) -+ -+/* RX/TX buffers minimum size */ -+#define RXTX_BUFFERS_MIN_SIZE (RXTX_4K) -+#define RXTX_BUFFERS_MIN_PAGES (1) -+ -+/* MBZ registers info */ -+ -+/* x1-x7 MBZ */ -+#define FFA_X1X7_MBZ_CNT (7) -+#define FFA_X1X7_MBZ_REG_START (&res->a1) -+ -+/* x4-x7 MBZ */ -+#define FFA_X4X7_MBZ_CNT (4) -+#define FFA_X4X7_MBZ_REG_START (&res->a4) -+ -+/* x3-x7 MBZ */ -+#define FFA_X3X7_MBZ_CNT (5) -+#define FFA_X3_MBZ_REG_START (&res->a3) -+ -+/* number of emulated FF-A secure partitions (SPs) */ -+#define SANDBOX_PARTITIONS_CNT (4) -+ -+/* Binary data of the emulated services UUIDs */ -+ -+/* service 1 UUID binary data (little-endian format) */ -+#define SANDBOX_SERVICE1_UUID_A1 0xed32d533 -+#define SANDBOX_SERVICE1_UUID_A2 0x99e64209 -+#define SANDBOX_SERVICE1_UUID_A3 0x9cc02d72 -+#define SANDBOX_SERVICE1_UUID_A4 0xcdd998a7 -+ -+/* service 2 UUID binary data (little-endian format) */ -+#define SANDBOX_SERVICE2_UUID_A1 0xed32d544 -+#define SANDBOX_SERVICE2_UUID_A2 0x99e64209 -+#define SANDBOX_SERVICE2_UUID_A3 0x9cc02d72 -+#define SANDBOX_SERVICE2_UUID_A4 0xcdd998a7 -+ -+/** -+ * struct ffa_rxtxpair_info - structure hosting the RX/TX buffers flags -+ * @rxbuf_owned: RX buffer ownership flag (the owner is non secure world) -+ * @rxbuf_mapped: RX buffer mapping flag -+ * @txbuf_owned TX buffer ownership flag -+ * @txbuf_mapped: TX buffer mapping flag -+ * @rxtx_buf_size: RX/TX buffers size -+ * -+ * Hosts the ownership/mapping flags of the RX/TX buffers -+ * When a buffer is owned/mapped its corresponding flag is set to 1 otherwise 0. -+ */ -+struct ffa_rxtxpair_info { -+ u8 rxbuf_owned; -+ u8 rxbuf_mapped; -+ u8 txbuf_owned; -+ u8 txbuf_mapped; -+ u32 rxtx_buf_size; -+}; -+ -+/** -+ * struct sandbox_ffa_emul - emulator data -+ * -+ * @fwk_version: FF-A framework version -+ * @id: u-boot endpoint ID -+ * @partitions: The partitions descriptors structure -+ * @pair: The RX/TX buffers pair -+ * @pair_info: The RX/TX buffers pair flags and size -+ * @test_ffa_data: The data of the FF-A bus under test -+ * -+ * Hosts all the emulated secure world data. -+ */ -+struct sandbox_ffa_emul { -+ u32 fwk_version; -+ u16 id; -+ struct ffa_partitions partitions; -+ struct ffa_rxtxpair pair; -+ struct ffa_rxtxpair_info pair_info; -+}; -+ -+/** -+ * ffa_emul_find() - Finds the FF-A emulator -+ * @dev: the sandbox FF-A device (sandbox-arm-ffa) -+ * @emulp: the FF-A emulator device (sandbox-ffa-emul) -+ * Return: -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_emul_find(struct udevice *dev, struct udevice **emulp); -+ -+#endif -diff --git a/configs/sandbox64_defconfig b/configs/sandbox64_defconfig -index 98b3e0cda4..2db69b8e52 100644 ---- a/configs/sandbox64_defconfig -+++ b/configs/sandbox64_defconfig -@@ -260,3 +260,5 @@ CONFIG_FWU_MULTI_BANK_UPDATE=y - CONFIG_UNIT_TEST=y - CONFIG_UT_TIME=y - CONFIG_UT_DM=y -+CONFIG_NVMXIP_QSPI=y -+CONFIG_ARM_FFA_TRANSPORT=y -diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig -index 1ec44d5b33..f77733377d 100644 ---- a/configs/sandbox_defconfig -+++ b/configs/sandbox_defconfig -@@ -344,3 +344,5 @@ CONFIG_TEST_FDTDEC=y - CONFIG_UNIT_TEST=y - CONFIG_UT_TIME=y - CONFIG_UT_DM=y -+CONFIG_CMD_2048=y -+CONFIG_ARM_FFA_TRANSPORT=y -diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst -index aefd527447..b7c754fa3d 100644 ---- a/doc/arch/arm64.ffa.rst -+++ b/doc/arch/arm64.ffa.rst -@@ -33,6 +33,10 @@ The U-Boot FF-A support provides the following parts: - - - A Uclass driver providing generic FF-A methods. - - An Arm FF-A device driver providing Arm-specific methods and reusing the Uclass methods. -+- A sandbox emulator for Arm FF-A, emulates the FF-A side of the Secure World and provides -+ FF-A ABIs inspection methods. -+- An FF-A sandbox device driver for FF-A communication with the emulated Secure World. -+ The driver leverages the FF-A Uclass to establish FF-A communication. - - FF-A and SMC specifications - ------------------------------------------- -@@ -62,6 +66,7 @@ CONFIG_ARM_FFA_TRANSPORT - Enables the FF-A support. Turn this on if you want to use FF-A - communication. - When using an Arm 64-bit platform, the Arm FF-A driver will be used. -+ When using sandbox, the sandbox FF-A emulator and FF-A sandbox driver will be used. - - FF-A ABIs under the hood - --------------------------------------- -@@ -98,10 +103,8 @@ architecture features including FF-A bus. - - Class Index Probed Driver Name - ----------------------------------------------------------- -- ... - firmware 0 [ + ] psci |-- psci - ffa 0 [ ] arm_ffa | `-- arm_ffa -- ... - - The PSCI driver is bound to the PSCI device and when probed it tries to discover - the architecture features by calling a callback the features drivers provide. -@@ -205,6 +208,18 @@ The following features are provided: - - - FF-A bus can be compiled and used without EFI - -+Relationship between the sandbox emulator and the FF-A device -+--------------------------------------------------------------- -+ -+:: -+ -+ => dm tree -+ -+ Class Index Probed Driver Name -+ ----------------------------------------------------------- -+ ffa_emul 0 [ + ] sandbox_ffa_emul `-- arm-ffa-emul -+ ffa 0 [ ] sandbox_arm_ffa `-- sandbox-arm-ffa -+ - The armffa command - ----------------------------------- - -diff --git a/doc/arch/sandbox/sandbox.rst b/doc/arch/sandbox/sandbox.rst -index 77ca6bc4cc..a3631de749 100644 ---- a/doc/arch/sandbox/sandbox.rst -+++ b/doc/arch/sandbox/sandbox.rst -@@ -200,6 +200,7 @@ Supported Drivers - - U-Boot sandbox supports these emulations: - -+- Arm FF-A - - Block devices - - Chrome OS EC - - GPIO -diff --git a/drivers/firmware/arm-ffa/Kconfig b/drivers/firmware/arm-ffa/Kconfig -index a7d5392859..d75f8b53fd 100644 ---- a/drivers/firmware/arm-ffa/Kconfig -+++ b/drivers/firmware/arm-ffa/Kconfig -@@ -2,9 +2,9 @@ - - config ARM_FFA_TRANSPORT - bool "Enable Arm Firmware Framework for Armv8-A driver" -- depends on DM && ARM64 -- select ARM_SMCCC -- select ARM_SMCCC_FEATURES -+ depends on DM && (ARM64 || SANDBOX) -+ select ARM_SMCCC if !SANDBOX -+ select ARM_SMCCC_FEATURES if !SANDBOX - imply CMD_ARMFFA - select LIB_UUID - select DEVRES -@@ -33,5 +33,10 @@ config ARM_FFA_TRANSPORT - Generic FF-A methods are implemented in the Uclass (arm-ffa-uclass.c). - Arm specific methods are implemented in the Arm driver (arm-ffa.c). - -- For more details about the FF-A support, please refer to doc/arch/arm64.ffa.rst -+ FF-A sandbox is provided to run FF-A under sandbox and allows to test the FF-A Uclass. -+ Sandbox support includes an emulator for Arm FF-A which emulates the FF-A side of -+ the Secure World and provides FF-A ABIs inspection methods (ffa-emul-uclass.c). -+ An FF-A sandbox driver is also provided for FF-A communication with the emulated -+ Secure World (sandbox_ffa.c). - -+ For more details about the FF-A support, please refer to doc/arch/arm64.ffa.rst -diff --git a/drivers/firmware/arm-ffa/Makefile b/drivers/firmware/arm-ffa/Makefile -index 11b1766285..318123a7f4 100644 ---- a/drivers/firmware/arm-ffa/Makefile -+++ b/drivers/firmware/arm-ffa/Makefile -@@ -5,4 +5,12 @@ - # Authors: - # Abdellatif El Khlifi - --obj-y += arm-ffa-uclass.o arm-ffa.o -+# build the generic FF-A methods -+obj-y += arm-ffa-uclass.o -+ifeq ($(CONFIG_SANDBOX),y) -+# build the FF-A sandbox emulator and driver -+obj-y += ffa-emul-uclass.o sandbox_ffa.o -+else -+# build the Arm64 FF-A driver -+obj-y += arm-ffa.o -+endif -diff --git a/drivers/firmware/arm-ffa/ffa-emul-uclass.c b/drivers/firmware/arm-ffa/ffa-emul-uclass.c -new file mode 100644 -index 0000000000..5562bbaac3 ---- /dev/null -+++ b/drivers/firmware/arm-ffa/ffa-emul-uclass.c -@@ -0,0 +1,720 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+DECLARE_GLOBAL_DATA_PTR; -+ -+/* The partitions (SPs) table */ -+static struct ffa_partition_desc sandbox_partitions[SANDBOX_PARTITIONS_CNT] = { -+ { -+ .info = { .id = SANDBOX_SP1_ID, .exec_ctxt = 0x5687, .properties = 0x89325621 }, -+ .sp_uuid = { -+ .a1 = SANDBOX_SERVICE1_UUID_A1, -+ .a2 = SANDBOX_SERVICE1_UUID_A2, -+ .a3 = SANDBOX_SERVICE1_UUID_A3, -+ .a4 = SANDBOX_SERVICE1_UUID_A4, -+ } -+ }, -+ { -+ .info = { .id = SANDBOX_SP3_ID, .exec_ctxt = 0x7687, .properties = 0x23325621 }, -+ .sp_uuid = { -+ .a1 = SANDBOX_SERVICE2_UUID_A1, -+ .a2 = SANDBOX_SERVICE2_UUID_A2, -+ .a3 = SANDBOX_SERVICE2_UUID_A3, -+ .a4 = SANDBOX_SERVICE2_UUID_A4, -+ } -+ }, -+ { -+ .info = { .id = SANDBOX_SP2_ID, .exec_ctxt = 0x9587, .properties = 0x45325621 }, -+ .sp_uuid = { -+ .a1 = SANDBOX_SERVICE1_UUID_A1, -+ .a2 = SANDBOX_SERVICE1_UUID_A2, -+ .a3 = SANDBOX_SERVICE1_UUID_A3, -+ .a4 = SANDBOX_SERVICE1_UUID_A4, -+ } -+ }, -+ { -+ .info = { .id = SANDBOX_SP4_ID, .exec_ctxt = 0x1487, .properties = 0x70325621 }, -+ .sp_uuid = { -+ .a1 = SANDBOX_SERVICE2_UUID_A1, -+ .a2 = SANDBOX_SERVICE2_UUID_A2, -+ .a3 = SANDBOX_SERVICE2_UUID_A3, -+ .a4 = SANDBOX_SERVICE2_UUID_A4, -+ } -+ } -+ -+}; -+ -+/* The emulator functions */ -+ -+/** -+ * sandbox_ffa_version() - Emulated FFA_VERSION handler function -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_VERSION FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+ -+static int sandbox_ffa_version(struct udevice *emul, ffa_value_t *pargs, ffa_value_t *res) -+{ -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ priv->fwk_version = FFA_VERSION_1_0; -+ res->a0 = priv->fwk_version; -+ -+ /* x1-x7 MBZ */ -+ memset(FFA_X1X7_MBZ_REG_START, 0, FFA_X1X7_MBZ_CNT * sizeof(ulong)); -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_id_get() - Emulated FFA_ID_GET handler function -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_ID_GET FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_id_get(struct udevice *emul, ffa_value_t *pargs, ffa_value_t *res) -+{ -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ res->a1 = 0; -+ -+ priv->id = NS_PHYS_ENDPOINT_ID; -+ res->a2 = priv->id; -+ -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_features() - Emulated FFA_FEATURES handler function -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_FEATURES FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_features(ffa_value_t *pargs, ffa_value_t *res) -+{ -+ res->a1 = 0; -+ -+ if (pargs->a1 == FFA_SMC_64(FFA_RXTX_MAP)) { -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ res->a2 = RXTX_BUFFERS_MIN_SIZE; -+ res->a3 = 0; -+ /* x4-x7 MBZ */ -+ memset(FFA_X4X7_MBZ_REG_START, 0, FFA_X4X7_MBZ_CNT * sizeof(ulong)); -+ return 0; -+ } -+ -+ res->a0 = FFA_SMC_32(FFA_ERROR); -+ res->a2 = -NOT_SUPPORTED; -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ log_err("FF-A interface %lx not implemented\n", pargs->a1); -+ -+ return ffa_to_std_errmap[NOT_SUPPORTED]; -+} -+ -+/** -+ * sandbox_ffa_partition_info_get() - Emulated FFA_PARTITION_INFO_GET handler -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_PARTITION_INFO_GET FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_partition_info_get(struct udevice *emul, ffa_value_t *pargs, -+ ffa_value_t *res) -+{ -+ struct ffa_partition_info *rxbuf_desc_info = NULL; -+ u32 descs_cnt; -+ u32 descs_size_bytes; -+ int ret; -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ res->a0 = FFA_SMC_32(FFA_ERROR); -+ -+ if (!priv->pair.rxbuf) { -+ res->a2 = -DENIED; -+ ret = ffa_to_std_errmap[DENIED]; -+ goto cleanup; -+ } -+ -+ if (priv->pair_info.rxbuf_owned) { -+ res->a2 = -BUSY; -+ ret = ffa_to_std_errmap[BUSY]; -+ goto cleanup; -+ } -+ -+ if (!priv->partitions.descs) { -+ priv->partitions.descs = sandbox_partitions; -+ priv->partitions.count = SANDBOX_PARTITIONS_CNT; -+ } -+ -+ descs_size_bytes = SANDBOX_PARTITIONS_CNT * -+ sizeof(struct ffa_partition_desc); -+ -+ /* Abort if the RX buffer size is smaller than the descs buffer size */ -+ if ((priv->pair_info.rxtx_buf_size * SZ_4K) < descs_size_bytes) { -+ res->a2 = -NO_MEMORY; -+ ret = ffa_to_std_errmap[NO_MEMORY]; -+ goto cleanup; -+ } -+ -+ rxbuf_desc_info = priv->pair.rxbuf; -+ -+ /* No UUID specified. Return the information of all partitions */ -+ if (!pargs->a1 && !pargs->a2 && !pargs->a3 && !pargs->a4) { -+ for (descs_cnt = 0; descs_cnt < SANDBOX_PARTITIONS_CNT; descs_cnt++) -+ *(rxbuf_desc_info++) = priv->partitions.descs[descs_cnt].info; -+ -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ res->a2 = SANDBOX_PARTITIONS_CNT; -+ /* Transfer ownership to the consumer: the non secure world */ -+ priv->pair_info.rxbuf_owned = 1; -+ ret = 0; -+ -+ goto cleanup; -+ } -+ -+ /* A UUID specified. Return the info of all SPs matching the UUID */ -+ -+ for (descs_cnt = 0 ; descs_cnt < SANDBOX_PARTITIONS_CNT ; descs_cnt++) -+ if (pargs->a1 == priv->partitions.descs[descs_cnt].sp_uuid.a1 && -+ pargs->a2 == priv->partitions.descs[descs_cnt].sp_uuid.a2 && -+ pargs->a3 == priv->partitions.descs[descs_cnt].sp_uuid.a3 && -+ pargs->a4 == priv->partitions.descs[descs_cnt].sp_uuid.a4) { -+ *(rxbuf_desc_info++) = priv->partitions.descs[descs_cnt].info; -+ } -+ -+ if (rxbuf_desc_info != priv->pair.rxbuf) { -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ /* Store the partitions count */ -+ res->a2 = (ulong) -+ (rxbuf_desc_info - (struct ffa_partition_info *) -+ priv->pair.rxbuf); -+ ret = 0; -+ -+ /* Transfer ownership to the consumer: the non secure world */ -+ priv->pair_info.rxbuf_owned = 1; -+ } else { -+ /* Unrecognized UUID */ -+ res->a2 = -INVALID_PARAMETERS; -+ ret = ffa_to_std_errmap[INVALID_PARAMETERS]; -+ } -+ -+cleanup: -+ -+ log_err("FFA_PARTITION_INFO_GET (%ld)\n", res->a2); -+ -+ res->a1 = 0; -+ -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ -+ return ret; -+} -+ -+/** -+ * sandbox_ffa_rxtx_map() - Emulated FFA_RXTX_MAP handler -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_RXTX_MAP FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_rxtx_map(struct udevice *emul, ffa_value_t *pargs, ffa_value_t *res) -+{ -+ int ret; -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ res->a0 = FFA_SMC_32(FFA_ERROR); -+ -+ if (priv->pair.txbuf && priv->pair.rxbuf) { -+ res->a2 = -DENIED; -+ ret = ffa_to_std_errmap[DENIED]; -+ goto feedback; -+ } -+ -+ if (pargs->a3 >= RXTX_BUFFERS_MIN_PAGES && pargs->a1 && pargs->a2) { -+ priv->pair.txbuf = map_sysmem(pargs->a1, 0); -+ priv->pair.rxbuf = map_sysmem(pargs->a2, 0); -+ priv->pair_info.rxtx_buf_size = pargs->a3; -+ priv->pair_info.rxbuf_mapped = 1; -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ res->a2 = 0; -+ ret = 0; -+ goto feedback; -+ } -+ -+ if (!pargs->a1 || !pargs->a2) { -+ res->a2 = -INVALID_PARAMETERS; -+ ret = ffa_to_std_errmap[INVALID_PARAMETERS]; -+ } else { -+ res->a2 = -NO_MEMORY; -+ ret = ffa_to_std_errmap[NO_MEMORY]; -+ } -+ -+ log_err("Error in FFA_RXTX_MAP arguments (%d)\n", -+ (int)res->a2); -+ -+feedback: -+ -+ res->a1 = 0; -+ -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ -+ return ret; -+} -+ -+/** -+ * sandbox_ffa_rxtx_unmap() - Emulated FFA_RXTX_UNMAP handler -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_RXTX_UNMAP FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_rxtx_unmap(struct udevice *emul, ffa_value_t *pargs, ffa_value_t *res) -+{ -+ int ret; -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ res->a0 = FFA_SMC_32(FFA_ERROR); -+ res->a2 = -INVALID_PARAMETERS; -+ ret = ffa_to_std_errmap[INVALID_PARAMETERS]; -+ -+ if (GET_NS_PHYS_ENDPOINT_ID(pargs->a1) != priv->id) -+ goto feedback; -+ -+ if (priv->pair.txbuf && priv->pair.rxbuf) { -+ priv->pair.txbuf = 0; -+ priv->pair.rxbuf = 0; -+ priv->pair_info.rxtx_buf_size = 0; -+ priv->pair_info.rxbuf_mapped = 0; -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ res->a2 = 0; -+ ret = 0; -+ goto feedback; -+ } -+ -+ log_err("No buffer pair registered on behalf of the caller\n"); -+ -+feedback: -+ -+ res->a1 = 0; -+ -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ -+ return ret; -+} -+ -+/** -+ * sandbox_ffa_rx_release() - Emulated FFA_RX_RELEASE handler -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_RX_RELEASE FF-A function. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_rx_release(struct udevice *emul, ffa_value_t *pargs, ffa_value_t *res) -+{ -+ int ret; -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ if (!priv->pair_info.rxbuf_owned) { -+ res->a0 = FFA_SMC_32(FFA_ERROR); -+ res->a2 = -DENIED; -+ ret = ffa_to_std_errmap[DENIED]; -+ } else { -+ priv->pair_info.rxbuf_owned = 0; -+ res->a0 = FFA_SMC_32(FFA_SUCCESS); -+ res->a2 = 0; -+ ret = 0; -+ } -+ -+ res->a1 = 0; -+ -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ -+ return ret; -+} -+ -+/** -+ * sandbox_ffa_sp_valid() - Check SP validity -+ * @emul: The sandbox FF-A emulator device -+ * @part_id: partition ID to check -+ * -+ * Search the input ID in the descriptors table. -+ * -+ * Return: -+ * -+ * 1 on success (Partition found). Otherwise, failure -+ */ -+static int sandbox_ffa_sp_valid(struct udevice *emul, u16 part_id) -+{ -+ u32 descs_cnt; -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ for (descs_cnt = 0 ; descs_cnt < SANDBOX_PARTITIONS_CNT ; descs_cnt++) -+ if (priv->partitions.descs[descs_cnt].info.id == part_id) -+ return 1; -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_msg_send_direct_req() - Emulated FFA_MSG_SEND_DIRECT_{REQ,RESP} handler -+ * @emul: The sandbox FF-A emulator device -+ * @pargs: The SMC call input arguments a0-a7 -+ * @res: The SMC return data -+ * -+ * Emulate FFA_MSG_SEND_DIRECT_{REQ,RESP} FF-A ABIs. -+ * Only SMC 64-bit is supported in Sandbox. -+ * -+ * Emulating interrupts is not supported. So, FFA_RUN and FFA_INTERRUPT are not -+ * supported. In case of success FFA_MSG_SEND_DIRECT_RESP is returned with -+ * default pattern data (0xff). -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_msg_send_direct_req(struct udevice *emul, -+ ffa_value_t *pargs, ffa_value_t *res) -+{ -+ u16 part_id; -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ part_id = GET_DST_SP_ID(pargs->a1); -+ -+ if (GET_NS_PHYS_ENDPOINT_ID(pargs->a1) != priv->id || -+ !sandbox_ffa_sp_valid(emul, part_id) || pargs->a2) { -+ res->a0 = FFA_SMC_32(FFA_ERROR); -+ res->a1 = 0; -+ res->a2 = -INVALID_PARAMETERS; -+ -+ /* x3-x7 MBZ */ -+ memset(FFA_X3_MBZ_REG_START, 0, FFA_X3X7_MBZ_CNT * sizeof(ulong)); -+ -+ return ffa_to_std_errmap[INVALID_PARAMETERS]; -+ } -+ -+ res->a0 = FFA_SMC_64(FFA_MSG_SEND_DIRECT_RESP); -+ -+ res->a1 = PREP_SRC_SP_ID(part_id) | -+ PREP_NS_PHYS_ENDPOINT_ID(priv->id); -+ -+ res->a2 = 0; -+ -+ /* Return 0xff bytes as a response */ -+ res->a3 = -1UL; -+ res->a4 = -1UL; -+ res->a5 = -1UL; -+ res->a6 = -1UL; -+ res->a7 = -1UL; -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_get_rxbuf_flags() - Read the mapping/ownership flags -+ * @emul: The sandbox FF-A emulator device -+ * @queried_func_id: The FF-A function to be queried -+ * @func_data: Pointer to the FF-A function arguments container structure -+ * -+ * Query the status flags of the following emulated -+ * ABIs: FFA_RXTX_MAP, FFA_RXTX_UNMAP, FFA_RX_RELEASE. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_get_rxbuf_flags(struct udevice *emul, u32 queried_func_id, -+ struct ffa_sandbox_data *func_data) -+{ -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ if (!func_data) -+ return -EINVAL; -+ -+ if (!func_data->data0 || func_data->data0_size != sizeof(u8)) -+ return -EINVAL; -+ -+ switch (queried_func_id) { -+ case FFA_RXTX_MAP: -+ case FFA_RXTX_UNMAP: -+ *((u8 *)func_data->data0) = priv->pair_info.rxbuf_mapped; -+ return 0; -+ case FFA_RX_RELEASE: -+ *((u8 *)func_data->data0) = priv->pair_info.rxbuf_owned; -+ return 0; -+ default: -+ log_err("The querried FF-A interface flag (%d) undefined\n", -+ queried_func_id); -+ return -EINVAL; -+ } -+} -+ -+/** -+ * sandbox_ffa_get_fwk_version() - Return the FFA framework version -+ * @emul: The sandbox FF-A emulator device -+ * @func_data: Pointer to the FF-A function arguments container structure -+ * -+ * Return the FFA framework version read from the FF-A emulator data. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_get_fwk_version(struct udevice *emul, struct ffa_sandbox_data *func_data) -+{ -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ if (!func_data) -+ return -EINVAL; -+ -+ if (!func_data->data0 || -+ func_data->data0_size != sizeof(priv->fwk_version)) -+ return -EINVAL; -+ -+ *((u32 *)func_data->data0) = priv->fwk_version; -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_get_parts() - Return the address of partitions data -+ * @emul: The sandbox FF-A emulator device -+ * @func_data: Pointer to the FF-A function arguments container structure -+ * -+ * Return the address of partitions data read from the FF-A emulator data. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_get_parts(struct udevice *emul, struct ffa_sandbox_data *func_data) -+{ -+ struct sandbox_ffa_emul *priv = dev_get_priv(emul); -+ -+ if (!func_data) -+ return -EINVAL; -+ -+ if (!func_data->data0 || -+ func_data->data0_size != sizeof(struct ffa_partitions *)) -+ return -EINVAL; -+ -+ *((struct ffa_partitions **)func_data->data0) = &priv->partitions; -+ -+ return 0; -+} -+ -+/** -+ * sandbox_query_ffa_emul_state() - Inspect the FF-A ABIs -+ * @queried_func_id: The FF-A function to be queried -+ * @func_data: Pointer to the FF-A function arguments container structure -+ * -+ * Query the status of FF-A ABI specified in the input argument. -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+int sandbox_query_ffa_emul_state(u32 queried_func_id, -+ struct ffa_sandbox_data *func_data) -+{ -+ struct udevice *emul; -+ int ret; -+ -+ ret = uclass_first_device_err(UCLASS_FFA_EMUL, &emul); -+ if (ret) { -+ log_err("Cannot find FF-A emulator during querying state\n"); -+ return ret; -+ } -+ -+ switch (queried_func_id) { -+ case FFA_RXTX_MAP: -+ case FFA_RXTX_UNMAP: -+ case FFA_RX_RELEASE: -+ return sandbox_ffa_get_rxbuf_flags(emul, queried_func_id, func_data); -+ case FFA_VERSION: -+ return sandbox_ffa_get_fwk_version(emul, func_data); -+ case FFA_PARTITION_INFO_GET: -+ return sandbox_ffa_get_parts(emul, func_data); -+ default: -+ log_err("Undefined FF-A interface (%d)\n", -+ queried_func_id); -+ return -EINVAL; -+ } -+} -+ -+/** -+ * sandbox_arm_ffa_smccc_smc() - FF-A SMC call emulation -+ * @args: the SMC call arguments -+ * @res: the SMC call returned data -+ * -+ * Emulate the FF-A ABIs SMC call. -+ * The emulated FF-A ABI is identified and invoked. -+ * FF-A emulation is based on the FF-A specification 1.0 -+ * -+ * Return: -+ * -+ * 0 on success. Otherwise, failure. -+ * FF-A protocol error codes are returned using the registers arguments as -+ * described by the specification -+ */ -+void sandbox_arm_ffa_smccc_smc(ffa_value_t *args, ffa_value_t *res) -+{ -+ int ret = 0; -+ struct udevice *emul; -+ -+ ret = uclass_first_device_err(UCLASS_FFA_EMUL, &emul); -+ if (ret) { -+ log_err("Cannot find FF-A emulator during SMC emulation\n"); -+ return; -+ } -+ -+ switch (args->a0) { -+ case FFA_SMC_32(FFA_VERSION): -+ ret = sandbox_ffa_version(emul, args, res); -+ break; -+ case FFA_SMC_32(FFA_PARTITION_INFO_GET): -+ ret = sandbox_ffa_partition_info_get(emul, args, res); -+ break; -+ case FFA_SMC_32(FFA_RXTX_UNMAP): -+ ret = sandbox_ffa_rxtx_unmap(emul, args, res); -+ break; -+ case FFA_SMC_64(FFA_MSG_SEND_DIRECT_REQ): -+ ret = sandbox_ffa_msg_send_direct_req(emul, args, res); -+ break; -+ case FFA_SMC_32(FFA_ID_GET): -+ ret = sandbox_ffa_id_get(emul, args, res); -+ break; -+ case FFA_SMC_32(FFA_FEATURES): -+ ret = sandbox_ffa_features(args, res); -+ break; -+ case FFA_SMC_64(FFA_RXTX_MAP): -+ ret = sandbox_ffa_rxtx_map(emul, args, res); -+ break; -+ case FFA_SMC_32(FFA_RX_RELEASE): -+ ret = sandbox_ffa_rx_release(emul, args, res); -+ break; -+ default: -+ log_err("Undefined FF-A interface (%lx)\n", -+ args->a0); -+ } -+ -+ if (ret != 0) -+ log_err("FF-A ABI internal failure (%d)\n", ret); -+} -+ -+/** -+ * invoke_ffa_fn() - SMC wrapper -+ * @args: FF-A ABI arguments to be copied to Xn registers -+ * @res: FF-A ABI return data to be copied from Xn registers -+ * -+ * Calls the emulated SMC call. -+ */ -+void invoke_ffa_fn(ffa_value_t args, ffa_value_t *res) -+{ -+ sandbox_arm_ffa_smccc_smc(&args, res); -+} -+ -+/** -+ * ffa_emul_find() - Find the FF-A emulator -+ * @dev: the sandbox FF-A device (sandbox-arm-ffa) -+ * @emulp: the FF-A emulator device (sandbox-ffa-emul) -+ * -+ * Search for the FF-A emulator and returns its device pointer. -+ * -+ * Return: -+ * 0 on success. Otherwise, failure -+ */ -+int ffa_emul_find(struct udevice *dev, struct udevice **emulp) -+{ -+ int ret; -+ -+ ret = uclass_first_device_err(UCLASS_FFA_EMUL, emulp); -+ if (ret) { -+ log_err("Cannot find FF-A emulator\n"); -+ return ret; -+ } -+ -+ log_info("FF-A emulator ready to use\n"); -+ -+ return 0; -+} -+ -+UCLASS_DRIVER(ffa_emul) = { -+ .name = "ffa_emul", -+ .id = UCLASS_FFA_EMUL, -+ .post_bind = dm_scan_fdt_dev, -+}; -+ -+static const struct udevice_id sandbox_ffa_emul_ids[] = { -+ { .compatible = "sandbox,arm-ffa-emul" }, -+ { } -+}; -+ -+/* Declaring the sandbox FF-A emulator under UCLASS_FFA_EMUL */ -+U_BOOT_DRIVER(sandbox_ffa_emul) = { -+ .name = "sandbox_ffa_emul", -+ .id = UCLASS_FFA_EMUL, -+ .of_match = sandbox_ffa_emul_ids, -+ .priv_auto = sizeof(struct sandbox_ffa_emul), -+}; -diff --git a/drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h b/drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h -deleted file mode 100644 -index 4338f9c9b1..0000000000 ---- a/drivers/firmware/arm-ffa/sandbox_arm_ffa_priv.h -+++ /dev/null -@@ -1,14 +0,0 @@ --/* SPDX-License-Identifier: GPL-2.0+ */ --/* -- * Copyright 2022-2023 Arm Limited and/or its affiliates -- * -- * Authors: -- * Abdellatif El Khlifi -- */ -- --#ifndef __SANDBOX_ARM_FFA_PRV_H --#define __SANDBOX_ARM_FFA_PRV_H -- --/* Future sandbox support private declarations */ -- --#endif -diff --git a/drivers/firmware/arm-ffa/sandbox_ffa.c b/drivers/firmware/arm-ffa/sandbox_ffa.c -new file mode 100644 -index 0000000000..ef9491ccea ---- /dev/null -+++ b/drivers/firmware/arm-ffa/sandbox_ffa.c -@@ -0,0 +1,110 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+DECLARE_GLOBAL_DATA_PTR; -+ -+/** -+ * sandbox_ffa_discover() - perform sandbox FF-A discovery -+ * @dev: The sandbox FF-A bus device -+ * Try to discover the FF-A framework. Discovery is performed by -+ * querying the FF-A framework version from secure world using the FFA_VERSION ABI. -+ * Return: -+ * -+ * 0 on success. Otherwise, failure -+ */ -+static int sandbox_ffa_discover(struct udevice *dev) -+{ -+ int ret; -+ struct udevice *emul; -+ -+ log_info("Emulated FF-A framework discovery\n"); -+ -+ ret = ffa_emul_find(dev, &emul); -+ if (ret) { -+ log_err("Cannot find FF-A emulator\n"); -+ return ret; -+ } -+ -+ ret = ffa_get_version_hdlr(dev); -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_probe() - The sandbox FF-A driver probe function -+ * @dev: the sandbox-arm-ffa device -+ * Save the emulator device in uc_priv. -+ * Return: -+ * -+ * 0 on success. -+ */ -+static int sandbox_ffa_probe(struct udevice *dev) -+{ -+ int ret; -+ struct ffa_priv *uc_priv = dev_get_uclass_priv(dev); -+ -+ ret = uclass_first_device_err(UCLASS_FFA_EMUL, &uc_priv->emul); -+ if (ret) { -+ log_err("Cannot find FF-A emulator\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+/** -+ * sandbox_ffa_bind() - The sandbox FF-A driver bind function -+ * @dev: the sandbox-arm-ffa device -+ * Try to discover the emulated FF-A bus. -+ * Return: -+ * -+ * 0 on success. -+ */ -+static int sandbox_ffa_bind(struct udevice *dev) -+{ -+ int ret; -+ -+ ret = sandbox_ffa_discover(dev); -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+ -+/* Sandbox Arm FF-A emulator operations */ -+ -+static const struct ffa_bus_ops sandbox_ffa_ops = { -+ .partition_info_get = ffa_get_partitions_info_hdlr, -+ .sync_send_receive = ffa_msg_send_direct_req_hdlr, -+ .rxtx_unmap = ffa_unmap_rxtx_buffers_hdlr, -+}; -+ -+static const struct udevice_id sandbox_ffa_id[] = { -+ { "sandbox,arm-ffa", 0 }, -+ { }, -+}; -+ -+/* Declaring the sandbox FF-A driver under UCLASS_FFA */ -+U_BOOT_DRIVER(sandbox_arm_ffa) = { -+ .name = "sandbox_arm_ffa", -+ .of_match = sandbox_ffa_id, -+ .id = UCLASS_FFA, -+ .bind = sandbox_ffa_bind, -+ .probe = sandbox_ffa_probe, -+ .ops = &sandbox_ffa_ops, -+}; -diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h -index 3c6af2e3d2..0432c95c9e 100644 ---- a/include/dm/uclass-id.h -+++ b/include/dm/uclass-id.h -@@ -63,6 +63,7 @@ enum uclass_id { - UCLASS_ETH_PHY, /* Ethernet PHY device */ - UCLASS_EXTCON, /* External Connector Class */ - UCLASS_FFA, /* Arm Firmware Framework for Armv8-A */ -+ UCLASS_FFA_EMUL, /* sandbox FF-A device emulator */ - UCLASS_FIRMWARE, /* Firmware */ - UCLASS_FPGA, /* FPGA device */ - UCLASS_FUZZING_ENGINE, /* Fuzzing engine */ diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-sandbox-Add-FFA_MEM_SHARE-emulation.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-sandbox-Add-FFA_MEM_SHARE-emulation.patch new file mode 100644 index 00000000..1b42c684 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0006-arm_ffa-sandbox-Add-FFA_MEM_SHARE-emulation.patch @@ -0,0 +1,129 @@ +From 8ba17011b310fee0741ef5c7ddd1a5b019428e4e Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Wed, 16 Oct 2024 18:41:16 +0100 +Subject: [PATCH 06/36] arm_ffa: sandbox: Add FFA_MEM_SHARE emulation + +Add FFA_MEM_SHARE support to the FF-A emulator + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + .../include/asm/sandbox_arm_ffa_priv.h | 6 ++- + drivers/firmware/arm-ffa/ffa-emul-uclass.c | 43 +++++++++++++++++++ + drivers/firmware/arm-ffa/sandbox_ffa.c | 3 +- + 3 files changed, 50 insertions(+), 2 deletions(-) + +diff --git a/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h b/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h +index 5c46547beab..fa09f9598ee 100644 +--- a/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h ++++ b/arch/sandbox/include/asm/sandbox_arm_ffa_priv.h +@@ -1,6 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0+ */ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -38,6 +38,7 @@ + /* RX/TX buffers minimum size */ + #define RXTX_BUFFERS_MIN_SIZE (RXTX_4K) + #define RXTX_BUFFERS_MIN_PAGES (1) ++#define RXTX_BUFFERS_MIN_PAGES_SIZE (RXTX_BUFFERS_MIN_PAGES * SZ_4K) + + /* A helper macro used for clearing registers that Must Be Zero (MBZ) */ + #define FFA_X_REG_SIZE_IN_BYTE sizeof((((ffa_value_t *)0)->a0)) +@@ -59,6 +60,9 @@ + #define SANDBOX_SERVICE2_UUID_A3 0x9cc02d72 + #define SANDBOX_SERVICE2_UUID_A4 0xcdd998a7 + ++/* Globally unique Handle to identify the shared memory region */ ++#define SANDBOX_MEM_HANDLE 0xffffffff ++ + /** + * struct ffa_rxtxpair_info - structure hosting the RX/TX buffers flags + * @rxbuf_owned: RX buffer ownership flag (the owner is non secure world) +diff --git a/drivers/firmware/arm-ffa/ffa-emul-uclass.c b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +index dcf5bce9435..4918404fb6d 100644 +--- a/drivers/firmware/arm-ffa/ffa-emul-uclass.c ++++ b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +@@ -563,6 +563,46 @@ static int sandbox_ffa_get_parts(struct udevice *emul, struct ffa_sandbox_data * + return 0; + } + ++/** ++ * sandbox_ffa_memory_share() - Emulated FFA_MEM_SHARE handler ++ * @emul: The sandbox FF-A emulator device ++ * @pargs: The SMC call input arguments a0-a7 ++ * @res: The SMC return data ++ * ++ * Emulate FFA_MEM_SHARE FF-A function. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int sandbox_ffa_memory_share(struct udevice *emul, ffa_value_t *pargs, ++ ffa_value_t *res) ++{ ++ int ret; ++ ++ res->a1 = 0; ++ ++ if (!pargs->a1 || pargs->a1 > RXTX_BUFFERS_MIN_PAGES_SIZE) { ++ /* FFA_ERROR encoding */ ++ res->a0 = FFA_SMC_32(FFA_ERROR); ++ res->a2 = -INVALID_PARAMETERS; ++ ret = ffa_to_std_errmap[INVALID_PARAMETERS]; ++ /* x3-x7 MBZ */ ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); ++ ++ return ret; ++ } ++ ++ /* FFA_SUCCESS encoding */ ++ res->a0 = FFA_SMC_32(FFA_SUCCESS); ++ res->a2 = SANDBOX_MEM_HANDLE; ++ res->a3 = SANDBOX_MEM_HANDLE; ++ /* x4-x7 MBZ */ ++ memset(&res->a4, 0, 4 * FFA_X_REG_SIZE_IN_BYTE); ++ ++ return 0; ++} ++ + /** + * sandbox_query_ffa_emul_state() - Inspect the FF-A ABIs + * @queried_func_id: The FF-A function to be queried +@@ -653,6 +693,9 @@ void sandbox_arm_ffa_smccc_smc(ffa_value_t *args, ffa_value_t *res) + case FFA_SMC_32(FFA_RX_RELEASE): + ret = sandbox_ffa_rx_release(emul, args, res); + break; ++ case FFA_SMC_32(FFA_MEM_SHARE): ++ ret = sandbox_ffa_memory_share(emul, args, res); ++ break; + default: + log_err("Undefined FF-A interface (%lx)\n", + args->a0); +diff --git a/drivers/firmware/arm-ffa/sandbox_ffa.c b/drivers/firmware/arm-ffa/sandbox_ffa.c +index 44b32a829dd..8d85e660e2b 100644 +--- a/drivers/firmware/arm-ffa/sandbox_ffa.c ++++ b/drivers/firmware/arm-ffa/sandbox_ffa.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -91,6 +91,7 @@ static const struct ffa_bus_ops sandbox_ffa_ops = { + .partition_info_get = ffa_get_partitions_info_hdlr, + .sync_send_receive = ffa_msg_send_direct_req_hdlr, + .rxtx_unmap = ffa_unmap_rxtx_buffers_hdlr, ++ .memory_share = ffa_memory_share_hdlr, + }; + + static const struct udevice_id sandbox_ffa_id[] = { +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-FF-A-v15-arm_ffa-introduce-sandbox-test-cases-for-UC.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-FF-A-v15-arm_ffa-introduce-sandbox-test-cases-for-UC.patch deleted file mode 100644 index c61002d8..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-FF-A-v15-arm_ffa-introduce-sandbox-test-cases-for-UC.patch +++ /dev/null @@ -1,338 +0,0 @@ -From effa8444b74e456f724146c2593991281f95762d Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Wed, 10 May 2023 17:34:55 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: introduce sandbox test cases for - UCLASS_FFA - -Add functional test cases for the FF-A support - -These tests rely on the FF-A sandbox emulator and FF-A -sandbox driver which help in inspecting the FF-A communication. - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Cc: Tom Rini -Cc: Ilias Apalodimas -Cc: Jens Wiklander -Cc: Heinrich Schuchardt -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - MAINTAINERS | 1 + - doc/arch/arm64.ffa.rst | 1 + - test/dm/Makefile | 3 +- - test/dm/ffa.c | 261 +++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 265 insertions(+), 1 deletion(-) - create mode 100644 test/dm/ffa.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index 679a3acdd8..ccd7859c88 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -276,6 +276,7 @@ F: doc/arch/arm64.ffa.rst - F: doc/usage/cmd/armffa.rst - F: drivers/firmware/arm-ffa/ - F: include/arm_ffa.h -+F: test/dm/ffa.c - - ARM FREESCALE IMX - M: Stefano Babic -diff --git a/doc/arch/arm64.ffa.rst b/doc/arch/arm64.ffa.rst -index b7c754fa3d..325fb80346 100644 ---- a/doc/arch/arm64.ffa.rst -+++ b/doc/arch/arm64.ffa.rst -@@ -37,6 +37,7 @@ The U-Boot FF-A support provides the following parts: - FF-A ABIs inspection methods. - - An FF-A sandbox device driver for FF-A communication with the emulated Secure World. - The driver leverages the FF-A Uclass to establish FF-A communication. -+- Sandbox FF-A test cases. - - FF-A and SMC specifications - ------------------------------------------- -diff --git a/test/dm/Makefile b/test/dm/Makefile -index 3799b1ae8f..7ed00733c1 100644 ---- a/test/dm/Makefile -+++ b/test/dm/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0+ - # - # Copyright (c) 2013 Google, Inc --# Copyright 2023 Arm Limited and/or its affiliates -+# Copyright 2022-2023 Arm Limited and/or its affiliates - - obj-$(CONFIG_UT_DM) += test-dm.o - -@@ -92,6 +92,7 @@ obj-$(CONFIG_POWER_DOMAIN) += power-domain.o - obj-$(CONFIG_ACPI_PMC) += pmc.o - obj-$(CONFIG_DM_PMIC) += pmic.o - obj-$(CONFIG_DM_PWM) += pwm.o -+obj-$(CONFIG_ARM_FFA_TRANSPORT) += ffa.o - obj-$(CONFIG_QFW) += qfw.o - obj-$(CONFIG_RAM) += ram.o - obj-y += regmap.o -diff --git a/test/dm/ffa.c b/test/dm/ffa.c -new file mode 100644 -index 0000000000..6912666bb4 ---- /dev/null -+++ b/test/dm/ffa.c -@@ -0,0 +1,261 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Functional tests for UCLASS_FFA class -+ * -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Functional tests for the UCLASS_FFA */ -+ -+static int check_fwk_version(struct ffa_priv *uc_priv, struct unit_test_state *uts) -+{ -+ struct ffa_sandbox_data func_data; -+ u32 fwk_version = 0; -+ -+ func_data.data0 = &fwk_version; -+ func_data.data0_size = sizeof(fwk_version); -+ ut_assertok(sandbox_query_ffa_emul_state(FFA_VERSION, &func_data)); -+ ut_asserteq(uc_priv->fwk_version, fwk_version); -+ -+ return 0; -+} -+ -+static int check_endpoint_id(struct ffa_priv *uc_priv, struct unit_test_state *uts) -+{ -+ ut_asserteq(0, uc_priv->id); -+ -+ return 0; -+} -+ -+static int check_rxtxbuf(struct ffa_priv *uc_priv, struct unit_test_state *uts) -+{ -+ ut_assertnonnull(uc_priv->pair.rxbuf); -+ ut_assertnonnull(uc_priv->pair.txbuf); -+ -+ return 0; -+} -+ -+static int check_features(struct ffa_priv *uc_priv, struct unit_test_state *uts) -+{ -+ ut_assert(uc_priv->pair.rxtx_min_pages == RXTX_4K || -+ uc_priv->pair.rxtx_min_pages == RXTX_16K || -+ uc_priv->pair.rxtx_min_pages == RXTX_64K); -+ -+ return 0; -+} -+ -+static int check_rxbuf_mapped_flag(u32 queried_func_id, -+ u8 rxbuf_mapped, -+ struct unit_test_state *uts) -+{ -+ switch (queried_func_id) { -+ case FFA_RXTX_MAP: -+ ut_asserteq(1, rxbuf_mapped); -+ break; -+ case FFA_RXTX_UNMAP: -+ ut_asserteq(0, rxbuf_mapped); -+ break; -+ default: -+ ut_assert(false); -+ } -+ -+ return 0; -+} -+ -+static int check_rxbuf_release_flag(u8 rxbuf_owned, struct unit_test_state *uts) -+{ -+ ut_asserteq(0, rxbuf_owned); -+ -+ return 0; -+} -+ -+static int test_ffa_msg_send_direct_req(u16 part_id, struct unit_test_state *uts) -+{ -+ struct ffa_send_direct_data msg; -+ u8 cnt; -+ struct udevice *dev; -+ -+ ut_assertok(uclass_first_device_err(UCLASS_FFA, &dev)); -+ -+ ut_assertok(ffa_sync_send_receive(dev, part_id, &msg, 1)); -+ -+ for (cnt = 0; cnt < sizeof(struct ffa_send_direct_data) / sizeof(u64); cnt++) -+ ut_asserteq_64(-1UL, ((u64 *)&msg)[cnt]); -+ -+ return 0; -+} -+ -+static int test_partitions_and_comms(const char *service_uuid, -+ struct unit_test_state *uts) -+{ -+ struct ffa_partition_desc *descs; -+ u32 count, i, j, valid_sps = 0; -+ struct udevice *dev; -+ struct ffa_sandbox_data func_data; -+ struct ffa_partitions *partitions; -+ -+ ut_assertok(uclass_first_device_err(UCLASS_FFA, &dev)); -+ -+ /* Get from the driver the count and information of the SPs matching the UUID */ -+ ut_assertok(ffa_partition_info_get(dev, service_uuid, &count, &descs)); -+ -+ /* Make sure the count is correct */ -+ ut_asserteq(SANDBOX_SP_COUNT_PER_VALID_SERVICE, count); -+ -+ /* SPs found , verify the partitions information */ -+ -+ func_data.data0 = &partitions; -+ func_data.data0_size = sizeof(struct ffa_partitions *); -+ ut_assertok(sandbox_query_ffa_emul_state(FFA_PARTITION_INFO_GET, &func_data)); -+ -+ for (i = 0; i < count ; i++) { -+ for (j = 0; -+ j < partitions->count; -+ j++) { -+ if (descs[i].info.id == -+ partitions->descs[j].info.id) { -+ valid_sps++; -+ ut_asserteq_mem(&descs[i], -+ &partitions->descs[j], -+ sizeof(struct ffa_partition_desc)); -+ /* Send and receive data from the current partition */ -+ test_ffa_msg_send_direct_req(descs[i].info.id, uts); -+ } -+ } -+ } -+ -+ /* Verify expected partitions found in the emulated secure world */ -+ ut_asserteq(SANDBOX_SP_COUNT_PER_VALID_SERVICE, valid_sps); -+ -+ return 0; -+} -+ -+static int dm_test_ffa_ack(struct unit_test_state *uts) -+{ -+ struct ffa_priv *uc_priv; -+ struct ffa_sandbox_data func_data; -+ u8 rxbuf_flag = 0; -+ const char *svc1_uuid = SANDBOX_SERVICE1_UUID; -+ const char *svc2_uuid = SANDBOX_SERVICE2_UUID; -+ struct udevice *dev; -+ -+ /* Test probing the sandbox FF-A bus */ -+ ut_assertok(uclass_first_device_err(UCLASS_FFA, &dev)); -+ -+ /* Get a pointer to the sandbox FF-A bus private data */ -+ uc_priv = dev_get_uclass_priv(dev); -+ -+ /* Make sure the private data pointer is retrieved */ -+ ut_assertnonnull(uc_priv); -+ -+ /* Test FFA_VERSION */ -+ check_fwk_version(uc_priv, uts); -+ -+ /* Test FFA_ID_GET */ -+ check_endpoint_id(uc_priv, uts); -+ -+ /* Test FFA_FEATURES */ -+ check_features(uc_priv, uts); -+ -+ /* Test RX/TX buffers */ -+ check_rxtxbuf(uc_priv, uts); -+ -+ /* Test FFA_RXTX_MAP */ -+ func_data.data0 = &rxbuf_flag; -+ func_data.data0_size = sizeof(rxbuf_flag); -+ -+ rxbuf_flag = 0; -+ sandbox_query_ffa_emul_state(FFA_RXTX_MAP, &func_data); -+ check_rxbuf_mapped_flag(FFA_RXTX_MAP, rxbuf_flag, uts); -+ -+ /* FFA_PARTITION_INFO_GET / FFA_MSG_SEND_DIRECT_REQ */ -+ test_partitions_and_comms(svc1_uuid, uts); -+ -+ /* Test FFA_RX_RELEASE */ -+ rxbuf_flag = 1; -+ sandbox_query_ffa_emul_state(FFA_RX_RELEASE, &func_data); -+ check_rxbuf_release_flag(rxbuf_flag, uts); -+ -+ /* FFA_PARTITION_INFO_GET / FFA_MSG_SEND_DIRECT_REQ */ -+ test_partitions_and_comms(svc2_uuid, uts); -+ -+ /* Test FFA_RX_RELEASE */ -+ rxbuf_flag = 1; -+ ut_assertok(sandbox_query_ffa_emul_state(FFA_RX_RELEASE, &func_data)); -+ check_rxbuf_release_flag(rxbuf_flag, uts); -+ -+ return 0; -+} -+ -+DM_TEST(dm_test_ffa_ack, UT_TESTF_SCAN_FDT | UT_TESTF_CONSOLE_REC); -+ -+static int dm_test_ffa_nack(struct unit_test_state *uts) -+{ -+ struct ffa_priv *uc_priv; -+ const char *valid_svc_uuid = SANDBOX_SERVICE1_UUID; -+ const char *unvalid_svc_uuid = SANDBOX_SERVICE3_UUID; -+ const char *unvalid_svc_uuid_str = SANDBOX_SERVICE4_UUID; -+ struct ffa_send_direct_data msg; -+ int ret; -+ u32 count; -+ u16 part_id = 0; -+ struct udevice *dev; -+ struct ffa_partition_desc *descs = NULL; -+ -+ /* Test probing the sandbox FF-A bus */ -+ ut_assertok(uclass_first_device_err(UCLASS_FFA, &dev)); -+ -+ /* Get a pointer to the sandbox FF-A bus private data */ -+ uc_priv = dev_get_uclass_priv(dev); -+ -+ /* Make sure the private data pointer is retrieved */ -+ ut_assertnonnull(uc_priv); -+ -+ /* Query partitions count using invalid arguments */ -+ ret = ffa_partition_info_get(dev, NULL, NULL, NULL); -+ ut_asserteq(-EINVAL, ret); -+ ret = ffa_partition_info_get(dev, unvalid_svc_uuid, NULL, NULL); -+ ut_asserteq(-EINVAL, ret); -+ ret = ffa_partition_info_get(dev, unvalid_svc_uuid, &count, NULL); -+ ut_asserteq(-EINVAL, ret); -+ -+ /* Query partitions count using an invalid UUID string */ -+ ret = ffa_partition_info_get(dev, unvalid_svc_uuid_str, &count, &descs); -+ ut_asserteq(-EINVAL, ret); -+ -+ /* Query partitions count using an invalid UUID (no matching SP) */ -+ count = 0; -+ ret = ffa_partition_info_get(dev, unvalid_svc_uuid, &count, &descs); -+ ut_asserteq(0, count); -+ -+ /* Query partitions data using a valid UUID */ -+ count = 0; -+ ut_assertok(ffa_partition_info_get(dev, valid_svc_uuid, &count, &descs)); -+ /* Make sure partitions are detected */ -+ ut_asserteq(SANDBOX_SP_COUNT_PER_VALID_SERVICE, count); -+ ut_assertnonnull(descs); -+ -+ /* Send data to an invalid partition */ -+ ret = ffa_sync_send_receive(dev, part_id, &msg, 1); -+ ut_asserteq(-EINVAL, ret); -+ -+ /* Send data to a valid partition */ -+ part_id = uc_priv->partitions.descs[0].info.id; -+ ut_assertok(ffa_sync_send_receive(dev, part_id, &msg, 1)); -+ -+ return 0; -+} -+ -+DM_TEST(dm_test_ffa_nack, UT_TESTF_SCAN_FDT | UT_TESTF_CONSOLE_REC); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-sandbox-Add-FFA_MEM_SHARE-tests.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-sandbox-Add-FFA_MEM_SHARE-tests.patch new file mode 100644 index 00000000..fc425125 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0007-arm_ffa-sandbox-Add-FFA_MEM_SHARE-tests.patch @@ -0,0 +1,101 @@ +From b5f99e6be813e8bba29f7379ae7395ed51a19967 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 17 Oct 2024 15:14:10 +0100 +Subject: [PATCH 07/36] arm_ffa: sandbox: Add FFA_MEM_SHARE tests + +Add positive and negative test cases + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + test/dm/ffa.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 45 insertions(+), 1 deletion(-) + +diff --git a/test/dm/ffa.c b/test/dm/ffa.c +index 593b7177fce..59eea9a57cc 100644 +--- a/test/dm/ffa.c ++++ b/test/dm/ffa.c +@@ -2,7 +2,7 @@ + /* + * Functional tests for UCLASS_FFA class + * +- * Copyright 2022-2023 Arm Limited and/or its affiliates ++ * Copyright 2022-2023, 2025 Arm Limited and/or its affiliates + * + * Authors: + * Abdellatif El Khlifi +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -141,6 +142,43 @@ static int test_partitions_and_comms(const char *service_uuid, + return 0; + } + ++static int test_ffa_memory_share(bool test_ack, struct unit_test_state *uts) ++{ ++ struct ffa_mem_ops_args args = {0}; ++ struct ffa_mem_region_attributes attrs = {0}; ++ static u8 buf[SZ_4K]; ++ int ret; ++ struct udevice *dev; ++ ++ ut_assertok(uclass_first_device_err(UCLASS_FFA, &dev)); ++ ++ args.attrs = &attrs; ++ args.nattrs = 1; ++ args.address = buf; ++ args.pg_cnt = 1; ++ ++ if (test_ack) { ++ args.use_txbuf = true; ++ ++ ut_assertok(ffa_memory_share(dev, &args)); ++ ut_asserteq(HANDLE_LOW(args.g_handle), SANDBOX_MEM_HANDLE); ++ ut_asserteq(HANDLE_HIGH(args.g_handle), SANDBOX_MEM_HANDLE); ++ } else { ++ /* Do not use the TX buffer as a transaction buffer */ ++ args.use_txbuf = false; ++ ret = ffa_memory_share(dev, &args); ++ ut_asserteq(-EPROTONOSUPPORT, ret); ++ ++ /* No memory region address given */ ++ args.use_txbuf = true; ++ args.address = NULL; ++ ret = ffa_memory_share(dev, &args); ++ ut_asserteq(-EINVAL, ret); ++ } ++ ++ return 0; ++} ++ + static int dm_test_ffa_ack(struct unit_test_state *uts) + { + struct ffa_priv *uc_priv; +@@ -195,6 +233,9 @@ static int dm_test_ffa_ack(struct unit_test_state *uts) + ut_assertok(sandbox_query_ffa_emul_state(FFA_RX_RELEASE, &func_data)); + check_rxbuf_release_flag(rxbuf_flag, uts); + ++ /* Test FFA_MEM_SHARE */ ++ test_ffa_memory_share(true, uts); ++ + return 0; + } + DM_TEST(dm_test_ffa_ack, UTF_SCAN_FDT | UTF_CONSOLE); +@@ -253,6 +294,9 @@ static int dm_test_ffa_nack(struct unit_test_state *uts) + part_id = uc_priv->partitions.descs[0].info.id; + ut_assertok(ffa_sync_send_receive(dev, part_id, &msg, 1)); + ++ /* Test FFA_MEM_SHARE */ ++ test_ffa_memory_share(false, uts); ++ + return 0; + } + DM_TEST(dm_test_ffa_nack, UTF_SCAN_FDT | UTF_CONSOLE); +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-FF-A-v15-arm_ffa-introduce-armffa-command-Sandbox-te.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-FF-A-v15-arm_ffa-introduce-armffa-command-Sandbox-te.patch deleted file mode 100644 index a1dc18ed..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-FF-A-v15-arm_ffa-introduce-armffa-command-Sandbox-te.patch +++ /dev/null @@ -1,91 +0,0 @@ -From c95d1bd311b251e5dd6c6e53c2dc7977bdca7870 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Fri, 23 Jun 2023 13:44:10 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: introduce armffa command Sandbox test - -Add Sandbox test for the armffa command - -Signed-off-by: Abdellatif El Khlifi -Reviewed-by: Simon Glass -Cc: Tom Rini -Cc: Ilias Apalodimas -Cc: Jens Wiklander -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - MAINTAINERS | 1 + - test/cmd/Makefile | 2 ++ - test/cmd/armffa.c | 33 +++++++++++++++++++++++++++++++++ - 3 files changed, 36 insertions(+) - create mode 100644 test/cmd/armffa.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index ccd7859c88..885d91fe5c 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -276,6 +276,7 @@ F: doc/arch/arm64.ffa.rst - F: doc/usage/cmd/armffa.rst - F: drivers/firmware/arm-ffa/ - F: include/arm_ffa.h -+F: test/cmd/armffa.c - F: test/dm/ffa.c - - ARM FREESCALE IMX -diff --git a/test/cmd/Makefile b/test/cmd/Makefile -index 055adc65a2..1d1dbb4fbc 100644 ---- a/test/cmd/Makefile -+++ b/test/cmd/Makefile -@@ -1,6 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0+ - # - # Copyright (c) 2013 Google, Inc -+# Copyright 2022-2023 Arm Limited and/or its affiliates - - ifdef CONFIG_HUSH_PARSER - obj-$(CONFIG_CONSOLE_RECORD) += test_echo.o -@@ -23,6 +24,7 @@ obj-$(CONFIG_CMD_SEAMA) += seama.o - ifdef CONFIG_SANDBOX - obj-$(CONFIG_CMD_READ) += rw.o - obj-$(CONFIG_CMD_SETEXPR) += setexpr.o -+obj-$(CONFIG_ARM_FFA_TRANSPORT) += armffa.o - endif - obj-$(CONFIG_CMD_TEMPERATURE) += temperature.o - obj-$(CONFIG_CMD_WGET) += wget.o -diff --git a/test/cmd/armffa.c b/test/cmd/armffa.c -new file mode 100644 -index 0000000000..9a44a397e8 ---- /dev/null -+++ b/test/cmd/armffa.c -@@ -0,0 +1,33 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Test for armffa command -+ * -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Basic test of 'armffa' command */ -+static int dm_test_armffa_cmd(struct unit_test_state *uts) -+{ -+ /* armffa getpart */ -+ ut_assertok(run_command("armffa getpart " SANDBOX_SERVICE1_UUID, 0)); -+ -+ /* armffa ping */ -+ ut_assertok(run_commandf("armffa ping 0x%x", SANDBOX_SP1_ID)); -+ -+ /* armffa devlist */ -+ ut_assertok(run_command("armffa devlist", 0)); -+ -+ return 0; -+} -+ -+DM_TEST(dm_test_armffa_cmd, UT_TESTF_SCAN_FDT | UT_TESTF_CONSOLE_REC); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-emulation.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-emulation.patch new file mode 100644 index 00000000..6b6f100d --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0008-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-emulation.patch @@ -0,0 +1,89 @@ +From 6c37c2ef7fd844083fddc4c819f3fd37f7f6abc4 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 17 Oct 2024 15:50:02 +0100 +Subject: [PATCH 08/36] arm_ffa: sandbox: Add FFA_MEM_RECLAIM emulation + +Add FFA_MEM_RECLAIM support to the FF-A emulator + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + drivers/firmware/arm-ffa/ffa-emul-uclass.c | 42 ++++++++++++++++++++++ + drivers/firmware/arm-ffa/sandbox_ffa.c | 1 + + 2 files changed, 43 insertions(+) + +diff --git a/drivers/firmware/arm-ffa/ffa-emul-uclass.c b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +index 4918404fb6d..a630392b6d1 100644 +--- a/drivers/firmware/arm-ffa/ffa-emul-uclass.c ++++ b/drivers/firmware/arm-ffa/ffa-emul-uclass.c +@@ -603,6 +603,45 @@ static int sandbox_ffa_memory_share(struct udevice *emul, ffa_value_t *pargs, + return 0; + } + ++/** ++ * sandbox_ffa_memory_reclaim() - Emulated FFA_MEM_RECLAIM handler ++ * @emul: The sandbox FF-A emulator device ++ * @pargs: The SMC call input arguments a0-a7 ++ * @res: The SMC return data ++ * ++ * Emulate FFA_MEM_RECLAIM FF-A function. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int sandbox_ffa_memory_reclaim(struct udevice *emul, ffa_value_t *pargs, ++ ffa_value_t *res) ++{ ++ int ret; ++ ++ res->a1 = 0; ++ ++ if (pargs->a1 != SANDBOX_MEM_HANDLE || ++ pargs->a2 != SANDBOX_MEM_HANDLE) { ++ /* FFA_ERROR encoding */ ++ res->a0 = FFA_SMC_32(FFA_ERROR); ++ res->a2 = -INVALID_PARAMETERS; ++ ret = ffa_to_std_errmap[INVALID_PARAMETERS]; ++ /* x3-x7 MBZ */ ++ memset(&res->a3, 0, 5 * FFA_X_REG_SIZE_IN_BYTE); ++ ++ return ret; ++ } ++ ++ /* FFA_SUCCESS encoding */ ++ res->a0 = FFA_SMC_32(FFA_SUCCESS); ++ /* x2-x7 MBZ */ ++ memset(&res->a2, 0, 6 * FFA_X_REG_SIZE_IN_BYTE); ++ ++ return 0; ++} ++ + /** + * sandbox_query_ffa_emul_state() - Inspect the FF-A ABIs + * @queried_func_id: The FF-A function to be queried +@@ -696,6 +735,9 @@ void sandbox_arm_ffa_smccc_smc(ffa_value_t *args, ffa_value_t *res) + case FFA_SMC_32(FFA_MEM_SHARE): + ret = sandbox_ffa_memory_share(emul, args, res); + break; ++ case FFA_SMC_32(FFA_MEM_RECLAIM): ++ ret = sandbox_ffa_memory_reclaim(emul, args, res); ++ break; + default: + log_err("Undefined FF-A interface (%lx)\n", + args->a0); +diff --git a/drivers/firmware/arm-ffa/sandbox_ffa.c b/drivers/firmware/arm-ffa/sandbox_ffa.c +index 8d85e660e2b..54c81d12f92 100644 +--- a/drivers/firmware/arm-ffa/sandbox_ffa.c ++++ b/drivers/firmware/arm-ffa/sandbox_ffa.c +@@ -92,6 +92,7 @@ static const struct ffa_bus_ops sandbox_ffa_ops = { + .sync_send_receive = ffa_msg_send_direct_req_hdlr, + .rxtx_unmap = ffa_unmap_rxtx_buffers_hdlr, + .memory_share = ffa_memory_share_hdlr, ++ .memory_reclaim = ffa_memory_reclaim_hdlr, + }; + + static const struct udevice_id sandbox_ffa_id[] = { +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-FF-A-v15-arm_ffa-efi-introduce-FF-A-MM-communication.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-FF-A-v15-arm_ffa-efi-introduce-FF-A-MM-communication.patch deleted file mode 100644 index 4934a903..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-FF-A-v15-arm_ffa-efi-introduce-FF-A-MM-communication.patch +++ /dev/null @@ -1,446 +0,0 @@ -From c40964dc6ba6baea0adf8f384e1e57fcd5ca18b0 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 15 Aug 2022 15:12:49 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: efi: introduce FF-A MM communication - -Add MM communication support using FF-A transport - -This feature allows accessing MM partitions services through -EFI MM communication protocol. MM partitions such as StandAlonneMM -or smm-gateway secure partitions which reside in secure world. - -An MM shared buffer and a door bell event are used to exchange -the data. - -The data is used by EFI services such as GetVariable()/SetVariable() -and copied from the communication buffer to the MM shared buffer. - -The secure partition is notified about availability of data in the -MM shared buffer by an FF-A message (door bell). - -On such event, MM SP can read the data and updates the MM shared -buffer with the response data. - -The response data is copied back to the communication buffer and -consumed by the EFI subsystem. - -MM communication protocol supports FF-A 64-bit direct messaging. - -Signed-off-by: Abdellatif El Khlifi -Tested-by: Gowtham Suresh Kumar -Reviewed-by: Simon Glass -Cc: Tom Rini -Cc: Ilias Apalodimas -Cc: Jens Wiklander -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - include/mm_communication.h | 13 ++ - lib/efi_loader/Kconfig | 46 +++++- - lib/efi_loader/efi_variable_tee.c | 257 +++++++++++++++++++++++++++++- - 3 files changed, 309 insertions(+), 7 deletions(-) - -diff --git a/include/mm_communication.h b/include/mm_communication.h -index e65fbde60d..f17847583b 100644 ---- a/include/mm_communication.h -+++ b/include/mm_communication.h -@@ -6,6 +6,9 @@ - * Copyright (c) 2017, Intel Corporation. All rights reserved. - * Copyright (C) 2020 Linaro Ltd. - * Copyright (C) 2020 Linaro Ltd. -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * Authors: -+ * Abdellatif El Khlifi - */ - - #ifndef _MM_COMMUNICATION_H_ -@@ -13,6 +16,9 @@ - - #include - -+/* MM service UUID string (big-endian format). This UUID is common across all MM SPs */ -+#define MM_SP_UUID "33d532ed-e699-0942-c09c-a798d9cd722d" -+ - /* - * Interface to the pseudo Trusted Application (TA), which provides a - * communication channel with the Standalone MM (Management Mode) -@@ -248,4 +254,11 @@ struct smm_variable_var_check_property { - u16 name[]; - }; - -+/* supported MM transports */ -+enum mm_comms_select { -+ MM_COMMS_UNDEFINED, -+ MM_COMMS_FFA, -+ MM_COMMS_OPTEE -+}; -+ - #endif /* _MM_COMMUNICATION_H_ */ -diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig -index c5835e6ef6..553e6a30a2 100644 ---- a/lib/efi_loader/Kconfig -+++ b/lib/efi_loader/Kconfig -@@ -55,13 +55,55 @@ config EFI_VARIABLE_FILE_STORE - stored as file /ubootefi.var on the EFI system partition. - - config EFI_MM_COMM_TEE -- bool "UEFI variables storage service via OP-TEE" -- depends on OPTEE -+ bool "UEFI variables storage service via the trusted world" -+ select ARM_FFA_TRANSPORT -+ select TEE -+ select OPTEE - help -+ Allowing access to the MM SP services (SPs such as StandAlonneMM, smm-gateway). -+ When using the u-boot OP-TEE driver, StandAlonneMM is supported. -+ When using the u-boot FF-A driver any MM SP is supported. -+ - If OP-TEE is present and running StandAloneMM, dispatch all UEFI - variable related operations to that. The application will verify, - authenticate and store the variables on an RPMB. - -+ When ARM_FFA_TRANSPORT is used, dispatch all UEFI variable related -+ operations to the MM SP running in the secure world. -+ A door bell mechanism is used to notify the SP when there is data in the shared -+ MM buffer. The data is copied by u-boot to the shared buffer before issuing -+ the door bell event. -+ -+config FFA_SHARED_MM_BUF_SIZE -+ int "Memory size of the shared MM communication buffer" -+ default 0 -+ depends on EFI_MM_COMM_TEE -+ help -+ This defines the size in bytes of the memory area reserved for the shared -+ buffer used for communication between the MM feature in U-Boot and -+ the MM SP in secure world. -+ The size of the memory region must be a multiple of the size of the maximum -+ translation granule size that is specified in the ID_AA64MMFR0_EL1 System register. -+ It is assumed that the MM SP knows the size of the shared MM communication buffer. -+ -+config FFA_SHARED_MM_BUF_OFFSET -+ int "Data offset in the shared MM communication buffer" -+ default 0 -+ depends on EFI_MM_COMM_TEE -+ help -+ This defines the offset in bytes of the data read or written to in the shared -+ buffer by the MM SP. -+ -+config FFA_SHARED_MM_BUF_ADDR -+ hex "Define the address of the shared MM communication buffer" -+ default 0x0 -+ depends on EFI_MM_COMM_TEE -+ help -+ This defines the address of the shared MM communication buffer -+ used for communication between the MM feature in U-Boot and -+ the MM SP in secure world. -+ It is assumed that the MM SP knows the address of the shared MM communication buffer. -+ - config EFI_VARIABLE_NO_STORE - bool "Don't persist non-volatile UEFI variables" - help -diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c -index dfef18435d..5137b871ea 100644 ---- a/lib/efi_loader/efi_variable_tee.c -+++ b/lib/efi_loader/efi_variable_tee.c -@@ -4,17 +4,34 @@ - * - * Copyright (C) 2019 Linaro Ltd. - * Copyright (C) 2019 Linaro Ltd. -+ * Copyright 2022-2023 Arm Limited and/or its affiliates -+ * -+ * Authors: -+ * Abdellatif El Khlifi - */ - - #include -+#include -+#include -+#include - #include - #include - #include - #include --#include - #include -+#include - #include -+#include -+ -+/* MM return codes */ -+#define MM_SUCCESS (0) -+#define MM_NOT_SUPPORTED (-1) -+#define MM_INVALID_PARAMETER (-2) -+#define MM_DENIED (-3) -+#define MM_NO_MEMORY (-5) - -+static const char *mm_sp_svc_uuid = MM_SP_UUID; -+static u16 mm_sp_id; - extern struct efi_var_file __efi_runtime_data *efi_var_buf; - static efi_uintn_t max_buffer_size; /* comm + var + func + data */ - static efi_uintn_t max_payload_size; /* func + data */ -@@ -145,16 +162,241 @@ static efi_status_t optee_mm_communicate(void *comm_buf, ulong dsize) - } - - /** -- * mm_communicate() - Adjust the cmonnucation buffer to StandAlonneMM and send -+ * ffa_notify_mm_sp() - Announce there is data in the shared buffer -+ * -+ * Notify the MM partition in the trusted world that -+ * data is available in the shared buffer. -+ * This is a blocking call during which trusted world has exclusive access -+ * to the MM shared buffer. -+ * -+ * Return: -+ * -+ * 0 on success -+ */ -+static int ffa_notify_mm_sp(void) -+{ -+ struct ffa_send_direct_data msg = {0}; -+ int ret; -+ int sp_event_ret; -+ struct udevice *dev; -+ -+ ret = uclass_first_device_err(UCLASS_FFA, &dev); -+ if (ret) { -+ log_err("EFI: Cannot find FF-A bus device, notify MM SP failure\n"); -+ return ret; -+ } -+ -+ msg.data0 = CONFIG_FFA_SHARED_MM_BUF_OFFSET; /* x3 */ -+ -+ ret = ffa_sync_send_receive(dev, mm_sp_id, &msg, 1); -+ if (ret) -+ return ret; -+ -+ sp_event_ret = msg.data0; /* x3 */ -+ -+ switch (sp_event_ret) { -+ case MM_SUCCESS: -+ ret = 0; -+ break; -+ case MM_NOT_SUPPORTED: -+ ret = -EINVAL; -+ break; -+ case MM_INVALID_PARAMETER: -+ ret = -EPERM; -+ break; -+ case MM_DENIED: -+ ret = -EACCES; -+ break; -+ case MM_NO_MEMORY: -+ ret = -EBUSY; -+ break; -+ default: -+ ret = -EACCES; -+ } -+ -+ return ret; -+} -+ -+/** -+ * ffa_discover_mm_sp_id() - Query the MM partition ID -+ * -+ * Use the FF-A driver to get the MM partition ID. -+ * If multiple partitions are found, use the first one. -+ * This is a boot time function. -+ * -+ * Return: -+ * -+ * 0 on success -+ */ -+static int ffa_discover_mm_sp_id(void) -+{ -+ u32 count = 0; -+ int ret; -+ struct ffa_partition_desc *descs; -+ struct udevice *dev; -+ -+ ret = uclass_first_device_err(UCLASS_FFA, &dev); -+ if (ret) { -+ log_err("EFI: Cannot find FF-A bus device, MM SP discovery failure\n"); -+ return ret; -+ } -+ -+ /* Ask the driver to fill the buffer with the SPs info */ -+ ret = ffa_partition_info_get(dev, mm_sp_svc_uuid, &count, &descs); -+ if (ret) { -+ log_err("EFI: Failure in querying SPs info (%d), MM SP discovery failure\n", ret); -+ return ret; -+ } -+ -+ /* MM SPs found , use the first one */ -+ -+ mm_sp_id = descs[0].info.id; -+ -+ log_info("EFI: MM partition ID 0x%x\n", mm_sp_id); -+ -+ return 0; -+} -+ -+/** -+ * ffa_mm_communicate() - Exchange EFI services data with the MM partition using FF-A -+ * @comm_buf: locally allocated communication buffer used for rx/tx -+ * @dsize: communication buffer size -+ * -+ * Issue a door bell event to notify the MM partition (SP) running in OP-TEE -+ * that there is data to read from the shared buffer. -+ * Communication with the MM SP is performed using FF-A transport. -+ * On the event, MM SP can read the data from the buffer and -+ * update the MM shared buffer with response data. -+ * The response data is copied back to the communication buffer. -+ * -+ * Return: -+ * -+ * EFI status code -+ */ -+static efi_status_t ffa_mm_communicate(void *comm_buf, ulong comm_buf_size) -+{ -+ ulong tx_data_size; -+ int ffa_ret; -+ efi_status_t efi_ret; -+ struct efi_mm_communicate_header *mm_hdr; -+ void *virt_shared_buf; -+ -+ if (!comm_buf) -+ return EFI_INVALID_PARAMETER; -+ -+ /* Discover MM partition ID at boot time */ -+ if (!mm_sp_id && ffa_discover_mm_sp_id()) { -+ log_err("EFI: Failure to discover MM SP ID at boot time, FF-A MM comms failure\n"); -+ return EFI_UNSUPPORTED; -+ } -+ -+ mm_hdr = (struct efi_mm_communicate_header *)comm_buf; -+ tx_data_size = mm_hdr->message_len + sizeof(efi_guid_t) + sizeof(size_t); -+ -+ if (comm_buf_size != tx_data_size || tx_data_size > CONFIG_FFA_SHARED_MM_BUF_SIZE) -+ return EFI_INVALID_PARAMETER; -+ -+ /* Copy the data to the shared buffer */ -+ -+ virt_shared_buf = map_sysmem((phys_addr_t)CONFIG_FFA_SHARED_MM_BUF_ADDR, 0); -+ memcpy(virt_shared_buf, comm_buf, tx_data_size); -+ -+ /* -+ * The secure world might have cache disabled for -+ * the device region used for shared buffer (which is the case for Optee). -+ * In this case, the secure world reads the data from DRAM. -+ * Let's flush the cache so the DRAM is updated with the latest data. -+ */ -+#ifdef CONFIG_ARM64 -+ invalidate_dcache_all(); -+#endif -+ -+ /* Announce there is data in the shared buffer */ -+ -+ ffa_ret = ffa_notify_mm_sp(); -+ -+ switch (ffa_ret) { -+ case 0: { -+ ulong rx_data_size; -+ /* Copy the MM SP response from the shared buffer to the communication buffer */ -+ rx_data_size = ((struct efi_mm_communicate_header *)virt_shared_buf)->message_len + -+ sizeof(efi_guid_t) + -+ sizeof(size_t); -+ -+ if (rx_data_size > comm_buf_size) { -+ efi_ret = EFI_OUT_OF_RESOURCES; -+ break; -+ } -+ -+ memcpy(comm_buf, virt_shared_buf, rx_data_size); -+ efi_ret = EFI_SUCCESS; -+ break; -+ } -+ case -EINVAL: -+ efi_ret = EFI_DEVICE_ERROR; -+ break; -+ case -EPERM: -+ efi_ret = EFI_INVALID_PARAMETER; -+ break; -+ case -EACCES: -+ efi_ret = EFI_ACCESS_DENIED; -+ break; -+ case -EBUSY: -+ efi_ret = EFI_OUT_OF_RESOURCES; -+ break; -+ default: -+ efi_ret = EFI_ACCESS_DENIED; -+ } -+ -+ unmap_sysmem(virt_shared_buf); -+ return efi_ret; -+} -+ -+/** -+ * get_mm_comms() - detect the available MM transport -+ * -+ * Make sure the FF-A bus is probed successfully -+ * which means FF-A communication with secure world works and ready -+ * for use. -+ * -+ * If FF-A bus is not ready, use OPTEE comms. -+ * -+ * Return: -+ * -+ * MM_COMMS_FFA or MM_COMMS_OPTEE -+ */ -+static enum mm_comms_select get_mm_comms(void) -+{ -+ struct udevice *dev; -+ int ret; -+ -+ ret = uclass_first_device_err(UCLASS_FFA, &dev); -+ if (ret) { -+ log_err("EFI: Cannot find FF-A bus device, trying Optee comms\n"); -+ return MM_COMMS_OPTEE; -+ } -+ -+ return MM_COMMS_FFA; -+} -+ -+/** -+ * mm_communicate() - Adjust the communication buffer to the MM SP and send - * it to OP-TEE - * -- * @comm_buf: locally allocted communcation buffer -+ * @comm_buf: locally allocated communication buffer - * @dsize: buffer size -+ * -+ * The SP (also called partition) can be any MM SP such as StandAlonneMM or smm-gateway. -+ * The comm_buf format is the same for both partitions. -+ * When using the u-boot OP-TEE driver, StandAlonneMM is supported. -+ * When using the u-boot FF-A driver, any MM SP is supported. -+ * - * Return: status code - */ - static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize) - { - efi_status_t ret; -+ enum mm_comms_select mm_comms; - struct efi_mm_communicate_header *mm_hdr; - struct smm_variable_communicate_header *var_hdr; - -@@ -162,7 +404,12 @@ static efi_status_t mm_communicate(u8 *comm_buf, efi_uintn_t dsize) - mm_hdr = (struct efi_mm_communicate_header *)comm_buf; - var_hdr = (struct smm_variable_communicate_header *)mm_hdr->data; - -- ret = optee_mm_communicate(comm_buf, dsize); -+ mm_comms = get_mm_comms(); -+ if (mm_comms == MM_COMMS_FFA) -+ ret = ffa_mm_communicate(comm_buf, dsize); -+ else -+ ret = optee_mm_communicate(comm_buf, dsize); -+ - if (ret != EFI_SUCCESS) { - log_err("%s failed!\n", __func__); - return ret; -@@ -697,7 +944,7 @@ void efi_variables_boot_exit_notify(void) - ret = EFI_NOT_FOUND; - - if (ret != EFI_SUCCESS) -- log_err("Unable to notify StMM for ExitBootServices\n"); -+ log_err("Unable to notify the MM partition for ExitBootServices\n"); - free(comm_buf); - - /* diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-tests.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-tests.patch new file mode 100644 index 00000000..01f63df4 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0009-arm_ffa-sandbox-Add-FFA_MEM_RECLAIM-tests.patch @@ -0,0 +1,68 @@ +From a1242cf231ef4d0fc1da36420e2db8cb12f7aa26 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 17 Oct 2024 15:50:21 +0100 +Subject: [PATCH 09/36] arm_ffa: sandbox: Add FFA_MEM_RECLAIM tests + +Add FFA_MEM_RECLAIM positive and negative test cases + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + test/dm/ffa.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +diff --git a/test/dm/ffa.c b/test/dm/ffa.c +index 59eea9a57cc..f4a6716cfd8 100644 +--- a/test/dm/ffa.c ++++ b/test/dm/ffa.c +@@ -179,6 +179,27 @@ static int test_ffa_memory_share(bool test_ack, struct unit_test_state *uts) + return 0; + } + ++static int test_ffa_memory_reclaim(bool test_ack, struct unit_test_state *uts) ++{ ++ int ret; ++ u64 g_handle; ++ struct udevice *dev; ++ ++ ut_assertok(uclass_first_device_err(UCLASS_FFA, &dev)); ++ ++ if (test_ack) { ++ g_handle = PACK_HANDLE(SANDBOX_MEM_HANDLE, SANDBOX_MEM_HANDLE); ++ ut_assertok(ffa_memory_reclaim(dev, g_handle, 0)); ++ } else { ++ /* Provide a wrong handle */ ++ g_handle = PACK_HANDLE(SANDBOX_MEM_HANDLE, 0); ++ ret = ffa_memory_reclaim(dev, g_handle, 0); ++ ut_asserteq(-EINVAL, ret); ++ } ++ ++ return 0; ++} ++ + static int dm_test_ffa_ack(struct unit_test_state *uts) + { + struct ffa_priv *uc_priv; +@@ -236,6 +257,9 @@ static int dm_test_ffa_ack(struct unit_test_state *uts) + /* Test FFA_MEM_SHARE */ + test_ffa_memory_share(true, uts); + ++ /* Test FFA_MEM_RECLAIM */ ++ test_ffa_memory_reclaim(true, uts); ++ + return 0; + } + DM_TEST(dm_test_ffa_ack, UTF_SCAN_FDT | UTF_CONSOLE); +@@ -297,6 +321,9 @@ static int dm_test_ffa_nack(struct unit_test_state *uts) + /* Test FFA_MEM_SHARE */ + test_ffa_memory_share(false, uts); + ++ /* Test FFA_MEM_RECLAIM */ ++ test_ffa_memory_reclaim(false, uts); ++ + return 0; + } + DM_TEST(dm_test_ffa_nack, UTF_SCAN_FDT | UTF_CONSOLE); +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-FF-A-v15-arm_ffa-efi-corstone1000-enable-MM-communic.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-FF-A-v15-arm_ffa-efi-corstone1000-enable-MM-communic.patch deleted file mode 100644 index b01d669e..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-FF-A-v15-arm_ffa-efi-corstone1000-enable-MM-communic.patch +++ /dev/null @@ -1,29 +0,0 @@ -From c27f5fe90433f8e1b6eaa84857171ea7fc26593a Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 17 Jul 2023 15:23:33 +0100 -Subject: [PATCH] FF-A v15: arm_ffa: efi: corstone1000: enable MM communication - -turn on EFI MM communication - -On corstone1000 platform MM communication between u-boot -and the secure world (Optee) is done using the FF-A bus. - -Signed-off-by: Abdellatif El Khlifi -Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20230713132847.176000-1-abdellatif.elkhlifi@arm.com/] ---- - configs/corstone1000_defconfig | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 2d391048cd..ee5481b63c 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -53,3 +53,8 @@ CONFIG_DM_SERIAL=y - CONFIG_USB=y - CONFIG_USB_ISP1760=y - CONFIG_ERRNO_STR=y -+CONFIG_NVMXIP_QSPI=y -+CONFIG_EFI_MM_COMM_TEE=y -+CONFIG_FFA_SHARED_MM_BUF_SIZE=4096 -+CONFIG_FFA_SHARED_MM_BUF_OFFSET=0 -+CONFIG_FFA_SHARED_MM_BUF_ADDR=0x02000000 diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-fwu_arm_psa-Initialize-the-update-agent.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-fwu_arm_psa-Initialize-the-update-agent.patch new file mode 100644 index 00000000..e81ff633 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0010-fwu_arm_psa-Initialize-the-update-agent.patch @@ -0,0 +1,439 @@ +From 716b0084511392055c3be8b0bb5f4f90f7c4fcd2 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Wed, 23 Oct 2024 17:45:32 +0100 +Subject: [PATCH 10/36] fwu_arm_psa: Initialize the update agent + +Add the initializations required for the update agent + +The aim is adding support for the Trusted Services (aka TS) +Firmware Update API. This API allows the interaction with +the FWU services provided by Secure world. +At U-Boot level, we provide the PSA FWU ABI built on top of the +FF-A bus to invoke the FWU services in Secure world. + +The design is based on the Platform Security Firmware Update +for the A-profile Arm Architecture specification [1]. + +In our design, the Secure world is the update agent. U-Boot +is the update client. + +The update agent is initialized as follows: + +- Trusted Services FWU SP discovery +- Setting up the shared buffer between the Normal world (U-Boot) and + Secure world (Trusted Services) +- Notifying FWU SP about the shared buffer + +[1]: DEN0118, 1.0 A: https://developer.arm.com/documentation/den0118/latest/ + +Signed-off-by: Abdellatif El Khlifi +Signed-off-by: Davidson kumaresan +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + MAINTAINERS | 7 + + include/fwu_arm_psa.h | 58 ++++++++ + lib/fwu_updates/Kconfig | 18 +++ + lib/fwu_updates/Makefile | 1 + + lib/fwu_updates/fwu_arm_psa.c | 271 ++++++++++++++++++++++++++++++++++ + 5 files changed, 355 insertions(+) + create mode 100644 include/fwu_arm_psa.h + create mode 100644 lib/fwu_updates/fwu_arm_psa.c + +diff --git a/MAINTAINERS b/MAINTAINERS +index 042d3f6160a..e7ed894441e 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -1210,6 +1210,13 @@ T: git https://source.denx.de/u-boot/custodians/u-boot-fsl-qoriq.git + F: drivers/watchdog/sp805_wdt.c + F: drivers/watchdog/sbsa_gwdt.c + ++FWU ARM PSA ++M: Abdellatif El Khlifi ++M: Davidson kumaresan ++S: Maintained ++F: include/fwu_arm_psa.h ++F: lib/fwu_updates/fwu_arm_psa.c ++ + FWU Multi Bank Update + M: Sughosh Ganu + S: Maintained +diff --git a/include/fwu_arm_psa.h b/include/fwu_arm_psa.h +new file mode 100644 +index 00000000000..f1d42f9ef24 +--- /dev/null ++++ b/include/fwu_arm_psa.h +@@ -0,0 +1,58 @@ ++/* SPDX-License-Identifier: GPL-2.0+ */ ++/* ++ * Copyright 2025 Arm Limited and/or its affiliates ++ * ++ * Authors: ++ * Abdellatif El Khlifi ++ * Davidson kumaresan ++ */ ++ ++#ifndef __FWU_ARM_PSA_H ++#define __FWU_ARM_PSA_H ++ ++#include ++#include ++ ++#define FWU_BUFFER_PAGES (1024) ++ ++/* 4 MB buffer shared with secure world */ ++#define FWU_BUFFER_SIZE (FWU_BUFFER_PAGES * EFI_PAGE_SIZE) ++ ++/* TS UUID string for detecting all SPs (in big-endian format) */ ++#define ALL_TS_SP_UUID "d776cdbd-5e82-5147-3b96-ac4349f8d486" ++/* In little-endian equivalent to: bdcd76d7-825e-4751-963b-86d4f84943ac */ ++ ++/* TS FWU service UUID string (in big-endian format) */ ++#define TS_FWU_SERVICE_UUID "38a82368-061b-0e47-7497-fd53fb8bce0c" ++/* In little-endian equivalent to: 6823a838-1b06-470e-9774-0cce8bfb53fd */ ++ ++#define TS_RPC_MEM_RETRIEVE (0xff0001) ++#define TS_RPC_SERVICE_INFO_GET (0xff0003) ++#define RPC_SUCCESS (0) ++ ++#define SVC_IFACE_ID_GET_MASK GENMASK(7, 0) ++#define GET_SVC_IFACE_ID(x) \ ++ ((u8)(FIELD_GET(SVC_IFACE_ID_GET_MASK, (x)))) ++ ++#define HANDLE_MSW_MASK GENMASK(63, 32) ++#define HANDLE_LSW_MASK GENMASK(31, 0) ++#define GET_FWU_BUF_MSW(x) \ ++ ((u32)(FIELD_GET(HANDLE_MSW_MASK, (x)))) ++#define GET_FWU_BUF_LSW(x) \ ++ ((u32)(FIELD_GET(HANDLE_LSW_MASK, (x)))) ++ ++/** ++ * fwu_agent_init() - Setup the FWU agent ++ * ++ * Perform the initializations required to communicate ++ * and use the FWU agent in secure world. ++ * The frontend of the FWU agent is the Trusted Services (aka TS) ++ * FWU SP (aka Secure Partition). ++ * ++ * Return: ++ * ++ * 0 is returned on success. Otherwise, failure ++ */ ++int fwu_agent_init(void); ++ ++#endif +diff --git a/lib/fwu_updates/Kconfig b/lib/fwu_updates/Kconfig +index a722107c129..cdc96109f0a 100644 +--- a/lib/fwu_updates/Kconfig ++++ b/lib/fwu_updates/Kconfig +@@ -46,4 +46,22 @@ config FWU_MDATA_V2 + metadata structure. This option enables support for FWU + Metadata version 2 access. + ++config FWU_ARM_PSA ++ bool "FMP driver for Arm PSA FWU specification" ++ depends on EFI_CAPSULE_FIRMWARE_MANAGEMENT && \ ++ EFI_CAPSULE_FIRMWARE_RAW && \ ++ ARM_FFA_TRANSPORT && (ARM64 || SANDBOX) ++ select EFI_CAPSULE_FIRMWARE ++ help ++ Select this option if you want to enable firmware management protocol ++ driver that supports the Arm PSA firmware update specification as ++ mentioned in https://developer.arm.com/documentation/den0118/a/ ++ ++config FWU_BUFFER_PAGES ++ int "Number of 4KB pages in the FWU shared buffer" ++ depends on FWU_ARM_PSA ++ default 1024 ++ help ++ This defines the size of the FWU shared buffer used for communication. ++ + endif +diff --git a/lib/fwu_updates/Makefile b/lib/fwu_updates/Makefile +index 3681bef46cd..498e2411091 100644 +--- a/lib/fwu_updates/Makefile ++++ b/lib/fwu_updates/Makefile +@@ -8,3 +8,4 @@ obj-$(CONFIG_FWU_MDATA_GPT_BLK) += fwu_gpt.o + obj-$(CONFIG_FWU_MDATA_MTD) += fwu_mtd.o + obj-$(CONFIG_FWU_MDATA_V1) += fwu_v1.o + obj-$(CONFIG_FWU_MDATA_V2) += fwu_v2.o ++obj-$(CONFIG_FWU_ARM_PSA) += fwu_arm_psa.o +diff --git a/lib/fwu_updates/fwu_arm_psa.c b/lib/fwu_updates/fwu_arm_psa.c +new file mode 100644 +index 00000000000..4a01c5ac672 +--- /dev/null ++++ b/lib/fwu_updates/fwu_arm_psa.c +@@ -0,0 +1,271 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Copyright 2025 Arm Limited and/or its affiliates ++ * ++ * Authors: ++ * Abdellatif El Khlifi ++ * Davidson kumaresan ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static void *g_fwu_buf; ++static u64 g_fwu_buf_handle; ++static u16 g_fwu_sp_id; ++static struct udevice *g_dev; ++static u16 g_svc_interface_id; ++static bool g_fwu_initialized; ++ ++/** ++ * fwu_discover_ts_sp_id() - Query the FWU partition ID ++ * ++ * Use the FF-A driver to get the FWU partition ID. ++ * If multiple partitions are found, use the first one. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++static int fwu_discover_ts_sp_id(void) ++{ ++ u32 count = 0; ++ int ret; ++ u32 i; ++ struct ffa_partition_desc *descs = NULL; ++ struct ffa_send_direct_data msg; ++ struct ffa_partition_uuid fwu_service_uuid = {0}; ++ ++ /* Ask the driver to fill the buffer with the SPs info */ ++ ++ ret = ffa_partition_info_get(g_dev, ALL_TS_SP_UUID, &count, &descs); ++ if (ret) { ++ log_err("FWU: Failure in querying partitions (err: %d)\n", ret); ++ return ret; ++ } ++ ++ if (!count) { ++ log_err("FWU: No Trusted Service partition found\n"); ++ return -ENODATA; ++ } ++ ++ if (!descs) { ++ log_err("FWU: No partitions descriptors filled\n"); ++ return -EINVAL; ++ } ++ ++ if (uuid_str_to_le_bin(TS_FWU_SERVICE_UUID, ++ (unsigned char *)&fwu_service_uuid)) { ++ log_err("FWU: invalid FWU SP UUID\n"); ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < count ; i++) { ++ log_debug("FWU: Enquiring service from SP 0x%x\n", ++ descs[i].info.id); ++ ++ msg.data0 = TS_RPC_SERVICE_INFO_GET; ++ msg.data1 = fwu_service_uuid.a1; ++ msg.data2 = fwu_service_uuid.a2; ++ msg.data3 = fwu_service_uuid.a3; ++ msg.data4 = fwu_service_uuid.a4; ++ ++ ret = ffa_sync_send_receive(g_dev, descs[i].info.id, &msg, 0); ++ if (ret) { ++ log_err("FWU: FF-A error for SERVICE_INFO_GET (err: %d)\n", ++ ret); ++ return ret; ++ } ++ ++ if (msg.data0 != TS_RPC_SERVICE_INFO_GET) { ++ log_err("FWU: Wrong SERVICE_INFO_GET return: (%lx)\n", ++ msg.data0); ++ continue; ++ } ++ ++ if (msg.data1 == RPC_SUCCESS) { ++ g_svc_interface_id = GET_SVC_IFACE_ID(msg.data2); ++ g_fwu_sp_id = descs[i].info.id; ++ log_debug("FWU: Service interface ID 0x%x found\n", ++ g_svc_interface_id); ++ return 0; ++ } ++ ++ log_debug("FWU: service not found\n"); ++ } ++ ++ log_err("FWU: No SP provides the service\n"); ++ ++ return -ENOENT; ++} ++ ++/** ++ * fwu_shared_buf_reclaim() - Reclaim the shared communication buffer ++ * ++ * In case of errors, this function can be called to retrieve ++ * the FWU shared buffer. ++ * ++ * Return: ++ * ++ * 0 is returned on success. Otherwise, failure ++ */ ++static int fwu_shared_buf_reclaim(void) ++{ ++ int reclaim_ret; ++ ++ reclaim_ret = ffa_memory_reclaim(g_dev, g_fwu_buf_handle, 0); ++ if (reclaim_ret) ++ log_err("FWU: FF-A memory reclaim failure (err: %d)\n", ++ reclaim_ret); ++ else ++ log_debug("FWU: Shared buffer reclaimed\n"); ++ ++ free(g_fwu_buf); ++ g_fwu_buf = NULL; ++ ++ return reclaim_ret; ++} ++ ++/** ++ * fwu_shared_buf_init() - Setup the FWU shared communication buffer ++ * ++ * The communication with the TS FWU SP is based on a buffer shared ++ * between U-Boot and TS FWU SP allocated in normal world and accessed ++ * by both sides. The buffer contains the data exchanged between both sides ++ * such as the payloads data. ++ * ++ * Return: ++ * ++ * 0 is returned on success. Otherwise, failure ++ */ ++static int fwu_shared_buf_init(void) ++{ ++ struct ffa_mem_ops_args args = {0}; ++ struct ffa_mem_region_attributes attrs = {0}; ++ struct ffa_send_direct_data msg; ++ int ret; ++ ++ g_fwu_buf = memalign(EFI_PAGE_SIZE, FWU_BUFFER_SIZE); ++ if (!g_fwu_buf) { ++ log_err("FWU: Failure to allocate the shared buffer\n"); ++ return -ENOMEM; ++ } ++ ++ /* Setting up user arguments */ ++ args.use_txbuf = true; ++ args.address = g_fwu_buf; ++ args.pg_cnt = FWU_BUFFER_PAGES; ++ args.nattrs = 1; ++ attrs.receiver = g_fwu_sp_id; ++ attrs.attrs = FFA_MEM_RW; ++ args.attrs = &attrs; ++ ++ /* Registering the shared buffer with secure world (Trusted Services) */ ++ ret = ffa_memory_share(g_dev, &args); ++ if (ret) { ++ free(g_fwu_buf); ++ g_fwu_buf = NULL; ++ log_err("FWU: Failure setting up the shared buffer (err: %d)\n", ++ ret); ++ return ret; ++ } ++ ++ g_fwu_buf_handle = args.g_handle; ++ ++ log_debug("FWU: shared buffer handle 0x%llx\n", g_fwu_buf_handle); ++ ++ /* Inform the FWU SP know about the shared buffer */ ++ ++ msg.data0 = TS_RPC_MEM_RETRIEVE; ++ msg.data1 = GET_FWU_BUF_LSW(g_fwu_buf_handle); ++ msg.data2 = GET_FWU_BUF_MSW(g_fwu_buf_handle); ++ ++ ret = ffa_sync_send_receive(g_dev, g_fwu_sp_id, &msg, 0); ++ if (ret) { ++ log_err("FWU: FF-A message error for MEM_RETRIEVE (err: %d)\n", ++ ret); ++ goto failure; ++ } ++ ++ if (msg.data0 != TS_RPC_MEM_RETRIEVE) { ++ log_err("FWU: Unexpected MEM_RETRIEVE return: (%lx)\n", ++ msg.data0); ++ ret = -EINVAL; ++ goto failure; ++ } ++ ++ if (msg.data1 != RPC_SUCCESS) { ++ log_err("FWU: MEM_RETRIEVE failed\n"); ++ ret = -EOPNOTSUPP; ++ goto failure; ++ } ++ ++ log_debug("FWU: MEM_RETRIEVE success for SP 0x%x\n", g_fwu_sp_id); ++ ++ return 0; ++ ++failure: ++ fwu_shared_buf_reclaim(); ++ return ret; ++} ++ ++/** ++ * fwu_agent_init() - Setup the FWU agent ++ * ++ * Perform the initializations required to communicate ++ * and use the FWU agent in secure world. ++ * The frontend of the FWU agent is the Trusted Services (aka TS) ++ * FWU SP (aka Secure Partition). ++ * ++ * Return: ++ * ++ * 0 is returned on success. Otherwise, failure ++ */ ++int fwu_agent_init(void) ++{ ++ int ret; ++ struct fwu_data *fwu_data; ++ u32 active_idx; ++ ++ fwu_data = fwu_get_data(); ++ if (!fwu_data) { ++ log_err("FWU: Cannot get FWU data\n"); ++ return -EINVAL; ++ } ++ ++ ret = fwu_get_active_index(&active_idx); ++ if (ret) { ++ log_err("FWU: Failed to read boot index, err (%d)\n", ++ ret); ++ return ret; ++ } ++ ++ if (fwu_data->trial_state) ++ log_info("FWU: System booting in Trial State\n"); ++ else ++ log_info("FWU: System booting in Regular State\n"); ++ ++ ret = uclass_first_device_err(UCLASS_FFA, &g_dev); ++ if (ret) { ++ log_err("FWU: Cannot find FF-A bus device, err (%d)\n", ret); ++ return ret; ++ } ++ ++ ret = fwu_discover_ts_sp_id(); ++ if (ret) ++ return ret; ++ ++ ret = fwu_shared_buf_init(); ++ if (ret) ++ return ret; ++ ++ g_fwu_initialized = true; ++ ++ return 0; ++} +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-fwu-introduce-EFI-capsule-update.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-fwu-introduce-EFI-capsule-update.patch deleted file mode 100644 index 62fd6d5a..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-efi-corstone1000-fwu-introduce-EFI-capsule-update.patch +++ /dev/null @@ -1,406 +0,0 @@ -From 2a054e537037bb4f4f9e144ca69438abd9bb38ed Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 17 Jul 2023 15:56:18 +0100 -Subject: [PATCH] efi: corstone1000: fwu: introduce EFI capsule update - -This commit provides capsule update feature for Corstone1000. - -This feature is available before and after ExitBootServices(). - -A platform specific capsule buffer is allocated. This buffer -is physically contiguous and allocated at the start of the DDR -memory after u-boot relocation to the end of DDR. - -The capsule buffer is shared between u-boot and the secure world. - -On UpdateCapsule() , capsule data is copied to the buffer and a buffer ready event is generated using FF-A transport. - -On efi_init_capsule() in U-Boot, an EFI started event is sent to SE Proxy FW update service. This event is generated on each boot. - -Note: The SE proxy SP requires that the interface/event IDs are passed using register w4 for the buffer ready event and the EFI started event. - - interface ID (31:16) - event ID (15:0) - -Signed-off-by: Abdellatif El Khlifi -Signed-off-by: Vishnu Banavath -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - board/armltd/corstone1000/corstone1000.c | 4 + - configs/corstone1000_defconfig | 3 + - include/configs/corstone1000.h | 24 ++++ - include/efi_loader.h | 4 +- - lib/efi_loader/efi_boottime.c | 7 ++ - lib/efi_loader/efi_capsule.c | 136 ++++++++++++++++++++++- - lib/efi_loader/efi_setup.c | 64 +++++++++++ - 7 files changed, 238 insertions(+), 4 deletions(-) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index 6ec8e6144f..c840290885 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -67,6 +67,10 @@ static struct mm_region corstone1000_mem_map[] = { - - struct mm_region *mem_map = corstone1000_mem_map; - -+void set_dfu_alt_info(char *interface, char *devstr) -+{ -+} -+ - int board_init(void) - { - return 0; -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index ee5481b63c..40ba415ecb 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -58,3 +58,6 @@ CONFIG_EFI_MM_COMM_TEE=y - CONFIG_FFA_SHARED_MM_BUF_SIZE=4096 - CONFIG_FFA_SHARED_MM_BUF_OFFSET=0 - CONFIG_FFA_SHARED_MM_BUF_ADDR=0x02000000 -+CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y -+CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y -+CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y -diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h -index 3347c11792..8927b09499 100644 ---- a/include/configs/corstone1000.h -+++ b/include/configs/corstone1000.h -@@ -14,6 +14,30 @@ - - #include - -+/* The SE Proxy partition ID*/ -+#define CORSTONE1000_SEPROXY_PART_ID (0x8002) -+ -+/* Update service ID provided by the SE Proxy secure partition*/ -+#define CORSTONE1000_SEPROXY_UPDATE_SVC_ID (0x4) -+ -+/* Notification events used with SE Proxy update service */ -+#define CORSTONE1000_BUFFER_READY_EVT (0x1) -+#define CORSTONE1000_UBOOT_EFI_STARTED_EVT (0x2) -+ -+#define PREP_SEPROXY_SVC_ID_MASK GENMASK(31, 16) -+#define PREP_SEPROXY_SVC_ID(x) (FIELD_PREP(PREP_SEPROXY_SVC_ID_MASK, (x))) -+ -+#define PREP_SEPROXY_EVT_MASK GENMASK(15, 0) -+#define PREP_SEPROXY_EVT(x) (FIELD_PREP(PREP_SEPROXY_EVT_MASK, (x))) -+ -+/* Size in 4KB pages of the EFI capsule buffer */ -+#define CORSTONE1000_CAPSULE_BUFFER_SIZE (8192) /* 32 MB */ -+ -+/* Capsule GUID */ -+#define EFI_CORSTONE1000_CAPSULE_ID_GUID \ -+ EFI_GUID(0x3a770ddc, 0x409b, 0x48b2, 0x81, 0x41, \ -+ 0x93, 0xb7, 0xc6, 0x0b, 0x20, 0x9e) -+ - #define V2M_BASE 0x80000000 - - #define CFG_PL011_CLOCK 50000000 -diff --git a/include/efi_loader.h b/include/efi_loader.h -index 38d7f66bab..0a613ed51e 100644 ---- a/include/efi_loader.h -+++ b/include/efi_loader.h -@@ -1036,11 +1036,11 @@ extern const struct efi_firmware_management_protocol efi_fmp_fit; - extern const struct efi_firmware_management_protocol efi_fmp_raw; - - /* Capsule update */ --efi_status_t EFIAPI efi_update_capsule( -+efi_status_t __efi_runtime EFIAPI efi_update_capsule( - struct efi_capsule_header **capsule_header_array, - efi_uintn_t capsule_count, - u64 scatter_gather_list); --efi_status_t EFIAPI efi_query_capsule_caps( -+efi_status_t __efi_runtime EFIAPI efi_query_capsule_caps( - struct efi_capsule_header **capsule_header_array, - efi_uintn_t capsule_count, - u64 *maximum_capsule_size, -diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c -index d5065f296a..a5da77c36c 100644 ---- a/lib/efi_loader/efi_boottime.c -+++ b/lib/efi_loader/efi_boottime.c -@@ -23,6 +23,13 @@ - #include - #include - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+#include -+#include -+#include -+#include -+#endif -+ - DECLARE_GLOBAL_DATA_PTR; - - /* Task priority level */ -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index 7a6f195cbc..ea084e4ed2 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -26,6 +26,17 @@ - #include - #include - -+#ifdef CONFIG_TARGET_CORSTONE1000 -+#include -+#include -+#include -+#include -+#include -+ -+void *__efi_runtime_data corstone1000_capsule_buf; /* capsule shared buffer virtual address */ -+efi_guid_t corstone1000_capsule_guid = EFI_CORSTONE1000_CAPSULE_ID_GUID; -+#endif -+ - DECLARE_GLOBAL_DATA_PTR; - - const efi_guid_t efi_guid_capsule_report = EFI_CAPSULE_REPORT_GUID; -@@ -709,6 +720,87 @@ static efi_status_t efi_capsule_update_firmware( - } - #endif /* CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT */ - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+ -+/** -+ * efi_corstone1000_alloc_capsule_shared_buf - allocate capsule shared buffer -+ * @capsule_image_size: The capsule data (header + payload) -+ * -+ * This function allocates the physically contiguous buffer shared between u-boot -+ * and the secure world. On UpdateCapsule() capsule data is copied to the buffer -+ * and a door bell event is generated. -+ * The buffer is allocated at the start of the DDR memory after u-boot has been relocated -+ * to the end of DDR. -+ * -+ * Return: -+ * -+ * 0: on success, otherwise failure -+ */ -+efi_status_t efi_corstone1000_alloc_capsule_shared_buf(void) -+{ -+ efi_status_t efi_ret; -+ u64 ram_base = CFG_SYS_SDRAM_BASE; -+ -+ log_debug("[%s]\n", __func__); -+ -+ efi_ret = efi_allocate_pages(EFI_ALLOCATE_ADDRESS, -+ EFI_RUNTIME_SERVICES_DATA, -+ CORSTONE1000_CAPSULE_BUFFER_SIZE, -+ &ram_base); -+ -+ if (efi_ret != EFI_SUCCESS) { -+ corstone1000_capsule_buf = NULL; -+ log_err("EFI: Corstone1000: Allocating capsule shared buffer error (%d)\n" -+ , (int)efi_ret); -+ return efi_ret; -+ } -+ -+ log_info("EFI: Corstone1000: Capsule shared buffer at 0x%x , size %d pages\n" -+ , (unsigned int)ram_base, -+ CORSTONE1000_CAPSULE_BUFFER_SIZE); -+ -+ corstone1000_capsule_buf = (void *)map_sysmem((phys_addr_t)ram_base, 0); -+ -+ return EFI_SUCCESS; -+} -+ -+/** -+ * efi_corstone1000_buffer_ready_event - issue door bell event -+ * @capsule_image_size: The capsule data (header + payload) -+ * -+ * This function notifies the SE Proxy update service that capsule data is available -+ * in the capsule shared buffer. -+ * -+ * Return: -+ * -+ * 0: on success, otherwise failure -+ */ -+static int __efi_runtime efi_corstone1000_buffer_ready_event(u32 capsule_image_size) -+{ -+ struct ffa_send_direct_data msg = {0}; -+ int ret; -+ struct udevice *dev; -+ -+ log_debug("[%s]\n", __func__); -+ -+ ret = uclass_first_device_err(UCLASS_FFA, &dev); -+ if (ret) { -+ log_err("Cannot find FF-A bus device\n"); -+ return ret; -+ } -+ -+ /* -+ * setting the buffer ready event arguments in register w4: -+ * - capsule update interface ID (31:16) -+ * - the buffer ready event ID (15:0) -+ */ -+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | -+ PREP_SEPROXY_EVT(CORSTONE1000_BUFFER_READY_EVT); /* w4 */ -+ -+ return ffa_sync_send_receive(dev, CORSTONE1000_SEPROXY_PART_ID, &msg, 0); -+} -+#endif -+ - /** - * efi_update_capsule() - process information from operating system - * @capsule_header_array: Array of virtual address pointers -@@ -722,7 +814,7 @@ static efi_status_t efi_capsule_update_firmware( - * - * Return: status code - */ --efi_status_t EFIAPI efi_update_capsule( -+efi_status_t __efi_runtime EFIAPI efi_update_capsule( - struct efi_capsule_header **capsule_header_array, - efi_uintn_t capsule_count, - u64 scatter_gather_list) -@@ -739,6 +831,13 @@ efi_status_t EFIAPI efi_update_capsule( - goto out; - } - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+ if (capsule_count != 1 || !corstone1000_capsule_buf) { -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+#endif -+ - ret = EFI_SUCCESS; - for (i = 0, capsule = *capsule_header_array; i < capsule_count; - i++, capsule = *(++capsule_header_array)) { -@@ -751,6 +850,39 @@ efi_status_t EFIAPI efi_update_capsule( - - log_debug("Capsule[%d] (guid:%pUs)\n", - i, &capsule->capsule_guid); -+ -+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -+ if (guidcmp(&corstone1000_capsule_guid, &capsule->capsule_guid)) { -+ ret = EFI_INVALID_PARAMETER; -+ log_err("Corstone1000: Invalid capsule GUID\n"); -+ goto out; -+ } -+ -+ if (efi_size_in_pages(capsule->capsule_image_size) > -+ CORSTONE1000_CAPSULE_BUFFER_SIZE) { -+ log_err("Corstone1000: Capsule data size exceeds the shared buffer size\n"); -+ ret = EFI_BUFFER_TOO_SMALL; -+ goto out; -+ } -+ -+ /* copy the data to the contiguous buffer */ -+ efi_memcpy_runtime(corstone1000_capsule_buf, capsule, capsule->capsule_image_size); -+ -+ /* invalidate the data cache */ -+ invalidate_dcache_all(); -+ -+ /* issue buffer ready event */ -+ ret = efi_corstone1000_buffer_ready_event(capsule->capsule_image_size); -+ if (ret) { -+ log_err("EFI: Corstone1000: Buffer ready event error (%d)\n", (int)ret); -+ ret = EFI_DEVICE_ERROR; -+ } else { -+ ret = EFI_SUCCESS; -+ } -+ -+ goto out; -+#endif -+ - if (!guidcmp(&capsule->capsule_guid, - &efi_guid_firmware_management_capsule_id)) { - ret = efi_capsule_update_firmware(capsule); -@@ -789,7 +921,7 @@ out: - * - * Return: status code - */ --efi_status_t EFIAPI efi_query_capsule_caps( -+efi_status_t __efi_runtime EFIAPI efi_query_capsule_caps( - struct efi_capsule_header **capsule_header_array, - efi_uintn_t capsule_count, - u64 *maximum_capsule_size, -diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c -index 58d4e13402..bf90a98b5a 100644 ---- a/lib/efi_loader/efi_setup.c -+++ b/lib/efi_loader/efi_setup.c -@@ -17,6 +17,18 @@ - - efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED; - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+#include -+#include -+#include -+#include -+ -+/** -+ * efi_corstone1000_alloc_capsule_shared_buf - allocate capsule shared buffer -+ */ -+extern efi_status_t efi_corstone1000_alloc_capsule_shared_buf(void); -+#endif -+ - /* - * Allow unaligned memory access. - * -@@ -120,6 +132,42 @@ static efi_status_t efi_init_secure_boot(void) - } - #endif /* CONFIG_EFI_SECURE_BOOT */ - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+/** -+ * efi_corstone1000_uboot-efi_started_event - notifies SE Proxy FW update service -+ * -+ * This function notifies the SE Proxy update service that uboot efi has already started -+ * -+ * Return: -+ * -+ * 0: on success, otherwise failure -+ * */ -+static int efi_corstone1000_uboot_efi_started_event(void) -+{ -+ struct ffa_send_direct_data msg = {0}; -+ int ret; -+ struct udevice *dev; -+ -+ log_debug("[%s]\n", __func__); -+ -+ ret = uclass_first_device_err(UCLASS_FFA, &dev); -+ if (ret) { -+ log_err("Cannot find FF-A bus device\n"); -+ return ret; -+ } -+ -+ /* -+ * setting the kernel started event arguments: -+ * setting capsule update interface ID(31:16) -+ * the kernel started event ID(15:0) -+ */ -+ msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | -+ PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); /* w4 */ -+ -+ return ffa_sync_send_receive(dev, CORSTONE1000_SEPROXY_PART_ID, &msg, 0); -+} -+#endif -+ - /** - * efi_init_capsule - initialize capsule update state - * -@@ -129,6 +177,22 @@ static efi_status_t efi_init_capsule(void) - { - efi_status_t ret = EFI_SUCCESS; - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+ int ffa_ret; -+ -+ ffa_ret = efi_corstone1000_uboot_efi_started_event(); -+ if (ffa_ret) -+ log_err("Failure to notify SE Proxy FW update service\n"); -+ else -+ debug("SE Proxy FW update service notified\n"); -+ -+ ret = efi_corstone1000_alloc_capsule_shared_buf(); -+ if (ret != EFI_SUCCESS) { -+ printf("EFI: Corstone-1000: cannot allocate caspsule shared buffer\n"); -+ return ret; -+ } -+#endif -+ - if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)) { - u16 var_name16[12]; - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-fwu_arm_psa-Read-the-FWU-directory-through-get_image.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-fwu_arm_psa-Read-the-FWU-directory-through-get_image.patch new file mode 100644 index 00000000..36d96652 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0011-fwu_arm_psa-Read-the-FWU-directory-through-get_image.patch @@ -0,0 +1,894 @@ +From 372b693b0d9778fc5696512f13d39d0090b9b0d9 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Fri, 15 Nov 2024 19:24:50 +0000 +Subject: [PATCH 11/36] fwu_arm_psa: Read the FWU directory through + get_image_info() + +Implement get_image_info() + +get_image_info() is implemented by fwu_arm_psa_get_image_info() +which reads the images information from the cached directory in Secure +world then populates the images descriptors. + +The FWU Arm PSA setup ABIs have been implemented to allow +reading the directory data. + +The ABIs are specified by the Platform Security Firmware Update for +the A-profile Arm Architecture specification [1]. + +For more details about PSA please see [2]. + +The implemented ABIs are as follows: + +FWU_DISCOVER +FWU_OPEN +FWU_READ_STREAM +FWU_COMMIT + +[1]: DEN0118, 1.0 A: https://developer.arm.com/documentation/den0118/latest/ +[2]: https://www.psacertified.org/ + +Signed-off-by: Abdellatif El Khlifi +Signed-off-by: Davidson kumaresan +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + include/fwu_arm_psa.h | 206 ++++++++++++ + lib/fwu_updates/fwu_arm_psa.c | 580 +++++++++++++++++++++++++++++++++- + 2 files changed, 785 insertions(+), 1 deletion(-) + +diff --git a/include/fwu_arm_psa.h b/include/fwu_arm_psa.h +index f1d42f9ef24..ba294359b5e 100644 +--- a/include/fwu_arm_psa.h ++++ b/include/fwu_arm_psa.h +@@ -10,9 +10,16 @@ + #ifndef __FWU_ARM_PSA_H + #define __FWU_ARM_PSA_H + ++#include + #include + #include + ++#define DEFAULT_HW_INSTANCE (1) ++ ++/* Default values of the ESRT fields which are not supported at this stage */ ++#define PACKAGE_VERSION_NOT_SUP (0xffffffff) ++#define LAST_ATTEMPT_NOT_SUP (0) ++ + #define FWU_BUFFER_PAGES (1024) + + /* 4 MB buffer shared with secure world */ +@@ -26,6 +33,13 @@ + #define TS_FWU_SERVICE_UUID "38a82368-061b-0e47-7497-fd53fb8bce0c" + /* In little-endian equivalent to: 6823a838-1b06-470e-9774-0cce8bfb53fd */ + ++/* TS FWU directory UUID string (in big-endian format) */ ++#define FWU_DIRECTORY_CANONICAL_UUID "d958eede-4751-d34a-90a2-a541236e6677" ++/* In little-endian equivalent to: deee58d9-5147-4ad3-a290-77666e2341a5 */ ++ ++/* The entries correspond to the payloads in the storage device and the fake ESRT image */ ++#define FWU_DIRECTORY_IMAGE_ENTRIES_COUNT (CONFIG_FWU_NUM_IMAGES_PER_BANK + 1) ++ + #define TS_RPC_MEM_RETRIEVE (0xff0001) + #define TS_RPC_SERVICE_INFO_GET (0xff0003) + #define RPC_SUCCESS (0) +@@ -34,6 +48,11 @@ + #define GET_SVC_IFACE_ID(x) \ + ((u8)(FIELD_GET(SVC_IFACE_ID_GET_MASK, (x)))) + ++#define SVC_ID_MASK GENMASK(15, 0) ++#define SVC_IFACE_ID_SET_MASK GENMASK(23, 16) ++#define PACK_SVC_IFACE_ID(svc, iface) (FIELD_PREP(SVC_ID_MASK, (svc)) | \ ++ FIELD_PREP(SVC_IFACE_ID_SET_MASK, (iface))) ++ + #define HANDLE_MSW_MASK GENMASK(63, 32) + #define HANDLE_LSW_MASK GENMASK(31, 0) + #define GET_FWU_BUF_MSW(x) \ +@@ -41,6 +60,174 @@ + #define GET_FWU_BUF_LSW(x) \ + ((u32)(FIELD_GET(HANDLE_LSW_MASK, (x)))) + ++enum fwu_abis { ++ FWU_DISCOVER = 0, ++ FWU_OPEN = 19, ++ FWU_READ_STREAM = 21, ++ FWU_COMMIT = 22, ++ /* To be updated when adding new FWU IDs */ ++ FWU_FIRST_ID = FWU_DISCOVER, /* Lowest number ID */ ++ FWU_LAST_ID = FWU_COMMIT, /* Highest number ID */ ++}; ++ ++enum fwu_abi_errcode { ++ FWU_UNKNOWN = 1, ++ FWU_BUSY, ++ FWU_OUT_OF_BOUNDS, ++ FWU_AUTH_FAIL, ++ FWU_NO_PERMISSION, ++ FWU_DENIED, ++ FWU_RESUME, ++ FWU_NOT_AVAILABLE, ++ MAX_NUMBER_FWU_ERR ++}; ++ ++/* Container structure and helper macros to map between an FF-A error and relevant error log */ ++struct fwu_abi_errmap { ++ char *err_str[MAX_NUMBER_FWU_ERR]; ++}; ++ ++#define FWU_ERRMAP_COUNT (FWU_LAST_ID - FWU_FIRST_ID + 1) ++#define FWU_ID_TO_ERRMAP_ID(fwu_id) ((fwu_id) - FWU_FIRST_ID) ++ ++/* ++ * struct fwu_open_args - fwu_open ABI arguments ++ * @function_id: fwu_open service ID ++ * @image_type_guid: GUID of the image to be opened ++ * @op_type: The operation that the Client will perform on the image ++ */ ++struct __packed fwu_open_args { ++ u32 function_id; ++ efi_guid_t image_type_guid; ++#define FWU_OP_TYPE_READ 0 ++#define FWU_OP_TYPE_WRITE 1 ++ u8 op_type; ++}; ++ ++/* ++ * struct fwu_open_resp - fwu_open ABI returns ++ * @status: The ABI return status ++ * @handle: Staging context identifier ++ */ ++struct __packed fwu_open_resp { ++ int status; ++ u32 handle; ++}; ++ ++/* ++ * struct fwu_discover_args - fwu_discover ABI arguments ++ * @function_id: fwu_discover service ID ++ */ ++struct __packed fwu_discover_args { ++ u32 function_id; ++}; ++ ++/* ++ * struct fwu_discover_resp - fwu_discover ABI returns ++ * @status: The ABI return status ++ * @service_status: the status of the service provider ++ * @version_major: the ABI major version ++ * @version_minor: the ABI minor version ++ * @off_function_presence: the offset (in bytes) of the function_presence array ++ * relative to the start of this data structure ++ * @num_func: the number of entries in the function_presence array ++ * @max_payload_size: the maximum number of bytes that a payload can contain ++ * @flags: flags listing the update capabilities ++ * @vendor_specific_flags: Vendor specific update capabilities flags ++ * @function_presence: array of bytes indicating functions that are implemented ++ */ ++struct __packed fwu_discover_resp { ++ int status; ++ u16 service_status; ++ u8 version_major; ++ u8 version_minor; ++ u16 off_function_presence; ++ u16 num_func; ++ u64 max_payload_size; ++ u32 flags; ++ u32 vendor_specific_flags; ++ void *function_presence; ++}; ++ ++/* ++ * struct fwu_read_stream_args - fwu_read_stream ABI arguments ++ * @function_id: fwu_read_stream service ID ++ * @handle: The handle of the context being read from ++ */ ++struct __packed fwu_read_stream_args { ++ u32 function_id; ++ u32 handle; ++}; ++ ++/* ++ * struct fwu_read_stream_resp - fwu_read_stream ABI returns ++ * @status: The ABI return status ++ * @read_bytes: Number of bytes read by the current ABI call ++ * @total_bytes: Total number of bytes that can be read ++ * @payload: The read data by the current ABI call ++ */ ++struct __packed fwu_read_stream_resp { ++ int status; ++ u32 read_bytes; ++ u32 total_bytes; ++ u8 payload[]; ++}; ++ ++/* ++ * struct fwu_commit_args - fwu_commit ABI arguments ++ * @function_id: fwu_commit service ID ++ * @handle: The handle of the context being closed ++ * @acceptance_req: If positive, the Client requests the image to be marked as ++ * unaccepted ++ * @max_atomic_len: Hint, maximum time (in ns) that the Update Agent can execute ++ * continuously without yielding back to the Client state ++ */ ++struct __packed fwu_commit_args { ++ u32 function_id; ++ u32 handle; ++#define FWU_IMG_ACCEPTED 0 ++#define FWU_IMG_NOT_ACCEPTED 1 ++ u32 acceptance_req; ++ u32 max_atomic_len; ++}; ++ ++/* ++ * struct fwu_commit_resp - fwu_commit ABI returns ++ * @status: The ABI return status ++ * @progress: Units of work already completed by the Update Agent ++ * @total_work: Units of work the Update Agent must perform until fwu_commit ++ * returns successfully ++ */ ++struct __packed fwu_commit_resp { ++ int status; ++ u32 progress; ++ u32 total_work; ++}; ++ ++/* ++ * FWU directory information structures ++ */ ++ ++struct __packed fwu_image_info_entry { ++ efi_guid_t image_guid; ++ u32 client_permissions; ++ u32 img_max_size; ++ u32 lowest_acceptable_version; ++ u32 img_version; ++ u32 accepted; ++ u32 reserved; ++}; ++ ++struct __packed fwu_image_directory { ++ u32 directory_version; ++ u32 img_info_offset; ++ u32 num_images; ++ u32 correct_boot; ++ u32 img_info_size; ++ u32 reserved; ++ struct fwu_image_info_entry entries[FWU_DIRECTORY_IMAGE_ENTRIES_COUNT]; ++}; ++ + /** + * fwu_agent_init() - Setup the FWU agent + * +@@ -55,4 +242,23 @@ + */ + int fwu_agent_init(void); + ++/** ++ * fwu_arm_psa_get_image_info() - Arm PSA implementation for GetImageInfo() ++ * ++ * Initialize the update agent in secure world if not initialized. ++ * Then, read the FWU directory information including the current ++ * images information. For more details refer to fwu_image_directory structure. ++ * ++ * Return: ++ * ++ * EFI_SUCCESS is returned on success. Otherwise, failure ++ */ ++efi_status_t fwu_arm_psa_get_image_info(efi_uintn_t *image_info_size, ++ struct efi_firmware_image_descriptor *image_info, ++ u32 *descriptor_version, ++ u8 *descriptor_count, ++ efi_uintn_t *descriptor_size, ++ u32 *package_version, ++ u16 **package_version_name); ++ + #endif +diff --git a/lib/fwu_updates/fwu_arm_psa.c b/lib/fwu_updates/fwu_arm_psa.c +index 4a01c5ac672..b42d9f90e1e 100644 +--- a/lib/fwu_updates/fwu_arm_psa.c ++++ b/lib/fwu_updates/fwu_arm_psa.c +@@ -9,7 +9,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -21,7 +20,481 @@ static u64 g_fwu_buf_handle; + static u16 g_fwu_sp_id; + static struct udevice *g_dev; + static u16 g_svc_interface_id; ++static u64 g_max_payload_size; ++static u8 g_fwu_version_major; ++static u8 g_fwu_version_minor; + static bool g_fwu_initialized; ++struct fwu_image_directory g_fwu_cached_directory; ++ ++/* Error mapping declarations */ ++ ++int fwu_to_std_errmap[MAX_NUMBER_FWU_ERR] = { ++ [FWU_UNKNOWN] = -EOPNOTSUPP, ++ [FWU_OUT_OF_BOUNDS] = -ERANGE, ++ [FWU_AUTH_FAIL] = -EFAULT, ++ [FWU_BUSY] = -EBUSY, ++ [FWU_NO_PERMISSION] = -EPERM, ++ [FWU_DENIED] = -EACCES, ++ [FWU_RESUME] = -EAGAIN, ++ [FWU_NOT_AVAILABLE] = -ENAVAIL, ++}; ++ ++static struct fwu_abi_errmap err_msg_map[FWU_ERRMAP_COUNT] = { ++ [FWU_ID_TO_ERRMAP_ID(FWU_OPEN)] = { ++ { ++ [FWU_UNKNOWN] = ++ "FWU_UNKNOWN: Image type with GUID=image_type_guid does not exist", ++ [FWU_DENIED] = ++ "FWU_DENIED: An image cannot be opened for writing outside of this Staging state", ++ [FWU_NOT_AVAILABLE] = ++ "FWU_NOT_AVAILABLE: The Update Agent does not support the op_type for this image", ++ }, ++ }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_READ_STREAM)] = { ++ { ++ [FWU_UNKNOWN] = ++ "FWU_UNKNOWN: Handle is not recognized", ++ [FWU_DENIED] = ++ "FWU_DENIED: The image cannot be temporarily read from", ++ [FWU_NO_PERMISSION] = ++ "FWU_NO_PERMISSION: The image cannot be read from", ++ }, ++ }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_COMMIT)] = { ++ { ++ [FWU_UNKNOWN] = ++ "FWU_UNKNOWN: Handle is not recognized", ++ [FWU_DENIED] = ++ "FWU_DENIED: The image can only be accepted after activation", ++ [FWU_AUTH_FAIL] = ++ "FWU_AUTH_FAIL: Image closed, authentication failed", ++ [FWU_RESUME] = ++ "FWU_RESUME: The Update Agent yielded", ++ }, ++ }, ++}; ++ ++/** ++ * fwu_to_std_errno() - convert FWU error code to standard error code ++ * @fwu_errno: Error code returned by the FWU ABI ++ * ++ * Map the given FWU error code as specified ++ * by the spec to a U-Boot standard error code. ++ * ++ * Return: ++ * ++ * The standard error code on success. . Otherwise, failure ++ */ ++static int fwu_to_std_errno(int fwu_errno) ++{ ++ int err_idx = -fwu_errno; ++ ++ /* Map the FWU error code to the standard u-boot error code */ ++ if (err_idx > 0 && err_idx < MAX_NUMBER_FWU_ERR) ++ return fwu_to_std_errmap[err_idx]; ++ return -EINVAL; ++} ++ ++/** ++ * fwu_print_error_log() - print the error log corresponding to the selected FWU ABI ++ * @fwu_id: FWU ABI ID ++ * @fwu_errno: Error code returned by the FWU ABI ++ * ++ * Map the FWU error code to the error log relevant to the ++ * selected FWU ABI. Then the error log is printed. ++ * ++ * Return: ++ * ++ * 0 on success. . Otherwise, failure ++ */ ++static int fwu_print_error_log(u32 fwu_id, int fwu_errno) ++{ ++ int err_idx = -fwu_errno, abi_idx = 0; ++ ++ /* Map the FWU error code to the corresponding error log */ ++ ++ if (err_idx <= 0 || err_idx >= MAX_NUMBER_FWU_ERR) ++ return -EINVAL; ++ ++ if (fwu_id < FWU_FIRST_ID || fwu_id > FWU_LAST_ID) ++ return -EINVAL; ++ ++ abi_idx = FWU_ID_TO_ERRMAP_ID(fwu_id); ++ ++ if (!err_msg_map[abi_idx].err_str[err_idx]) ++ return -EINVAL; ++ ++ log_err("%s\n", err_msg_map[abi_idx].err_str[err_idx]); ++ ++ return 0; ++} ++ ++/** ++ * fwu_invoke_svc() - FWU service call request ++ * @svc_id: FWU ABI function ID ++ * @svc_name: FWU ABI function name ++ * @req_args_sz: Size in bytes of the arguments of the FWU ABI function ++ * @expect_resp_sz: Size in bytes of the response of the FWU ABI function ++ * @extra_resp_bytes: Size in bytes of the extra response data ++ * ++ * Invoke a FWU ABI by issuing a TS service call request. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++static int fwu_invoke_svc(u32 svc_id, const char *svc_name, ++ u32 req_args_sz, u32 expect_resp_sz, ++ u32 *extra_resp_bytes) ++{ ++ struct ffa_send_direct_data msg; ++ int ret; ++ int *svc_status_in_buf = g_fwu_buf, svc_status_in_reg; ++ u32 expect_total_resp_sz; ++ ++ log_debug("FWU: Invoking %s\n", svc_name); ++ ++ if (!expect_resp_sz || !svc_name || !req_args_sz) { ++ log_err("%s: Invalid invoke arguments\n", svc_name); ++ return -EINVAL; ++ } ++ ++ msg.data0 = PACK_SVC_IFACE_ID(svc_id, g_svc_interface_id); ++ msg.data1 = GET_FWU_BUF_LSW(g_fwu_buf_handle); ++ msg.data2 = GET_FWU_BUF_MSW(g_fwu_buf_handle); ++ msg.data3 = req_args_sz; ++ msg.data4 = 0; ++ ++ ret = ffa_sync_send_receive(g_dev, g_fwu_sp_id, &msg, 0); ++ if (ret) { ++ log_err("%s: FF-A error %d\n", svc_name, ret); ++ return ret; ++ } ++ ++ if (msg.data0 != PACK_SVC_IFACE_ID(svc_id, g_svc_interface_id)) { ++ log_err("%s: Unexpected service/interface ID 0x%lx\n", ++ svc_name, msg.data0); ++ return -EINVAL; ++ } ++ ++ if (msg.data1 != RPC_SUCCESS) { ++ log_err("%s: TS RPC error 0x%lx\n", svc_name, msg.data1); ++ return -ECOMM; ++ } ++ ++ svc_status_in_reg = (int)msg.data2; ++ if (*svc_status_in_buf != svc_status_in_reg) { ++ log_err("%s: Status mismatch (reg %d , buf %d)\n", ++ svc_name, svc_status_in_reg, *svc_status_in_buf); ++ return -EINVAL; ++ } ++ ++ if (svc_status_in_reg < 0) { ++ fwu_print_error_log(svc_id, svc_status_in_reg); ++ if (svc_status_in_reg != -FWU_RESUME) ++ return fwu_to_std_errno(svc_status_in_reg); ++ } ++ ++ if (!extra_resp_bytes) ++ expect_total_resp_sz = expect_resp_sz; ++ else ++ expect_total_resp_sz = expect_resp_sz + *extra_resp_bytes; ++ ++ if (msg.data3 != expect_total_resp_sz) { ++ log_err("%s: Unexpected response size (%ld , %d)\n", ++ svc_name, msg.data3, expect_total_resp_sz); ++ return -EINVAL; ++ } ++ ++ if (svc_status_in_reg == -FWU_RESUME) ++ return fwu_to_std_errno(svc_status_in_reg); ++ ++ return 0; ++} ++ ++/** ++ * fwu_discover() - fwu_discover ABI ++ * ++ * This call indicates the version of the ABI alongside a list of the ++ * implemented functions (aka services). ++ * Only max_payload_size is saved for future use. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_discover(void) ++{ ++ int ret; ++ struct fwu_discover_args *args = g_fwu_buf; ++ struct fwu_discover_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_DISCOVER"; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_DISCOVER; ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ ret = fwu_invoke_svc(args->function_id, svc_name, sizeof(*args), ++ sizeof(int), NULL); ++ if (ret) { ++ log_debug("FWU_DISCOVER: error %d\n", ret); ++ return ret; ++ } ++ ++ g_max_payload_size = resp->max_payload_size; ++ g_fwu_version_major = resp->version_major; ++ g_fwu_version_minor = resp->version_minor; ++ ++ log_debug("FWU: max_payload_size %llu\n", g_max_payload_size); ++ log_info("FWU: ABI version %d.%d detected\n", g_fwu_version_major, ++ g_fwu_version_minor); ++ ++ return 0; ++} ++ ++/** ++ * fwu_open() - fwu_open ABI ++ * @guid: GUID of the image to be opened ++ * @op_type: The operation that the Client will perform on the image ++ * @handle: Staging context identifier ++ * ++ * Returns a handle to the image with a given GUID. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_open(const efi_guid_t *guid, u8 op_type, ++ u32 *handle) ++{ ++ int ret; ++ struct fwu_open_args *args = g_fwu_buf; ++ struct fwu_open_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_OPEN"; ++ ++ if (!guid || !handle) ++ return -EINVAL; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_OPEN; ++ ++ guidcpy(&args->image_type_guid, guid); ++ args->op_type = op_type; ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ ret = fwu_invoke_svc(args->function_id, svc_name, ++ sizeof(*args), sizeof(*resp), NULL); ++ if (ret) ++ return ret; ++ ++ *handle = resp->handle; ++ ++ return 0; ++} ++ ++/** ++ * fwu_read_stream() - fwu_read_stream ABI ++ * @handle: The handle of the context being read from ++ * @buffer: The destination buffer where the data will be copied to ++ * @buffer_size: The size of the destination buffer ++ * ++ * The call reads at most g_max_payload_size bytes from the Update Agent ++ * context pointed to by handle. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_read_stream(u32 handle, u8 *buffer, u32 buffer_size) ++{ ++ int ret; ++ u32 curr_read_offset = 0, new_read_offset, fwu_buf_bytes_left; ++ struct fwu_read_stream_args *args = g_fwu_buf; ++ struct fwu_read_stream_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_READ_STREAM"; ++ ++ if (!buffer || !buffer_size) ++ return -EINVAL; ++ ++ do { ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_READ_STREAM; ++ args->handle = handle; ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ ret = fwu_invoke_svc(args->function_id, svc_name, sizeof(*args), ++ sizeof(*resp), &resp->read_bytes); ++ if (ret) ++ return ret; ++ ++ if (resp->read_bytes > g_max_payload_size) { ++ log_err("%s: Bytes read > max_payload_size (%d , %llu)\n", ++ svc_name, resp->read_bytes, ++ g_max_payload_size); ++ return -EINVAL; ++ } ++ ++ fwu_buf_bytes_left = FWU_BUFFER_SIZE - sizeof(*resp); ++ ++ if (resp->read_bytes > fwu_buf_bytes_left) { ++ log_err("%s: Bytes read > shared buffer (%d , %d)\n", ++ svc_name, resp->read_bytes, fwu_buf_bytes_left); ++ return -EINVAL; ++ } ++ ++ if (resp->total_bytes > buffer_size) { ++ log_err("%s: Total bytes > dest buffer (%d , %d)\n", ++ svc_name, resp->total_bytes, buffer_size); ++ return -EINVAL; ++ } ++ ++ new_read_offset = resp->read_bytes + curr_read_offset; ++ ++ if (new_read_offset > buffer_size) { ++ log_err("%s: Bytes read > dest buffer (%d , %d)\n", ++ svc_name, new_read_offset, buffer_size); ++ return -EINVAL; ++ } ++ ++ memcpy(buffer + curr_read_offset, resp->payload, ++ resp->read_bytes); ++ ++ curr_read_offset = new_read_offset; ++ ++ if (curr_read_offset > resp->total_bytes) { ++ log_err("%s: Offset bypassed total bytes (%d , %d)\n", ++ svc_name, curr_read_offset, resp->total_bytes); ++ return -EINVAL; ++ } ++ ++ } while (curr_read_offset != resp->total_bytes); ++ ++ return ret; ++} ++ ++/** ++ * fwu_commit() - fwu_commit ABI ++ * @handle: The handle of the context being closed ++ * @acceptance_req: Acceptance status set by the Client ++ * @max_atomic_len: Hint, maximum time (in ns) that the Update Agent can execute ++ * continuously without yielding back to the Client state ++ * ++ * The call closes the image pointed to by handle. The image can be any entity ++ * opened with fwu_open(). ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_commit(u32 handle, u32 acceptance_req, u32 max_atomic_len) ++{ ++ struct fwu_commit_args *args = g_fwu_buf; ++ struct fwu_commit_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_COMMIT"; ++ int ret; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_COMMIT; ++ args->handle = handle; ++ args->acceptance_req = acceptance_req; ++ args->max_atomic_len = max_atomic_len; ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ ret = fwu_invoke_svc(args->function_id, svc_name, ++ sizeof(*args), sizeof(*resp), NULL); ++ ++ while (resp->status == -FWU_RESUME) ++ ret = fwu_invoke_svc(args->function_id, svc_name, sizeof(*args), ++ sizeof(*resp), NULL); ++ ++ if (ret) ++ return ret; ++ ++ log_debug("%s: Progress %d/%d\n", svc_name, resp->progress, ++ resp->total_work); ++ ++ return 0; ++} ++ ++/** ++ * fwu_read_directory() - Read FWU directory information ++ * ++ * Read FWU directory information. ++ * For more details see fwu_image_directory structure. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++static int fwu_read_directory(void) ++{ ++ int ret, close_ret; ++ u32 handle = 0; ++ efi_guid_t dir_guid = {0}; ++ char *uuid_str = FWU_DIRECTORY_CANONICAL_UUID; ++ ++ if (!uuid_str) { ++ log_err("FWU: No directory UUID provided\n"); ++ return -EINVAL; ++ } ++ ++ if (uuid_str_to_le_bin(uuid_str, dir_guid.b)) { ++ log_err("FWU: Invalid directory UUID\n"); ++ return -EINVAL; ++ } ++ ++ ret = fwu_open(&dir_guid, FWU_OP_TYPE_READ, &handle); ++ if (ret) { ++ log_err("FWU: Open image directory failed (err: %d)\n", ++ ret); ++ return ret; ++ } ++ ++ log_debug("FWU: Image directory handle (0x%x)\n", handle); ++ ++ ret = fwu_read_stream(handle, (u8 *)&g_fwu_cached_directory, ++ sizeof(g_fwu_cached_directory)); ++ if (ret) { ++ log_err("FWU: Read image directory failed (err: %d)\n", ++ ret); ++ goto close_handle; ++ } ++ ++ log_debug("FWU: directory_version (%d)\n", ++ g_fwu_cached_directory.directory_version); ++ ++ /* ++ * Note: The expected images in the directory are: ++ * - The images to be updated ++ * - The ESRT image (an image containing ESRT data) ++ * The ESRT image is not involved in the FWU. ++ * It should be removed from the count. ++ */ ++ g_fwu_cached_directory.num_images -= 1; ++ ++ if (g_fwu_cached_directory.num_images != ++ CONFIG_FWU_NUM_IMAGES_PER_BANK) { ++ log_err("FWU: Unexpected image count (%d , %d)\n", ++ g_fwu_cached_directory.num_images, ++ CONFIG_FWU_NUM_IMAGES_PER_BANK); ++ ret = -EINVAL; ++ goto close_handle; ++ } ++ ++ log_debug("FWU: images to be updated (%d)\n", ++ g_fwu_cached_directory.num_images); ++ log_debug("FWU: img_info_size (%d)\n", ++ g_fwu_cached_directory.img_info_size); ++ ++close_handle: ++ /* The Update Agent can execute for an unbounded time */ ++ close_ret = fwu_commit(handle, FWU_IMG_NOT_ACCEPTED, 0); ++ if (close_ret) ++ log_err("FWU: Close image directory handle failed (err: %d)\n", ++ close_ret); ++ ++ return ret; ++} + + /** + * fwu_discover_ts_sp_id() - Query the FWU partition ID +@@ -265,7 +738,112 @@ int fwu_agent_init(void) + if (ret) + return ret; + ++ ret = fwu_discover(); ++ if (ret) ++ goto failure; ++ + g_fwu_initialized = true; + + return 0; ++ ++failure: ++ fwu_shared_buf_reclaim(); ++ return ret; ++} ++ ++/** ++ * fwu_arm_psa_get_image_info() - Arm PSA implementation for GetImageInfo() ++ * ++ * Initialize the update agent in secure world if not initialized. ++ * Then, read the FWU directory information including the current ++ * images information. For more details refer to fwu_image_directory structure. ++ * ++ * Return: ++ * ++ * EFI_SUCCESS is returned on success. Otherwise, failure ++ */ ++efi_status_t fwu_arm_psa_get_image_info(efi_uintn_t *image_info_size, ++ struct efi_firmware_image_descriptor *image_info, ++ u32 *descriptor_version, ++ u8 *descriptor_count, ++ efi_uintn_t *descriptor_size, ++ u32 *package_version, ++ u16 **package_version_name) ++{ ++ int ret; ++ int required_image_info_size; ++ size_t image_info_desc_size = sizeof(*image_info); ++ ++ if (!g_fwu_initialized) { ++ ret = fwu_agent_init(); ++ if (ret) { ++ log_err("FWU: Update agent init failed, ret = %d\n", ++ ret); ++ return EFI_EXIT(EFI_DEVICE_ERROR); ++ } ++ } ++ ++ ret = fwu_read_directory(); ++ if (ret) ++ return EFI_NOT_READY; ++ ++ required_image_info_size = g_fwu_cached_directory.num_images * ++ image_info_desc_size; ++ ++ if (*image_info_size < required_image_info_size) { ++ *image_info_size = required_image_info_size; ++ return EFI_BUFFER_TOO_SMALL; ++ } ++ ++ *descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION; ++ *descriptor_count = g_fwu_cached_directory.num_images; ++ *descriptor_size = image_info_desc_size; ++ *package_version = PACKAGE_VERSION_NOT_SUP; /* Not supported */ ++ *package_version_name = NULL; /* Not supported */ ++ ++ for (int i = 0; i < g_fwu_cached_directory.num_images; i++) { ++ /* Only image indexes starting from 1 are supported */ ++ image_info[i].image_index = i + 1; ++ ++ /* Corresponding ESRT field: FwClass */ ++ guidcpy(&image_info[i].image_type_id, ++ &g_fwu_cached_directory.entries[i].image_guid); ++ ++ image_info[i].image_id = image_info[i].image_index; ++ image_info[i].image_id_name = NULL; /* Not supported */ ++ ++ /* Corresponding ESRT field: FwVersion */ ++ image_info[i].version = ++ g_fwu_cached_directory.entries[i].img_version; ++ ++ image_info[i].version_name = NULL; /* Not supported */ ++ image_info[i].size = ++ g_fwu_cached_directory.entries[i].img_max_size; ++ ++ image_info[i].attributes_supported = ++ IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | ++ IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED; ++ image_info[i].attributes_setting = ++ IMAGE_ATTRIBUTE_IMAGE_UPDATABLE; ++ ++ /* Check if the capsule authentication is enabled */ ++ if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE)) ++ image_info[i].attributes_setting |= ++ IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED; ++ ++ /* Corresponding ESRT field: LowestSupportedFwVersion */ ++ image_info[i].lowest_supported_image_version = ++ g_fwu_cached_directory.entries[i].lowest_acceptable_version; ++ ++ /* Corresponding ESRT field: LastAttemptVersion (not supported) */ ++ image_info[i].last_attempt_version = LAST_ATTEMPT_NOT_SUP; ++ ++ /* Corresponding ESRT field: LastAttemptStatus (not supported) */ ++ image_info[i].last_attempt_status = LAST_ATTEMPT_NOT_SUP; ++ ++ image_info[i].hardware_instance = DEFAULT_HW_INSTANCE; ++ image_info[i].dependencies = NULL; /* Not supported */ ++ } ++ ++ return EFI_SUCCESS; + } +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch deleted file mode 100644 index 8055d88c..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-arm-corstone1000-fix-unrecognized-filesystem-type.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 2351cdc3787cd8b06579dcb1986fe80a57dd2d6e Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Fri, 4 Mar 2022 15:56:09 +0000 -Subject: [PATCH] arm: corstone1000: fix unrecognized filesystem type - -Some usb sticks are not recognized by usb, just add a -delay before checking status. - -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - common/usb_storage.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/common/usb_storage.c b/common/usb_storage.c -index ac64275773..1d2680c3cd 100644 ---- a/common/usb_storage.c -+++ b/common/usb_storage.c -@@ -785,6 +785,9 @@ static int usb_stor_BBB_transport(struct scsi_cmd *srb, struct us_data *us) - st: - retry = 0; - again: -+ if (srb->cmd[0] == SCSI_TST_U_RDY) -+ mdelay(100); -+ - debug("STATUS phase\n"); - result = usb_bulk_msg(us->pusb_dev, pipein, csw, UMASS_BBB_CSW_SIZE, - &actlen, USB_CNTL_TIMEOUT*5); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-fwu_arm_psa-Add-staging-ABIs.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-fwu_arm_psa-Add-staging-ABIs.patch new file mode 100644 index 00000000..f29e8cc9 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0012-fwu_arm_psa-Add-staging-ABIs.patch @@ -0,0 +1,722 @@ +From 04274ddd1e05d9aed6130633a4cf712e1e5aafbb Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 6 Feb 2025 11:37:33 +0000 +Subject: [PATCH 12/36] fwu_arm_psa: Add staging ABIs + +Implement the ABIs and logic for updating images + +The staging process defined by the Platform Security Firmware +Update for the A-profile Arm Architecture specification [1] is +executed through the staging ABIs. + +The capsule should contain at least 3 payloads (2 dummy payloads +to indicate the start and the end of the staging process. In addition, one +or multiple payloads to write in the storage device). + +The implemented ABIs are as follows: + +FWU_BEGIN_STAGING +FWU_END_STAGING +FWU_CANCEL_STAGING +FWU_WRITE_STREAM + +[1]: DEN0118, 1.0 A: https://developer.arm.com/documentation/den0118/latest/ + +Signed-off-by: Abdellatif El Khlifi +Signed-off-by: Davidson kumaresan +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + include/efi_api.h | 3 + + include/efi_loader.h | 5 + + include/fwu_arm_psa.h | 130 ++++++++++++ + lib/efi_loader/efi_capsule.c | 24 ++- + lib/fwu_updates/fwu_arm_psa.c | 363 ++++++++++++++++++++++++++++++++++ + 5 files changed, 523 insertions(+), 2 deletions(-) + +diff --git a/include/efi_api.h b/include/efi_api.h +index eb61eafa028..1465b98310d 100644 +--- a/include/efi_api.h ++++ b/include/efi_api.h +@@ -25,6 +25,9 @@ + */ + #define EFI_SPECIFICATION_VERSION (2 << 16 | 110) + ++#define EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_VERSION 0x00000001 ++#define EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_VERSION 0x00000003 ++ + /* Types and defines for EFI CreateEvent */ + enum efi_timer_delay { + EFI_TIMER_STOP = 0, +diff --git a/include/efi_loader.h b/include/efi_loader.h +index 1d75d97ebbc..1899639450c 100644 +--- a/include/efi_loader.h ++++ b/include/efi_loader.h +@@ -385,6 +385,11 @@ extern const efi_guid_t smbios3_guid; + extern const efi_guid_t efi_guid_text_input_protocol; + extern const efi_guid_t efi_guid_text_output_protocol; + ++/*The current processed capsule */ ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++extern struct efi_capsule_header *g_capsule_data; ++#endif ++ + /** + * struct efi_open_protocol_info_item - open protocol info item + * +diff --git a/include/fwu_arm_psa.h b/include/fwu_arm_psa.h +index ba294359b5e..a8f0ff93d51 100644 +--- a/include/fwu_arm_psa.h ++++ b/include/fwu_arm_psa.h +@@ -40,6 +40,21 @@ + /* The entries correspond to the payloads in the storage device and the fake ESRT image */ + #define FWU_DIRECTORY_IMAGE_ENTRIES_COUNT (CONFIG_FWU_NUM_IMAGES_PER_BANK + 1) + ++/* ++ * GUIDs for dummy payloads ++ * ++ * The GUIDs are generated with the UUIDv5 format. ++ * Namespace: 7b5c472e-5671-4fb7-a824-36a8e86f05c1 ++ * Names: DUMMY_START, DUMMY_END ++ */ ++#define FWU_DUMMY_START_IMAGE_GUID \ ++ EFI_GUID(0x6f784cbf, 0x7938, 0x5c23, 0x8d, 0x6e, \ ++ 0x24, 0xd2, 0xf1, 0x41, 0x0f, 0xa9) ++ ++#define FWU_DUMMY_END_IMAGE_GUID \ ++ EFI_GUID(0xb57e432b, 0xa250, 0x5c73, 0x93, 0xe3, \ ++ 0x90, 0x20, 0x5e, 0x64, 0xba, 0xba) ++ + #define TS_RPC_MEM_RETRIEVE (0xff0001) + #define TS_RPC_SERVICE_INFO_GET (0xff0003) + #define RPC_SUCCESS (0) +@@ -62,7 +77,11 @@ + + enum fwu_abis { + FWU_DISCOVER = 0, ++ FWU_BEGIN_STAGING = 16, ++ FWU_END_STAGING = 17, ++ FWU_CANCEL_STAGING = 18, + FWU_OPEN = 19, ++ FWU_WRITE_STREAM = 20, + FWU_READ_STREAM = 21, + FWU_COMMIT = 22, + /* To be updated when adding new FWU IDs */ +@@ -82,6 +101,14 @@ enum fwu_abi_errcode { + MAX_NUMBER_FWU_ERR + }; + ++/* Enum to classify the possible type of payloads */ ++typedef enum { ++ FWU_PAYLOAD_TYPE_REAL = 1, ++ FWU_PAYLOAD_TYPE_DUMMY_START, ++ FWU_PAYLOAD_TYPE_DUMMY_END, ++ FWU_PAYLOAD_TYPE_INVALID, ++} fwu_payload_type; ++ + /* Container structure and helper macros to map between an FF-A error and relevant error log */ + struct fwu_abi_errmap { + char *err_str[MAX_NUMBER_FWU_ERR]; +@@ -173,6 +200,64 @@ struct __packed fwu_read_stream_resp { + u8 payload[]; + }; + ++/* ++ * struct fwu_begin_staging_args - fwu_begin_staging ABI arguments ++ * @function_id: fwu_begin_staging service ID ++ * @reserved: Reserved, must be zero ++ * @vendor_flags: Vendor specific staging flags ++ * @partial_update_count: The number of elements in the update_guid ++array ++ * @update_guid: An array of image type GUIDs that the update Client will update ++ * during the Staging state ++ */ ++struct __packed fwu_begin_staging_args { ++ u32 function_id; ++ u32 reserved; ++ u32 vendor_flags; ++ u32 partial_update_count; ++ efi_guid_t update_guid[]; ++}; ++ ++/* ++ * struct fwu_begin_staging_resp - fwu_begin_staging ABI returns ++ * @status: The ABI return status ++ */ ++struct __packed fwu_begin_staging_resp { ++ int status; ++}; ++ ++/* ++ * struct fwu_end_staging_args - fwu_end_staging ABI arguments ++ * @function_id: fwu_end_staging service ID state ++ */ ++struct __packed fwu_end_staging_args { ++ u32 function_id; ++}; ++ ++/* ++ * struct fwu_end_staging_resp - fwu_end_staging ABI returns ++ * @status: The ABI return status ++ */ ++struct __packed fwu_end_staging_resp { ++ int status; ++}; ++ ++/* ++ * struct fwu_cancel_staging_args - fwu_cancel_staging ABI arguments ++ * @function_id: fwu_cancel_staging service ID state ++ */ ++struct __packed fwu_cancel_staging_args { ++ u32 function_id; ++}; ++ ++/* ++ * struct fwu_cancel_staging_resp - fwu_cancel_staging ABI returns ++ * @status: The ABI return status ++ */ ++struct __packed fwu_cancel_staging_resp { ++ int status; ++}; ++ + /* + * struct fwu_commit_args - fwu_commit ABI arguments + * @function_id: fwu_commit service ID +@@ -204,6 +289,28 @@ struct __packed fwu_commit_resp { + u32 total_work; + }; + ++/* ++ * struct fwu_write_stream_args - fwu_write_stream ABI arguments ++ * @function_id: fwu_write_stream service ID ++ * @handle: The handle of the context being written to ++ * @data_len: Size of the data present in the payload ++ * @payload: The data to be transferred ++ */ ++struct __packed fwu_write_stream_args { ++ u32 function_id; ++ u32 handle; ++ u32 data_len; ++ u8 payload[]; ++}; ++ ++/* ++ * struct fwu_write_stream_resp - fwu_write_stream ABI returns ++ * @status: The ABI return status ++ */ ++struct __packed fwu_write_stream_resp { ++ int status; ++}; ++ + /* + * FWU directory information structures + */ +@@ -261,4 +368,27 @@ efi_status_t fwu_arm_psa_get_image_info(efi_uintn_t *image_info_size, + u32 *package_version, + u16 **package_version_name); + ++/** ++ * fwu_update_image() - Update an image ++ * ++ * Perform staging. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++int fwu_update_image(const void *image, u8 image_index, u32 image_size); ++ ++/** ++ * fwu_is_dummy_payload() - Identifies a dummy payload ++ * @image_index: The payload index ++ * ++ * Check whether the payload is dummy or not. ++ * ++ * Return: ++ * ++ * An enum value reflecting whether the payload is dummy or not. ++ */ ++fwu_payload_type fwu_get_payload_type(u32 image_index); ++ + #endif +diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c +index f8a4a7c6ef4..66efb24abf2 100644 +--- a/lib/efi_loader/efi_capsule.c ++++ b/lib/efi_loader/efi_capsule.c +@@ -14,6 +14,11 @@ + #include + #include + #include ++ ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++#include ++#endif ++ + #include + #include + #include +@@ -38,6 +43,10 @@ const efi_guid_t fwu_guid_os_request_fw_revert = + const efi_guid_t fwu_guid_os_request_fw_accept = + FWU_OS_REQUEST_FW_ACCEPT_GUID; + ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++ struct efi_capsule_header *g_capsule_data; ++#endif ++ + #define FW_ACCEPT_OS (u32)0x8000 + + #ifdef CONFIG_EFI_CAPSULE_ON_DISK +@@ -194,6 +203,12 @@ efi_fmp_find(efi_guid_t *image_type, u8 image_index, u64 instance, + continue; + fmp = fmp_handler->protocol_interface; + ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++ if (fwu_get_payload_type(image_index) != ++ FWU_PAYLOAD_TYPE_REAL) ++ return fmp; ++#endif ++ + /* get device's image info */ + info_size = 0; + image_info = NULL; +@@ -604,7 +619,7 @@ static efi_status_t efi_capsule_update_firmware( + capsule_size = capsule_data->capsule_image_size + - capsule_data->header_size; + +- if (capsule->version != 0x00000001) ++ if (capsule->version != EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_VERSION) + return EFI_UNSUPPORTED; + + handles = NULL; +@@ -615,6 +630,10 @@ static efi_status_t efi_capsule_update_firmware( + if (ret != EFI_SUCCESS) + return EFI_UNSUPPORTED; + ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++ g_capsule_data = capsule_data; ++#endif ++ + /* Payload */ + for (item = capsule->embedded_driver_count; + item < capsule->embedded_driver_count +@@ -629,7 +648,8 @@ static efi_status_t efi_capsule_update_firmware( + + image = (void *)capsule + capsule->item_offset_list[item]; + +- if (image->version != 0x00000003) { ++ if (image->version != ++ EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_VERSION) { + ret = EFI_UNSUPPORTED; + goto out; + } +diff --git a/lib/fwu_updates/fwu_arm_psa.c b/lib/fwu_updates/fwu_arm_psa.c +index b42d9f90e1e..042bf7a0898 100644 +--- a/lib/fwu_updates/fwu_arm_psa.c ++++ b/lib/fwu_updates/fwu_arm_psa.c +@@ -25,6 +25,7 @@ static u8 g_fwu_version_major; + static u8 g_fwu_version_minor; + static bool g_fwu_initialized; + struct fwu_image_directory g_fwu_cached_directory; ++efi_guid_t g_update_guid[CONFIG_FWU_NUM_IMAGES_PER_BANK]; + + /* Error mapping declarations */ + +@@ -60,6 +61,18 @@ static struct fwu_abi_errmap err_msg_map[FWU_ERRMAP_COUNT] = { + "FWU_NO_PERMISSION: The image cannot be read from", + }, + }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_WRITE_STREAM)] = { ++ { ++ [FWU_UNKNOWN] = ++ "FWU_UNKNOWN: Unrecognized handle", ++ [FWU_DENIED] = ++ "FWU_DENIED: The system is not in a Staging state", ++ [FWU_NO_PERMISSION] = ++ "FWU_NO_PERMISSION: The image cannot be written to", ++ [FWU_OUT_OF_BOUNDS] = ++ "FWU_OUT_OF_BOUNDS: less than data_len bytes available in the image", ++ }, ++ }, + [FWU_ID_TO_ERRMAP_ID(FWU_COMMIT)] = { + { + [FWU_UNKNOWN] = +@@ -72,6 +85,34 @@ static struct fwu_abi_errmap err_msg_map[FWU_ERRMAP_COUNT] = { + "FWU_RESUME: The Update Agent yielded", + }, + }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_BEGIN_STAGING)] = { ++ { ++ [FWU_UNKNOWN] = ++ "FWU_UNKNOWN: One of more GUIDs in the update_guid field are unknown to the Update Agent", ++ [FWU_DENIED] = ++ "FWU_DENIED: The Firmware Store is in the Trial state or the platform did not boot correctly", ++ [FWU_BUSY] = ++ "FWU_BUSY: The Client is temporarily prevented from entering the Staging state", ++ }, ++ }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_END_STAGING)] = { ++ { ++ [FWU_BUSY] = ++ "FWU_BUSY: There are open image handles", ++ [FWU_DENIED] = ++ "FWU_DENIED: The system is not in a Staging state", ++ [FWU_AUTH_FAIL] = ++ "FWU_AUTH_FAIL: At least one of the updated images fails to authenticate", ++ [FWU_NOT_AVAILABLE] = ++ "FWU_NOT_AVAILABLE: The Update Agent does not support partial updates", ++ }, ++ }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_CANCEL_STAGING)] = { ++ { ++ [FWU_DENIED] = ++ "FWU_DENIED: The system is not in a Staging state", ++ }, ++ }, + }; + + /** +@@ -129,6 +170,111 @@ static int fwu_print_error_log(u32 fwu_id, int fwu_errno) + return 0; + } + ++/** ++ * fwu_get_payload_type() - Identifies the payload type ++ * @image_index: The payload index ++ * ++ * Identifies the FWU payload type based on the image index. ++ * ++ * Return: ++ * ++ * FWU_PAYLOAD_TYPE_REAL for a real payload ++ * FWU_PAYLOAD_TYPE_DUMMY_START for the start of a dummy payload ++ * FWU_PAYLOAD_TYPE_DUMMY_END for the end of a dummy payload ++ * FWU_PAYLOAD_TYPE_INVALID for an invalid image_index ++ * ++ */ ++fwu_payload_type fwu_get_payload_type(u32 image_index) ++{ ++ efi_guid_t *image_guid = NULL; ++ int i; ++ struct efi_fw_image *fw_array; ++ ++ fw_array = update_info.images; ++ for (i = 0; i < update_info.num_images; i++) { ++ if (fw_array[i].image_index == image_index) { ++ image_guid = &fw_array[i].image_type_id; ++ break; ++ } ++ } ++ ++ if (!image_guid) ++ return FWU_PAYLOAD_TYPE_INVALID; ++ ++ if (!guidcmp(image_guid, ++ &((efi_guid_t)FWU_DUMMY_START_IMAGE_GUID))) ++ return FWU_PAYLOAD_TYPE_DUMMY_START; ++ ++ if (!guidcmp(image_guid, ++ &((efi_guid_t)FWU_DUMMY_END_IMAGE_GUID))) ++ return FWU_PAYLOAD_TYPE_DUMMY_END; ++ ++ return FWU_PAYLOAD_TYPE_REAL; ++} ++ ++/** ++ * fwu_get_capsule_guids() - Detect the payloads GUIDs in the caspsule ++ * @partial_update_count: A pointer to the number of payloads to update ++ * @update_guid: A pointer to a GUIDs array for the payloads to update ++ * ++ * Parse the current capsule and detect the payloads GUIDs. ++ * ++ * Return: ++ * ++ * EFI_SUCCESS is returned on success. Otherwise, failure ++ */ ++static efi_status_t fwu_get_capsule_guids(u32 *partial_update_count, ++ efi_guid_t saved_guids[]) ++{ ++ struct efi_firmware_management_capsule_header *capsule; ++ struct efi_firmware_management_capsule_image_header *image; ++ int item; ++ size_t capsule_size; ++ efi_status_t ret = EFI_SUCCESS; ++ ++ if (!saved_guids || !partial_update_count) ++ return EFI_INVALID_PARAMETER; ++ ++ *partial_update_count = 0; ++ capsule = (void *)g_capsule_data + g_capsule_data->header_size; ++ capsule_size = g_capsule_data->capsule_image_size ++ - g_capsule_data->header_size; ++ ++ /* Payload */ ++ for (item = capsule->embedded_driver_count; ++ item < capsule->embedded_driver_count ++ + capsule->payload_item_count; item++) { ++ /* sanity check */ ++ if ((capsule->item_offset_list[item] + sizeof(*image) ++ >= capsule_size)) { ++ ret = EFI_INVALID_PARAMETER; ++ log_err("FWU: Insufficient data, err (0x%lx)\n", ret); ++ break; ++ } ++ ++ image = (void *)capsule + capsule->item_offset_list[item]; ++ ++ if (image->version != ++ EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_VERSION) { ++ ret = EFI_UNSUPPORTED; ++ log_err("FWU: Version check failed, err (0x%lx)\n", ++ ret); ++ break; ++ } ++ ++ if (fwu_get_payload_type(image->update_image_index) != ++ FWU_PAYLOAD_TYPE_REAL) ++ continue; ++ ++ guidcpy(&saved_guids[*partial_update_count], ++ &image->update_image_type_id); ++ ++ (*partial_update_count)++; ++ } ++ ++ return ret; ++} ++ + /** + * fwu_invoke_svc() - FWU service call request + * @svc_id: FWU ABI function ID +@@ -372,6 +518,92 @@ static int fwu_read_stream(u32 handle, u8 *buffer, u32 buffer_size) + return ret; + } + ++/** ++ * fwu_begin_staging() - fwu_begin_staging ABI ++ * ++ * This call indicates to the Update Agent that a new staging process ++ * will commence. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_begin_staging(void) ++{ ++ struct fwu_begin_staging_args *args = g_fwu_buf; ++ struct fwu_begin_staging_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_BEGIN_STAGING"; ++ efi_status_t ret; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_BEGIN_STAGING; ++ ++ args->reserved = 0; ++ args->vendor_flags = 0; ++ ++ ret = fwu_get_capsule_guids(&args->partial_update_count, ++ args->update_guid); ++ if (ret) { ++ log_err("FWU: Failure to get the payloads GUIDs\n"); ++ return -ENODATA; ++ } ++ ++ log_info("FWU: Updating %d payload(s)\n", args->partial_update_count); ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ return fwu_invoke_svc(args->function_id, svc_name, ++ sizeof(*args), sizeof(*resp), NULL); ++} ++ ++/** ++ * fwu_end_staging() - fwu_end_staging ABI ++ * ++ * The Client informs the Update Agent that all the images, meant to be updated, ++ * have been transferred to the Update Agent and that the staging has ++ * terminated. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_end_staging(void) ++{ ++ struct fwu_end_staging_args *args = g_fwu_buf; ++ struct fwu_end_staging_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_END_STAGING"; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_END_STAGING; ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ return fwu_invoke_svc(args->function_id, svc_name, ++ sizeof(*args), sizeof(*resp), NULL); ++} ++ ++/** ++ * fwu_cancel_staging() - fwu_cancel_staging ABI ++ * ++ * The Client cancels the staging procedure and the system transitions back to ++ * the Regular state. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_cancel_staging(void) ++{ ++ struct fwu_cancel_staging_args *args = g_fwu_buf; ++ struct fwu_cancel_staging_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_CANCEL_STAGING"; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_CANCEL_STAGING; ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ return fwu_invoke_svc(args->function_id, svc_name, ++ sizeof(*args), sizeof(*resp), NULL); ++} ++ + /** + * fwu_commit() - fwu_commit ABI + * @handle: The handle of the context being closed +@@ -416,6 +648,137 @@ static int fwu_commit(u32 handle, u32 acceptance_req, u32 max_atomic_len) + return 0; + } + ++/** ++ * fwu_write_stream() - fwu_write_stream ABI ++ * @handle: The handle of the context being writen to ++ * @payload: The data to be transferred ++ * @payload_size: Size of the data present in the payload ++ * ++ * The call writes at most max_payload_size bytes to the Update Agent context ++ * pointed to by handle. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_write_stream(u32 handle, const u8 *payload, u32 payload_size) ++{ ++ int ret; ++ u32 write_size, max_write_size, curr_write_offset = 0; ++ u32 payload_bytes_left = payload_size, fwu_buf_bytes_left; ++ struct fwu_write_stream_args *args = g_fwu_buf; ++ struct fwu_write_stream_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_WRITE_STREAM"; ++ ++ if (!payload || !payload_size) ++ return -EINVAL; ++ ++ fwu_buf_bytes_left = FWU_BUFFER_SIZE - sizeof(*args); ++ ++ if (g_max_payload_size <= fwu_buf_bytes_left) ++ max_write_size = g_max_payload_size; ++ else ++ max_write_size = fwu_buf_bytes_left; ++ ++ while (curr_write_offset < payload_size) { ++ if (payload_bytes_left <= max_write_size) ++ write_size = payload_bytes_left; ++ else ++ write_size = max_write_size; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_WRITE_STREAM; ++ args->handle = handle; ++ args->data_len = write_size; ++ memcpy(args->payload, payload + curr_write_offset, write_size); ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ ret = fwu_invoke_svc(args->function_id, svc_name, sizeof(*args), ++ sizeof(*resp), NULL); ++ if (ret) ++ return ret; ++ ++ curr_write_offset += write_size; ++ payload_bytes_left -= write_size; ++ ++ log_debug("%s: %d bytes written, remaining %d bytes\n", ++ svc_name, write_size, payload_bytes_left); ++ } ++ ++ return ret; ++} ++ ++/** ++ * fwu_update_image() - Update an image ++ * ++ * Perform staging with multiple payloads support. ++ * The capsule is expected to: ++ * - Start with a dummy payload to mark the start of the payloads sequence ++ * - One or more payloads to be written to the storage device ++ * - End with a dummy payload to mark the end of the payloads sequence ++ * ++ * The possible payloads in the capsule are described in the board file ++ * through struct efi_fw_image. This includes the dummy payloads. ++ * The dummy payloads image indexes must be >= CONFIG_FWU_NUM_IMAGES_PER_BANK ++ * The dummy payloads are not sent to the Secure world and are not written to ++ * the storage device. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++int fwu_update_image(const void *image, u8 image_index, u32 image_size) ++{ ++ int ret; ++ u32 handle; ++ ++ if (!image) ++ return -EINVAL; ++ ++ /* Only image indexes starting from 1 are supported */ ++ if (!image_index || image_index > update_info.num_images) ++ return -EINVAL; ++ ++ if (fwu_get_payload_type(image_index) == ++ FWU_PAYLOAD_TYPE_DUMMY_START) { ++ return fwu_begin_staging(); ++ } ++ ++ if (fwu_get_payload_type(image_index) == ++ FWU_PAYLOAD_TYPE_DUMMY_END) { ++ ret = fwu_end_staging(); ++ if (ret) ++ goto cancel_staging; ++ return 0; ++ } ++ ++ ret = fwu_open(&g_fwu_cached_directory.entries[image_index - 1].image_guid, ++ FWU_OP_TYPE_WRITE, &handle); ++ if (ret) ++ goto cancel_staging; ++ ++ ret = fwu_write_stream(handle, image, image_size); ++ if (ret) ++ goto cancel_staging; ++ ++ /* ++ * The Update Agent can execute for an unbounded time. ++ * The image should be tried before being accepted. ++ * So, we put the acceptance request as 'not accepted'. ++ */ ++ ret = fwu_commit(handle, FWU_IMG_NOT_ACCEPTED, 0); ++ if (ret) ++ goto cancel_staging; ++ ++ log_debug("FWU: Image at index %d updated\n", image_index); ++ ++ return 0; ++ ++cancel_staging: ++ ++ return fwu_cancel_staging(); ++} ++ + /** + * fwu_read_directory() - Read FWU directory information + * +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-corstone1000-remove-guid-check-from-corst.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-corstone1000-remove-guid-check-from-corst.patch deleted file mode 100644 index fed13c6a..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-corstone1000-remove-guid-check-from-corst.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 42d0694494fdc549a989ca5a3924fdc82a4647c1 Mon Sep 17 00:00:00 2001 -From: Vishnu Banavath -Date: Sat, 11 Dec 2021 13:23:55 +0000 -Subject: [PATCH] efi_loader: corstone1000: remove guid check from corstone1000 - config option - -Use generic fmp guid and no separte check is required for -CORSTONE1000 target. - -Signed-off-by: Vishnu Banavath -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - lib/efi_loader/efi_capsule.c | 16 +--------------- - 1 file changed, 1 insertion(+), 15 deletions(-) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index ea084e4ed2..5314f529b4 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -852,12 +852,6 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule( - i, &capsule->capsule_guid); - - #if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -- if (guidcmp(&corstone1000_capsule_guid, &capsule->capsule_guid)) { -- ret = EFI_INVALID_PARAMETER; -- log_err("Corstone1000: Invalid capsule GUID\n"); -- goto out; -- } -- - if (efi_size_in_pages(capsule->capsule_image_size) > - CORSTONE1000_CAPSULE_BUFFER_SIZE) { - log_err("Corstone1000: Capsule data size exceeds the shared buffer size\n"); -@@ -883,15 +877,7 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule( - goto out; - #endif - -- if (!guidcmp(&capsule->capsule_guid, -- &efi_guid_firmware_management_capsule_id)) { -- ret = efi_capsule_update_firmware(capsule); -- } else { -- log_err("Unsupported capsule type: %pUs\n", -- &capsule->capsule_guid); -- ret = EFI_UNSUPPORTED; -- } -- -+ ret = efi_capsule_update_firmware(capsule); - if (ret != EFI_SUCCESS) - goto out; - } diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-fwu_arm_psa-Add-set_image-and-get_image_i.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-fwu_arm_psa-Add-set_image-and-get_image_i.patch new file mode 100644 index 00000000..bb05a5cf --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0013-efi_loader-fwu_arm_psa-Add-set_image-and-get_image_i.patch @@ -0,0 +1,111 @@ +From c4cf3e3a2869502c9ffadaa2121ab5cd05f3712f Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Wed, 18 Dec 2024 15:14:24 +0000 +Subject: [PATCH 13/36] efi_loader: fwu_arm_psa: Add set_image and + get_image_info support + +Implement set_image and get_image_info through RAW functions + +The implementation is done using efi_firmware_raw_set_image() +and efi_firmware_get_image_info() + +Signed-off-by: Abdellatif El Khlifi +Signed-off-by: Davidson kumaresan +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + lib/efi_loader/efi_firmware.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c +index 5a754c9cd03..de2357acbd7 100644 +--- a/lib/efi_loader/efi_firmware.c ++++ b/lib/efi_loader/efi_firmware.c +@@ -4,6 +4,12 @@ + * + * Copyright (c) 2020 Linaro Limited + * Author: AKASHI Takahiro ++ * ++ * Copyright 2025 Arm Limited and/or its affiliates ++ * ++ * Authors: ++ * Abdellatif El Khlifi ++ * Davidson kumaresan + */ + + #define LOG_CATEGORY LOGC_EFI +@@ -13,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -194,6 +201,7 @@ static void efi_firmware_get_lsv_from_dtb(u8 image_index, + } + } + ++#if !CONFIG_IS_ENABLED(FWU_ARM_PSA) + /** + * efi_firmware_fill_version_info - fill the version information + * @image_info: Image information +@@ -375,6 +383,7 @@ static efi_status_t efi_fill_image_desc_array( + + return EFI_SUCCESS; + } ++#endif + + /** + * efi_firmware_capsule_authenticate - authenticate the capsule if enabled +@@ -605,10 +614,17 @@ efi_status_t EFIAPI efi_firmware_get_image_info( + !descriptor_size || !package_version || !package_version_name)) + return EFI_EXIT(EFI_INVALID_PARAMETER); + ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++ ret = fwu_arm_psa_get_image_info(image_info_size, image_info, ++ descriptor_version, descriptor_count, ++ descriptor_size, ++ package_version, package_version_name); ++#else + ret = efi_fill_image_desc_array(image_info_size, image_info, + descriptor_version, descriptor_count, + descriptor_size, package_version, + package_version_name); ++#endif + + return EFI_EXIT(ret); + } +@@ -713,8 +729,10 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( + efi_status_t (*progress)(efi_uintn_t completion), + u16 **abort_reason) + { ++#if !CONFIG_IS_ENABLED(FWU_ARM_PSA) + int ret; + u8 dfu_alt_num; ++#endif + efi_status_t status; + struct fmp_state state = { 0 }; + +@@ -729,6 +747,10 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( + if (status != EFI_SUCCESS) + return EFI_EXIT(status); + ++#if CONFIG_IS_ENABLED(FWU_ARM_PSA) ++ if (fwu_update_image(image, image_index, image_size)) ++ return EFI_EXIT(EFI_DEVICE_ERROR); ++#else + /* + * dfu_alt_num is assigned from 0 while image_index starts from 1. + * dfu_alt_num is calculated by (image_index - 1) when multi bank update +@@ -751,6 +773,8 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( + NULL, NULL)) + return EFI_EXIT(EFI_DEVICE_ERROR); + ++#endif ++ + efi_firmware_set_fmp_state_var(&state, image_index); + + return EFI_EXIT(EFI_SUCCESS); +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-fwu_arm_psa-Keep-the-FMP-payload-header.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-fwu_arm_psa-Keep-the-FMP-payload-header.patch new file mode 100644 index 00000000..1b7a8297 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-fwu_arm_psa-Keep-the-FMP-payload-header.patch @@ -0,0 +1,34 @@ +From e2b35f2520ba80c55c96b70bcc2a927cb0d20c75 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Fri, 24 Jan 2025 15:13:39 +0000 +Subject: [PATCH 14/36] efi_loader: fwu_arm_psa: Keep the FMP payload header + +Allow sending the payload with its FMP header + +The Secure world needs the data provided by the payload +FMP header. So, let's keep it in case of FWU_ARM_PSA. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + lib/efi_loader/efi_firmware.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c +index de2357acbd7..d1ec7b9427b 100644 +--- a/lib/efi_loader/efi_firmware.c ++++ b/lib/efi_loader/efi_firmware.c +@@ -523,8 +523,10 @@ static void efi_firmware_get_fw_version(const void **p_image, + /* FMP header is inserted above the capsule payload */ + state->fw_version = header->fw_version; + ++#if !CONFIG_IS_ENABLED(FWU_ARM_PSA) + *p_image += header->header_size; + *p_image_size -= header->header_size; ++#endif + } + } + +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch deleted file mode 100644 index 31c19e14..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0014-efi_loader-populate-ESRT-table-if-EFI_ESRT-config-op.patch +++ /dev/null @@ -1,34 +0,0 @@ -From a368e6a94382bb88f3603107d14ff3af0fb4eaa2 Mon Sep 17 00:00:00 2001 -From: Vishnu Banavath -Date: Fri, 17 Dec 2021 19:49:02 +0000 -Subject: [PATCH] efi_loader: populate ESRT table if EFI_ESRT config option is - set - -This change is to call efi_esrt_populate function if CONFIG_EFI_ESRT -is set. This will populte esrt table with firmware image info - -Signed-off-by: Vishnu Banavath -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - lib/efi_loader/efi_capsule.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index 5314f529b4..6a06605ad9 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -874,6 +874,13 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule( - ret = EFI_SUCCESS; - } - -+ if (IS_ENABLED(CONFIG_EFI_ESRT)) { -+ /* Rebuild the ESRT to reflect any updated FW images. */ -+ ret = efi_esrt_populate(); -+ if (ret != EFI_SUCCESS) -+ log_warning("EFI Capsule: failed to update ESRT\n"); -+ } -+ - goto out; - #endif - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_firmware-add-get_image_info-for-corstone1000.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_firmware-add-get_image_info-for-corstone1000.patch deleted file mode 100644 index c7ecfe89..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_firmware-add-get_image_info-for-corstone1000.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 972ed0e27cce6d2822055f31e336213043bcb1f3 Mon Sep 17 00:00:00 2001 -From: Vishnu Banavath -Date: Fri, 17 Dec 2021 19:50:25 +0000 -Subject: [PATCH] efi_firmware: add get_image_info for corstone1000 - -This change is to populate get_image_info which eventually -will be populated in ESRT table - -Signed-off-by: Vishnu Banavath -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - lib/efi_loader/efi_firmware.c | 72 ++++++++++++++++++++++++++++++++++- - 1 file changed, 71 insertions(+), 1 deletion(-) - -diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c -index 93e2b01c07..0a38a96351 100644 ---- a/lib/efi_loader/efi_firmware.c -+++ b/lib/efi_loader/efi_firmware.c -@@ -18,11 +18,69 @@ - - #define FMP_PAYLOAD_HDR_SIGNATURE SIGNATURE_32('M', 'S', 'S', '1') - -+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -+#define EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID \ -+ EFI_GUID(0xe2bb9c06, 0x70e9, 0x4b14, 0x97, 0xa3, \ -+ 0x5a, 0x79, 0x13, 0x17, 0x6e, 0x3f) -+ -+ const efi_guid_t efi_firmware_image_type_uboot_raw = -+ EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID; -+ -+static efi_status_t efi_corstone1000_img_info_get ( -+ efi_uintn_t *image_info_size, -+ struct efi_firmware_image_descriptor *image_info, -+ u32 *descriptor_version, -+ u8 *descriptor_count, -+ efi_uintn_t *descriptor_size, -+ u32 *package_version, -+ u16 **package_version_name, -+ const efi_guid_t *image_type) -+{ -+ int i = 0; -+ -+ *image_info_size = sizeof(*image_info); -+ *descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION; -+ *descriptor_count = 1;//dfu_num; -+ *descriptor_size = sizeof(*image_info); -+ if (package_version) -+ *package_version = 0xffffffff; /* not supported */ -+ if(package_version_name) -+ *package_version_name = NULL; /* not supported */ -+ -+ if(image_info == NULL) { -+ log_warning("image_info is null\n"); -+ return EFI_BUFFER_TOO_SMALL; -+ } -+ -+ image_info[i].image_index = i; -+ image_info[i].image_type_id = *image_type; -+ image_info[i].image_id = 0; -+ image_info[i].image_id_name = "wic"; -+ image_info[i].version = 1; -+ image_info[i].version_name = NULL; -+ image_info[i].size = 0x1000; -+ image_info[i].attributes_supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | -+ IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED; -+ image_info[i].attributes_setting = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE; -+ /* Check if the capsule authentication is enabled */ -+ if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE)) -+ image_info[0].attributes_setting |= -+ IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED; -+ image_info[i].lowest_supported_image_version = 0; -+ image_info[i].last_attempt_version = 0; -+ image_info[i].last_attempt_status = LAST_ATTEMPT_STATUS_SUCCESS; -+ image_info[i].hardware_instance = 1; -+ image_info[i].dependencies = NULL; -+ -+ return EFI_SUCCESS; -+} -+#endif -+ - /** - * struct fmp_payload_header - EDK2 header for the FMP payload - * - * This structure describes the header which is preprended to the -- * FMP payload by the edk2 capsule generation scripts. -+ * FMP payload by the edk1 capsule generation scripts. - * - * @signature: Header signature used to identify the header - * @header_size: Size of the structure -@@ -286,10 +344,18 @@ efi_status_t EFIAPI efi_firmware_get_image_info( - !descriptor_size || !package_version || !package_version_name)) - return EFI_EXIT(EFI_INVALID_PARAMETER); - -+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -+ ret = efi_corstone1000_img_info_get(image_info_size, image_info, -+ descriptor_version, descriptor_count, -+ descriptor_size, -+ package_version, package_version_name, -+ &efi_firmware_image_type_uboot_raw); -+#else - ret = efi_fill_image_desc_array(image_info_size, image_info, - descriptor_version, descriptor_count, - descriptor_size, package_version, - package_version_name); -+#endif - - return EFI_EXIT(ret); - } -@@ -415,6 +481,10 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( - } - } - -+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -+ return EFI_EXIT(EFI_SUCCESS); -+#endif -+ - if (dfu_write_by_alt(image_index - 1, (void *)image, image_size, - NULL, NULL)) - return EFI_EXIT(EFI_DEVICE_ERROR); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_loader-fwu_arm_psa-Skip-accepting-the-payload-af.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_loader-fwu_arm_psa-Skip-accepting-the-payload-af.patch new file mode 100644 index 00000000..ee7cab83 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0015-efi_loader-fwu_arm_psa-Skip-accepting-the-payload-af.patch @@ -0,0 +1,46 @@ +From 5b6c64f927e21bd9b77754e16e1976cab63831ff Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Fri, 24 Jan 2025 15:26:57 +0000 +Subject: [PATCH 15/36] efi_loader: fwu_arm_psa: Skip accepting the payload + after set_image() + +Do not update the acceptance metadata bit after updating an image + +The update agent (secure world) is responsible of setting the acceptance +bit in the metadata. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + lib/efi_loader/efi_capsule.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c +index 66efb24abf2..9221cafb844 100644 +--- a/lib/efi_loader/efi_capsule.c ++++ b/lib/efi_loader/efi_capsule.c +@@ -4,6 +4,11 @@ + * + * Copyright (c) 2018 Linaro Limited + * Author: AKASHI Takahiro ++ * ++ * Copyright 2025 Arm Limited and/or its affiliates ++ * ++ * Author: ++ * Abdellatif El Khlifi + */ + + #define LOG_CATEGORY LOGC_EFI +@@ -701,7 +706,8 @@ static efi_status_t efi_capsule_update_firmware( + goto out; + } + +- if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) { ++ if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE) && ++ !IS_ENABLED(CONFIG_FWU_ARM_PSA)) { + image_type_id = &image->update_image_type_id; + if (!fw_accept_os) { + /* +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fix-null-pointer-exception-with-get_image.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fix-null-pointer-exception-with-get_image.patch deleted file mode 100644 index 694d8534..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fix-null-pointer-exception-with-get_image.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 75ace03c24d92a206957a1a2392eab3c892cf960 Mon Sep 17 00:00:00 2001 -From: Vishnu Banavath -Date: Fri, 14 Jan 2022 15:24:18 +0000 -Subject: [PATCH] efi_loader: fix null pointer exception with get_image_info - -get_img_info API implemented for corstone1000 target does not -check the input attributes and as a result uboot crash's with -null pointer access. This change is to fix the null pointer -exception. - -Signed-off-by: Vishnu Banavath -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - lib/efi_loader/efi_firmware.c | 19 +++++++++++-------- - 1 file changed, 11 insertions(+), 8 deletions(-) - -diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c -index 0a38a96351..c883e2ff0a 100644 ---- a/lib/efi_loader/efi_firmware.c -+++ b/lib/efi_loader/efi_firmware.c -@@ -39,26 +39,29 @@ static efi_status_t efi_corstone1000_img_info_get ( - int i = 0; - - *image_info_size = sizeof(*image_info); -- *descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION; -- *descriptor_count = 1;//dfu_num; -- *descriptor_size = sizeof(*image_info); -+ if(descriptor_version) -+ *descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION; -+ if(descriptor_count) -+ *descriptor_count = 1; -+ if(descriptor_size) -+ *descriptor_size = sizeof(*image_info); - if (package_version) - *package_version = 0xffffffff; /* not supported */ - if(package_version_name) - *package_version_name = NULL; /* not supported */ - - if(image_info == NULL) { -- log_warning("image_info is null\n"); -+ log_debug("image_info is null\n"); - return EFI_BUFFER_TOO_SMALL; - } - -- image_info[i].image_index = i; -+ image_info[i].image_index = 1; - image_info[i].image_type_id = *image_type; - image_info[i].image_id = 0; -- image_info[i].image_id_name = "wic"; -- image_info[i].version = 1; -+ image_info[i].image_id_name = L"wic image"; -+ image_info[i].version = 0; - image_info[i].version_name = NULL; -- image_info[i].size = 0x1000; -+ image_info[i].size = 0; - image_info[i].attributes_supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | - IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED; - image_info[i].attributes_setting = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE; diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fwu-fwu_arm_psa-Disable-trial-state-handl.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fwu-fwu_arm_psa-Disable-trial-state-handl.patch new file mode 100644 index 00000000..26263f33 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0016-efi_loader-fwu-fwu_arm_psa-Disable-trial-state-handl.patch @@ -0,0 +1,71 @@ +From 9b381a19ec3437d4bdc3fd922084a39331f29a3d Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 20 Mar 2025 15:05:08 +0000 +Subject: [PATCH 16/36] efi_loader: fwu: fwu_arm_psa: Disable trial state + handling + +No need for trial state handling in U-Boot for FWU Arm PSA + +In FWU Arm PSA mode, trial state is handled by Secure world. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + lib/efi_loader/efi_capsule.c | 7 +++++-- + lib/fwu_updates/fwu.c | 8 +++++++- + 2 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c +index 9221cafb844..e01f2a5f8a8 100644 +--- a/lib/efi_loader/efi_capsule.c ++++ b/lib/efi_loader/efi_capsule.c +@@ -586,7 +586,9 @@ static efi_status_t efi_capsule_update_firmware( + if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) { + if (fwu_empty_capsule(capsule_data)) { + if (fwu_empty_capsule_checks_pass()) { +- return fwu_empty_capsule_process(capsule_data); ++ return !IS_ENABLED(CONFIG_FWU_ARM_PSA) ? ++ fwu_empty_capsule_process(capsule_data) : ++ 0; + } else { + log_err("FWU empty capsule checks failed. Cannot start update\n"); + return EFI_INVALID_PARAMETER; +@@ -1399,7 +1401,8 @@ efi_status_t efi_launch_capsules(void) + + efi_capsule_scan_done(); + +- if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) { ++ if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE) && ++ !IS_ENABLED(CONFIG_FWU_ARM_PSA)) { + if (capsule_update == true && update_status == true) { + ret = fwu_post_update_process(fw_accept_os); + } else if (capsule_update == true && update_status == false) { +diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c +index 7f085a0211f..9e6511b4da0 100644 +--- a/lib/fwu_updates/fwu.c ++++ b/lib/fwu_updates/fwu.c +@@ -340,6 +340,11 @@ int fwu_get_mdata(struct fwu_mdata *mdata) + if (parts_ok[i]) + continue; + ++ if (IS_ENABLED(CONFIG_FWU_ARM_PSA)) { ++ log_err("FWU metadata copy %d invalid\n", i); ++ return -ENOTSYNC; ++ } ++ + memcpy(parts_mdata[i], parts_mdata[1 - i], mdata_size); + err = fwu_sync_mdata(parts_mdata[i], i ? SECONDARY_PART : PRIMARY_PART); + if (err) { +@@ -765,7 +770,8 @@ static int fwu_boottime_checks(void) + + in_trial = in_trial_state(); + +- ret = in_trial ? fwu_trial_count_update() : trial_counter_update(NULL); ++ ret = (in_trial && !IS_ENABLED(CONFIG_FWU_ARM_PSA)) ? ++ fwu_trial_count_update() : trial_counter_update(NULL); + + if (!ret) + boottime_check = 1; +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-arm-corstone1000-add-mmc-for-fvp.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-arm-corstone1000-add-mmc-for-fvp.patch deleted file mode 100644 index 1326e7c9..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-arm-corstone1000-add-mmc-for-fvp.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 7dec0707573062aba859e4cd3be073c24b112efa Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Mon, 17 Jul 2023 16:50:53 +0100 -Subject: [PATCH] arm:corstone1000: add mmc for fvp - -Enable support mmc/sdcard for the corstone1000 FVP. - -Signed-off-by: Vishnu Banavath -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - board/armltd/corstone1000/corstone1000.c | 28 +++++++++++++++++++----- - configs/corstone1000_defconfig | 9 ++++++-- - include/configs/corstone1000.h | 4 +++- - 3 files changed, 32 insertions(+), 9 deletions(-) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index c840290885..ecfd8366df 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -39,19 +39,35 @@ static struct mm_region corstone1000_mem_map[] = { - }, { - /* USB */ - .virt = 0x40200000UL, -- .phys = 0x40200000UL, -+ .phys = 0x40200000UL, -+ .size = 0x00100000UL, -+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | -+ PTE_BLOCK_NON_SHARE | -+ PTE_BLOCK_PXN | PTE_BLOCK_UXN -+ }, { -+ /* MMC0 */ -+ .virt = 0x40300000UL, -+ .phys = 0x40300000UL, - .size = 0x00100000UL, - .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | -- PTE_BLOCK_NON_SHARE | -- PTE_BLOCK_PXN | PTE_BLOCK_UXN -+ PTE_BLOCK_NON_SHARE | -+ PTE_BLOCK_PXN | PTE_BLOCK_UXN - }, { - /* ethernet */ - .virt = 0x40100000UL, -- .phys = 0x40100000UL, -+ .phys = 0x40100000UL, -+ .size = 0x00100000UL, -+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | -+ PTE_BLOCK_NON_SHARE | -+ PTE_BLOCK_PXN | PTE_BLOCK_UXN -+ }, { -+ /* MMC1 */ -+ .virt = 0x50000000UL, -+ .phys = 0x50000000UL, - .size = 0x00100000UL, - .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | -- PTE_BLOCK_NON_SHARE | -- PTE_BLOCK_PXN | PTE_BLOCK_UXN -+ PTE_BLOCK_NON_SHARE | -+ PTE_BLOCK_PXN | PTE_BLOCK_UXN - }, { - /* OCVM */ - .virt = 0x80000000UL, -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 40ba415ecb..76158fc37d 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -40,8 +40,13 @@ CONFIG_VERSION_VARIABLE=y - CONFIG_NET_RANDOM_ETHADDR=y - CONFIG_REGMAP=y - CONFIG_MISC=y --# CONFIG_MMC is not set --CONFIG_NVMXIP_QSPI=y -+CONFIG_CLK=y -+CONFIG_CMD_MMC=y -+CONFIG_DM_MMC=y -+CONFIG_ARM_PL180_MMCI=y -+CONFIG_MMC_SDHCI_ADMA_HELPERS=y -+CONFIG_MMC_WRITE=y -+CONFIG_DM_GPIO=y - CONFIG_PHYLIB=y - CONFIG_PHY_SMSC=y - CONFIG_SMC911X=y -diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h -index 8927b09499..1466507f80 100644 ---- a/include/configs/corstone1000.h -+++ b/include/configs/corstone1000.h -@@ -49,7 +49,9 @@ - #define CFG_SYS_SDRAM_BASE PHYS_SDRAM_1 - - #define BOOT_TARGET_DEVICES(func) \ -- func(USB, usb, 0) -+ func(USB, usb, 0) \ -+ func(MMC, mmc, 0) \ -+ func(MMC, mmc, 1) - - #include - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-fwu_arm_psa-Add-FWU-acceptance-mechanism.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-fwu_arm_psa-Add-FWU-acceptance-mechanism.patch new file mode 100644 index 00000000..9fdcd1a6 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0017-fwu_arm_psa-Add-FWU-acceptance-mechanism.patch @@ -0,0 +1,310 @@ +From c7df14add690e18645fdfea2c7e8ee5f2b8239c1 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 20 Mar 2025 15:09:27 +0000 +Subject: [PATCH 17/36] fwu_arm_psa: Add FWU acceptance mechanism + +Accept the FWU at ExitBootServices() + +Provide the FWU_ACCEPT_IMAGE ABI and setup an event triggered +on ExitBootServices(). +This mechanism notifies Secure world that the system booted +successfully by accepting the images in trial state. + +Also, add FWU_ARM_PSA_ACCEPT_IMAGES config +to allow platforms to switch off image acceptance +in ExitBootServices(). + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + include/fwu_arm_psa.h | 22 +++- + lib/fwu_updates/Kconfig | 8 ++ + lib/fwu_updates/fwu_arm_psa.c | 183 ++++++++++++++++++++++++++++++++++ + 3 files changed, 212 insertions(+), 1 deletion(-) + +diff --git a/include/fwu_arm_psa.h b/include/fwu_arm_psa.h +index a8f0ff93d51..451d8b614e3 100644 +--- a/include/fwu_arm_psa.h ++++ b/include/fwu_arm_psa.h +@@ -84,9 +84,10 @@ enum fwu_abis { + FWU_WRITE_STREAM = 20, + FWU_READ_STREAM = 21, + FWU_COMMIT = 22, ++ FWU_ACCEPT_IMAGE = 23, + /* To be updated when adding new FWU IDs */ + FWU_FIRST_ID = FWU_DISCOVER, /* Lowest number ID */ +- FWU_LAST_ID = FWU_COMMIT, /* Highest number ID */ ++ FWU_LAST_ID = FWU_ACCEPT_IMAGE, /* Highest number ID */ + }; + + enum fwu_abi_errcode { +@@ -311,6 +312,25 @@ struct __packed fwu_write_stream_resp { + int status; + }; + ++/* ++ * struct fwu_accept_image_args - fwu_accept_image ABI arguments ++ * @function_id: fwu_accept_image service ID ++ * @image_type_guid: GUID of the image to be accepted ++ */ ++struct __packed fwu_accept_image_args { ++ u32 function_id; ++ u32 reserved; ++ efi_guid_t image_type_guid; ++}; ++ ++/* ++ * struct fwu_accept_image_resp - fwu_accept_image ABI returns ++ * @status: The ABI return status ++ */ ++struct __packed fwu_accept_image_resp { ++ int status; ++}; ++ + /* + * FWU directory information structures + */ +diff --git a/lib/fwu_updates/Kconfig b/lib/fwu_updates/Kconfig +index cdc96109f0a..958e54dec37 100644 +--- a/lib/fwu_updates/Kconfig ++++ b/lib/fwu_updates/Kconfig +@@ -57,6 +57,14 @@ config FWU_ARM_PSA + driver that supports the Arm PSA firmware update specification as + mentioned in https://developer.arm.com/documentation/den0118/a/ + ++config FWU_ARM_PSA_ACCEPT_IMAGES ++ bool "Accept images at EFI ExitBootServices() level" ++ depends on FWU_ARM_PSA ++ default y ++ help ++ Select this option if reaching ExitBootServices() level means the boot succeeded ++ This option will add a callback at ExitBootServices() that accepts all the images. ++ + config FWU_BUFFER_PAGES + int "Number of 4KB pages in the FWU shared buffer" + depends on FWU_ARM_PSA +diff --git a/lib/fwu_updates/fwu_arm_psa.c b/lib/fwu_updates/fwu_arm_psa.c +index 042bf7a0898..40746eee6ce 100644 +--- a/lib/fwu_updates/fwu_arm_psa.c ++++ b/lib/fwu_updates/fwu_arm_psa.c +@@ -8,6 +8,7 @@ + */ + #include + #include ++#include + #include + #include + #include +@@ -113,6 +114,14 @@ static struct fwu_abi_errmap err_msg_map[FWU_ERRMAP_COUNT] = { + "FWU_DENIED: The system is not in a Staging state", + }, + }, ++ [FWU_ID_TO_ERRMAP_ID(FWU_ACCEPT_IMAGE)] = { ++ { ++ [FWU_UNKNOWN] = ++ "FWU_UNKNOWN: Image with type=image_type_guid is not managed by the Update Agent", ++ [FWU_DENIED] = ++ "FWU_DENIED: The system has not booted with the active bank, or the image cannot be accepted before being activated", ++ }, ++ }, + }; + + /** +@@ -708,6 +717,36 @@ static int fwu_write_stream(u32 handle, const u8 *payload, u32 payload_size) + return ret; + } + ++/** ++ * fwu_accept() - fwu_accept_image ABI ++ * @guid: GUID of the image to be accepted ++ * ++ * Sets the status of the firmware image, with a given GUID ++ * to "accepted" in the active firmware bank. ++ * ++ * Return: ++ * ++ * 0 on success. Otherwise, failure ++ */ ++static int fwu_accept(const efi_guid_t *guid) ++{ ++ struct fwu_accept_image_args *args = g_fwu_buf; ++ struct fwu_accept_image_resp *resp = g_fwu_buf; ++ char *svc_name = "FWU_ACCEPT_IMAGE"; ++ ++ if (!guid) ++ return -EINVAL; ++ ++ /* Filling the arguments in the shared buffer */ ++ args->function_id = FWU_ACCEPT_IMAGE; ++ ++ guidcpy(&args->image_type_guid, guid); ++ ++ /* Executing the FWU ABI through the FF-A bus */ ++ return fwu_invoke_svc(args->function_id, svc_name, ++ sizeof(*args), sizeof(*resp), NULL); ++} ++ + /** + * fwu_update_image() - Update an image + * +@@ -1051,6 +1090,144 @@ failure: + return ret; + } + ++/** ++ * fwu_one_image_accepted() - Accept one image in trial state ++ * @img_entry: Pointer to the image entry. ++ * @active_idx: Active bank index. ++ * @image_number: Image number for logging purposes. ++ * ++ * Invoke FWU accept image ABI to accept the image. ++ * ++ * Return: ++ * ++ * true is returned on success, false on failure. ++ */ ++static bool fwu_one_image_accepted(const struct fwu_image_entry *img_entry, ++ u32 active_idx, ++ u32 image_number) ++{ ++ const struct fwu_image_bank_info *bank_info = ++ &img_entry->img_bank_info[active_idx]; ++ int fwu_ret; ++ ++ if (!bank_info->accepted) { ++ fwu_ret = fwu_accept(&bank_info->image_guid); ++ if (fwu_ret) { ++ log_err("FWU: Failed to accept image #%d\n", ++ image_number + 1); ++ return false; ++ } ++ log_debug("FWU: Image #%d accepted\n", image_number + 1); ++ } ++ ++ return true; ++} ++ ++/** ++ * fwu_all_images_accepted() - Accept any pending firmware update images ++ * @fwu_data: Pointer to FWU data structure ++ * ++ * Read from the metadata the acceptance state of each image. ++ * Then, accept the images which are not accepted yet. ++ * ++ * Return: ++ * ++ * true is returned on success, false on failure. ++ */ ++static bool fwu_all_images_accepted(const struct fwu_data *fwu_data) ++{ ++ int fwu_ret; ++ u32 active_idx; ++ u32 i; ++ bool accepted; ++ ++ fwu_ret = fwu_get_active_index(&active_idx); ++ if (fwu_ret) { ++ log_err("FWU: Failed to read boot index, err (%d)\n", ++ fwu_ret); ++ return false; ++ } ++ ++ for (i = 0 ; i < CONFIG_FWU_NUM_IMAGES_PER_BANK ; i++) { ++ accepted = fwu_one_image_accepted(&fwu_data->fwu_images[i], active_idx, i); ++ if (!accepted) ++ return false; ++ } ++ ++ return true; ++} ++ ++/** ++ * fwu_accept_notify_exit_boot_services() - ExitBootServices callback ++ * ++ * @event: callback event ++ * @context: callback context ++ * ++ * Reaching ExitBootServices() level means the boot succeeded. ++ * So, accept all the images. ++ * ++ * Return: ++ * ++ * EFI_SUCCESS on success. Otherwise, failure ++ */ ++static void EFIAPI fwu_accept_notify_exit_boot_services(struct efi_event *event, ++ void *context) ++{ ++ efi_status_t efi_ret = EFI_SUCCESS; ++ bool all_accepted; ++ struct fwu_data *fwu_data; ++ ++ EFI_ENTRY("%p, %p", event, context); ++ ++ fwu_data = fwu_get_data(); ++ if (!fwu_data) { ++ log_err("FWU: Cannot get FWU data\n"); ++ efi_ret = EFI_INVALID_PARAMETER; ++ goto out; ++ } ++ ++ if (fwu_data->trial_state) { ++ all_accepted = fwu_all_images_accepted(fwu_data); ++ if (!all_accepted) { ++ efi_ret = EFI_ACCESS_DENIED; ++ goto out; ++ } ++ ++ } else { ++ log_info("FWU: ExitBootServices: Booting in regular state\n"); ++ } ++ ++out: ++ EFI_EXIT(efi_ret); ++} ++ ++/** ++ * fwu_setup_accept_event() - Setup the FWU accept event ++ * ++ * Create a FWU accept event triggered on ExitBootServices(). ++ * ++ * Return: ++ * ++ * 0 is returned on success. Otherwise, failure ++ */ ++static int fwu_setup_accept_event(void) ++{ ++ efi_status_t efi_ret; ++ struct efi_event *evt = NULL; ++ ++ efi_ret = efi_create_event(EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_CALLBACK, ++ fwu_accept_notify_exit_boot_services, NULL, ++ &efi_guid_event_group_exit_boot_services, ++ &evt); ++ if (efi_ret != EFI_SUCCESS) { ++ log_err("FWU: Cannot install accept event %p, err (%lu)\n", evt, ++ efi_ret); ++ return -EPERM; ++ } ++ ++ return 0; ++} ++ + /** + * fwu_agent_init() - Setup the FWU agent + * +@@ -1105,6 +1282,12 @@ int fwu_agent_init(void) + if (ret) + goto failure; + ++ if (IS_ENABLED(CONFIG_FWU_ARM_PSA_ACCEPT_IMAGES)) { ++ ret = fwu_setup_accept_event(); ++ if (ret) ++ goto failure; ++ } ++ + g_fwu_initialized = true; + + return 0; +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-corstone1000-add-compressed-kernel-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-corstone1000-add-compressed-kernel-support.patch deleted file mode 100644 index af87a4a5..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-corstone1000-add-compressed-kernel-support.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 67f9f4dbb58a9213232523a433cd6d7c50eeadc7 Mon Sep 17 00:00:00 2001 -From: Jon Mason -Date: Wed, 30 Nov 2022 18:59:59 +0000 -Subject: [PATCH] corstone1000: add compressed kernel support - -The corstone1000 kernel has become too large to fit in the available -storage. Swtiching to a compressed kernel avoids the problem, but -requires uncompressing it. Add this decompression to the default boot -instructions. - -Signed-off-by: Jon Mason -Signed-off-by: Abdellatif El Khlifi -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Rui Miguel Silva ---- - configs/corstone1000_defconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 76158fc37d..a92668389a 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -15,7 +15,7 @@ CONFIG_DISTRO_DEFAULTS=y - CONFIG_BOOTDELAY=3 - CONFIG_USE_BOOTARGS=y - CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9 ip=dhcp earlyprintk" --CONFIG_BOOTCOMMAND="run retrieve_kernel_load_addr; echo Loading kernel from $kernel_addr to memory ... ; loadm $kernel_addr $kernel_addr_r 0xc00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" -+CONFIG_BOOTCOMMAND="run retrieve_kernel_load_addr; echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r 0xf00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" - CONFIG_CONSOLE_RECORD=y - CONFIG_LOGLEVEL=7 - # CONFIG_DISPLAY_CPUINFO is not set diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-fwu_arm_psa-Add-ESRT-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-fwu_arm_psa-Add-ESRT-support.patch new file mode 100644 index 00000000..40af11ee --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0018-fwu_arm_psa-Add-ESRT-support.patch @@ -0,0 +1,219 @@ +From f248f22667df72143938bd2175f0ac49b98d1c3c Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 13 Feb 2025 17:31:48 +0000 +Subject: [PATCH 18/36] fwu_arm_psa: Add ESRT support + +Read ESRT data from Secure world in GetImageInfo() + +Use FWU_READ_STREAM ABI to read ESRT data from Secure world. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + include/fwu_arm_psa.h | 13 ++++ + lib/fwu_updates/fwu_arm_psa.c | 116 +++++++++++++++++++++++++++++++--- + 2 files changed, 119 insertions(+), 10 deletions(-) + +diff --git a/include/fwu_arm_psa.h b/include/fwu_arm_psa.h +index 451d8b614e3..e29c0b2c05d 100644 +--- a/include/fwu_arm_psa.h ++++ b/include/fwu_arm_psa.h +@@ -16,6 +16,9 @@ + + #define DEFAULT_HW_INSTANCE (1) + ++/* The minimum supported ESRT version */ ++#define EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION (1) ++ + /* Default values of the ESRT fields which are not supported at this stage */ + #define PACKAGE_VERSION_NOT_SUP (0xffffffff) + #define LAST_ATTEMPT_NOT_SUP (0) +@@ -355,6 +358,16 @@ struct __packed fwu_image_directory { + struct fwu_image_info_entry entries[FWU_DIRECTORY_IMAGE_ENTRIES_COUNT]; + }; + ++/* ++ * struct fwu_esrt_data_wrapper - Wrapper for the ESRT data ++ * @data: The ESRT data read from secure world ++ * @entries: The ESRT entries ++ */ ++struct __packed fwu_esrt_data_wrapper { ++ struct efi_system_resource_table data; ++ struct efi_system_resource_entry entries[CONFIG_FWU_NUM_IMAGES_PER_BANK]; ++}; ++ + /** + * fwu_agent_init() - Setup the FWU agent + * +diff --git a/lib/fwu_updates/fwu_arm_psa.c b/lib/fwu_updates/fwu_arm_psa.c +index 40746eee6ce..7297e724569 100644 +--- a/lib/fwu_updates/fwu_arm_psa.c ++++ b/lib/fwu_updates/fwu_arm_psa.c +@@ -27,6 +27,7 @@ static u8 g_fwu_version_minor; + static bool g_fwu_initialized; + struct fwu_image_directory g_fwu_cached_directory; + efi_guid_t g_update_guid[CONFIG_FWU_NUM_IMAGES_PER_BANK]; ++struct fwu_esrt_data_wrapper g_esrt_data; + + /* Error mapping declarations */ + +@@ -898,6 +899,100 @@ close_handle: + return ret; + } + ++/** ++ * fwu_esrt_sanity_check() - Verify ESRT data ++ * ++ * Make sure the ESRT data matches the directory data. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++static int fwu_esrt_sanity_check(void) ++{ ++ int i; ++ ++ log_debug("FWU: ESRT data check ...\n"); ++ ++ if (g_esrt_data.data.fw_resource_count != ++ CONFIG_FWU_NUM_IMAGES_PER_BANK) { ++ log_err("FWU: Unexpected ESRT entries count (%d , %d)\n", ++ g_esrt_data.data.fw_resource_count, ++ CONFIG_FWU_NUM_IMAGES_PER_BANK); ++ return -EINVAL; ++ } ++ ++ if (g_esrt_data.data.fw_resource_version < ++ EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION) { ++ log_err("FWU: Secure world ESRT version %llu not supported\n", ++ g_esrt_data.data.fw_resource_version); ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < g_fwu_cached_directory.num_images; i++) { ++ if (guidcmp(&g_fwu_cached_directory.entries[i].image_guid, ++ &g_esrt_data.data.entries[i].fw_class)) { ++ log_err("FWU: GUID mismatch for image %d\n", i + 1); ++ return -EINVAL; ++ } ++ } ++ ++ log_debug("FWU: ESRT data check passed\n"); ++ ++ return 0; ++} ++ ++/** ++ * fwu_read_esrt() - Read the ESRT data ++ * ++ * Read the ESRT data from the Secure world. ++ * ++ * Return: ++ * ++ * 0 on success ++ */ ++static int fwu_read_esrt(void) ++{ ++ int ret, close_ret; ++ u32 handle = 0; ++ efi_guid_t esrt_guid = EFI_SYSTEM_RESOURCE_TABLE_GUID; ++ u32 esrt_data_size; ++ ++ ret = fwu_open(&esrt_guid, FWU_OP_TYPE_READ, &handle); ++ if (ret) { ++ log_err("FWU: Open ESRT image failed (err: %d)\n", ++ ret); ++ return ret; ++ } ++ ++ log_debug("FWU: ESRT image handle (0x%x)\n", handle); ++ ++ esrt_data_size = sizeof(g_esrt_data); ++ ++ ret = fwu_read_stream(handle, (u8 *)&g_esrt_data, esrt_data_size); ++ if (ret) { ++ log_err("FWU: Read ESRT image failed (err: %d)\n", ++ ret); ++ goto close_handle; ++ } ++ ++ ret = fwu_esrt_sanity_check(); ++ if (ret) ++ goto close_handle; ++ ++ log_debug("FWU: ESRT version supported by Secure world (%llu)\n", ++ g_esrt_data.data.fw_resource_version); ++ ++close_handle: ++ /* The Update Agent can execute for an unbounded time */ ++ close_ret = fwu_commit(handle, FWU_IMG_NOT_ACCEPTED, 0); ++ if (close_ret) ++ log_err("FWU: Close ESRT image handle failed (err: %d)\n", ++ close_ret); ++ ++ return ret; ++} ++ + /** + * fwu_discover_ts_sp_id() - Query the FWU partition ID + * +@@ -1192,7 +1287,6 @@ static void EFIAPI fwu_accept_notify_exit_boot_services(struct efi_event *event, + efi_ret = EFI_ACCESS_DENIED; + goto out; + } +- + } else { + log_info("FWU: ExitBootServices: Booting in regular state\n"); + } +@@ -1333,6 +1427,10 @@ efi_status_t fwu_arm_psa_get_image_info(efi_uintn_t *image_info_size, + if (ret) + return EFI_NOT_READY; + ++ ret = fwu_read_esrt(); ++ if (ret) ++ return EFI_NOT_READY; ++ + required_image_info_size = g_fwu_cached_directory.num_images * + image_info_desc_size; + +@@ -1352,15 +1450,13 @@ efi_status_t fwu_arm_psa_get_image_info(efi_uintn_t *image_info_size, + image_info[i].image_index = i + 1; + + /* Corresponding ESRT field: FwClass */ +- guidcpy(&image_info[i].image_type_id, +- &g_fwu_cached_directory.entries[i].image_guid); ++ guidcpy(&image_info[i].image_type_id, &g_esrt_data.entries[i].fw_class); + + image_info[i].image_id = image_info[i].image_index; + image_info[i].image_id_name = NULL; /* Not supported */ + + /* Corresponding ESRT field: FwVersion */ +- image_info[i].version = +- g_fwu_cached_directory.entries[i].img_version; ++ image_info[i].version = g_esrt_data.entries[i].fw_version; + + image_info[i].version_name = NULL; /* Not supported */ + image_info[i].size = +@@ -1379,13 +1475,13 @@ efi_status_t fwu_arm_psa_get_image_info(efi_uintn_t *image_info_size, + + /* Corresponding ESRT field: LowestSupportedFwVersion */ + image_info[i].lowest_supported_image_version = +- g_fwu_cached_directory.entries[i].lowest_acceptable_version; ++ g_esrt_data.entries[i].lowest_supported_fw_version; + +- /* Corresponding ESRT field: LastAttemptVersion (not supported) */ +- image_info[i].last_attempt_version = LAST_ATTEMPT_NOT_SUP; ++ /* Corresponding ESRT field: LastAttemptVersion */ ++ image_info[i].last_attempt_version = g_esrt_data.entries[i].last_attempt_version; + +- /* Corresponding ESRT field: LastAttemptStatus (not supported) */ +- image_info[i].last_attempt_status = LAST_ATTEMPT_NOT_SUP; ++ /* Corresponding ESRT field: LastAttemptStatus */ ++ image_info[i].last_attempt_status = g_esrt_data.entries[i].last_attempt_status; + + image_info[i].hardware_instance = DEFAULT_HW_INSTANCE; + image_info[i].dependencies = NULL; /* Not supported */ +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-arm-corstone1000-esrt-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-arm-corstone1000-esrt-support.patch deleted file mode 100644 index 0781e374..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-arm-corstone1000-esrt-support.patch +++ /dev/null @@ -1,222 +0,0 @@ -From 47479f96cb3b3646d298c39216b2c960940476bd Mon Sep 17 00:00:00 2001 -From: Satish Kumar -Date: Wed, 30 Nov 2022 19:11:43 +0000 -Subject: [PATCH] arm/corstone1000: esrt support - -The implementation is platform specific and would require -change in future. - -The patch should not be upstreamed as it is to the u-boot. -Redesign of FMP protocol for ESRT and Capsule Update interface -is to be considered in the future. - -Signed-off-by: Satish Kumar -Upstream-Status: Inappropriate [Redesign of FMP protocol for ESRT and Capsule update interface is required] -Signed-off-by: Rui Miguel Silva ---- - include/efi_api.h | 2 +- - lib/efi_loader/efi_firmware.c | 133 ++++++++++++++++++++++++++++++++++ - lib/efi_loader/efi_setup.c | 17 +++-- - 3 files changed, 143 insertions(+), 9 deletions(-) - -diff --git a/include/efi_api.h b/include/efi_api.h -index 55a4c989fc..f267ab5110 100644 ---- a/include/efi_api.h -+++ b/include/efi_api.h -@@ -2086,7 +2086,7 @@ struct efi_firmware_image_descriptor { - u32 last_attempt_status; - u64 hardware_instance; - efi_firmware_image_dep_t *dependencies; --}; -+} __packed; - - struct efi_firmware_management_protocol { - efi_status_t (EFIAPI *get_image_info)( -diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c -index c883e2ff0a..c6ab6e2182 100644 ---- a/lib/efi_loader/efi_firmware.c -+++ b/lib/efi_loader/efi_firmware.c -@@ -15,6 +15,7 @@ - #include - - #include -+#include - - #define FMP_PAYLOAD_HDR_SIGNATURE SIGNATURE_32('M', 'S', 'S', '1') - -@@ -417,8 +418,140 @@ efi_status_t EFIAPI efi_firmware_fit_set_image( - return EFI_EXIT(EFI_SUCCESS); - } - -+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -+ -+/** -+ * efi_firmware_corstone1000_get_image_info - return information about the current -+ firmware image -+ * @this: Protocol instance -+ * @image_info_size: Size of @image_info -+ * @image_info: Image information -+ * @descriptor_version: Pointer to version number -+ * @descriptor_count: Pointer to number of descriptors -+ * @descriptor_size: Pointer to descriptor size -+ * package_version: Package version -+ * package_version_name: Package version's name -+ * -+ * Return information bout the current firmware image in @image_info. -+ * @image_info will consist of a number of descriptors. -+ * Each descriptor will be created based on efi fetched variable. -+ * -+ * Return status code -+ */ -+static -+efi_status_t EFIAPI efi_firmware_corstone1000_get_image_info( -+ struct efi_firmware_management_protocol *this, -+ efi_uintn_t *image_info_size, -+ struct efi_firmware_image_descriptor *image_info, -+ u32 *descriptor_version, -+ u8 *descriptor_count, -+ efi_uintn_t *descriptor_size, -+ u32 *package_version, -+ u16 **package_version_name) -+{ -+ efi_uintn_t var_size; -+ efi_status_t ret = EFI_SUCCESS; -+ efi_uintn_t image_info_size_var = 0; -+ efi_uintn_t image_info_name_size_var; -+ efi_uintn_t image_info_version_size_var; -+ u8 *runner = (u8 *)image_info; -+ u16 fmp_image_name[14] = {'F', 'm', 'p', 'I', 'm', 'a', 'g', 'e', 'N', 'a', 'm', 'e', '1', '\0'}; -+ u16 fmp_version_name[16] = {'F', 'm', 'p', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'N', 'a', 'm', 'e', '1', '\0'}; -+ -+ EFI_ENTRY("%p %p %p %p %p %p %p %p\n", this, -+ image_info_size, image_info, -+ descriptor_version, descriptor_count, descriptor_size, -+ package_version, package_version_name); -+ -+ if (!image_info_size) -+ return EFI_EXIT(EFI_INVALID_PARAMETER); -+ -+ if (*image_info_size && -+ (!image_info || !descriptor_version || !descriptor_count || -+ !descriptor_size || !package_version || !package_version_name)) -+ return EFI_EXIT(EFI_INVALID_PARAMETER); -+ -+ var_size = sizeof(*descriptor_version); -+ ret = efi_get_variable(u"FmpDescriptorVersion", -+ &efi_guid_firmware_management_protocol, NULL, -+ &var_size, descriptor_version); -+ if (ret != EFI_SUCCESS) -+ return EFI_EXIT(ret); -+ -+ if (*descriptor_version != EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) -+ return EFI_EXIT(EFI_UNSUPPORTED); -+ -+ var_size = sizeof(image_info_size_var); -+ ret = efi_get_variable(u"FmpImageInfoSize", -+ &efi_guid_firmware_management_protocol, NULL, -+ &var_size, &image_info_size_var); -+ if (ret != EFI_SUCCESS) -+ return EFI_EXIT(ret); -+ -+ if (*image_info_size < image_info_size_var) { -+ *image_info_size = image_info_size_var; -+ return EFI_EXIT(EFI_BUFFER_TOO_SMALL); -+ } -+ -+ image_info_name_size_var = image_info_size_var; -+ -+ var_size = sizeof(*descriptor_count); -+ ret = efi_get_variable(u"FmpDescriptorCount", -+ &efi_guid_firmware_management_protocol, NULL, -+ &var_size, descriptor_count); -+ if (ret != EFI_SUCCESS) { -+ return EFI_EXIT(ret); -+ } -+ -+ ret = efi_get_variable(u"FmpImageInfo", -+ &efi_guid_firmware_management_protocol, NULL, -+ &image_info_size_var, image_info); -+ if (ret != EFI_SUCCESS) -+ return EFI_EXIT(ret); -+ -+ runner += image_info_size_var; -+ -+ image_info_name_size_var -= image_info_size_var; -+ image_info_version_size_var = image_info_name_size_var; -+ -+ /* Consider changing the string modfication logic */ -+ fmp_image_name[12] = '0' + (u16)image_info->image_id; -+ ret = efi_get_variable(fmp_image_name, -+ &efi_guid_firmware_management_protocol, NULL, -+ &image_info_name_size_var, runner); -+ if (ret != EFI_SUCCESS) -+ return EFI_EXIT(ret); -+ -+ image_info_version_size_var -= image_info_name_size_var; -+ image_info->image_id_name = (u16*)runner; -+ runner += image_info_name_size_var; -+ -+ /* Consider changing the string modfication logic */ -+ fmp_version_name[14] = '0' + (u16)image_info->image_id; -+ ret = efi_get_variable(fmp_version_name, -+ &efi_guid_firmware_management_protocol, NULL, -+ &image_info_version_size_var, runner); -+ if (ret != EFI_SUCCESS) -+ return EFI_EXIT(ret); -+ -+ image_info->version_name = (u16*)runner; -+ -+ *image_info_size = image_info_size_var; -+ -+ *package_version = 0xffffffff; /* not supported */ -+ *package_version_name = NULL; /* not supported */ -+ -+ return EFI_EXIT(ret); -+} -+ -+#endif -+ - const struct efi_firmware_management_protocol efi_fmp_fit = { -+#if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) -+ .get_image_info = efi_firmware_corstone1000_get_image_info, -+#else - .get_image_info = efi_firmware_get_image_info, -+#endif - .get_image = efi_firmware_get_image_unsupported, - .set_image = efi_firmware_fit_set_image, - .check_image = efi_firmware_check_image_unsupported, -diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c -index bf90a98b5a..d20568c1c8 100644 ---- a/lib/efi_loader/efi_setup.c -+++ b/lib/efi_loader/efi_setup.c -@@ -178,14 +178,6 @@ static efi_status_t efi_init_capsule(void) - efi_status_t ret = EFI_SUCCESS; - - #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -- int ffa_ret; -- -- ffa_ret = efi_corstone1000_uboot_efi_started_event(); -- if (ffa_ret) -- log_err("Failure to notify SE Proxy FW update service\n"); -- else -- debug("SE Proxy FW update service notified\n"); -- - ret = efi_corstone1000_alloc_capsule_shared_buf(); - if (ret != EFI_SUCCESS) { - printf("EFI: Corstone-1000: cannot allocate caspsule shared buffer\n"); -@@ -304,6 +296,15 @@ efi_status_t efi_init_obj_list(void) - if (ret != EFI_SUCCESS) - goto out; - -+#if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+ int ffa_ret; -+ ffa_ret = efi_corstone1000_uboot_efi_started_event(); -+ if (ffa_ret) -+ log_err("Failure to notify SE Proxy FW update service\n"); -+ else -+ debug("SE Proxy FW update service notified\n"); -+#endif -+ - /* Initialize variable services */ - ret = efi_init_variables(); - if (ret != EFI_SUCCESS) diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-fwu_arm_psa-Add-ExitBootService-notification-handler.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-fwu_arm_psa-Add-ExitBootService-notification-handler.patch new file mode 100644 index 00000000..dda06828 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0019-fwu_arm_psa-Add-ExitBootService-notification-handler.patch @@ -0,0 +1,54 @@ +From bf2211397fc79bcc29cf58389392042f2d0101c4 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Mon, 10 Mar 2025 16:33:06 +0000 +Subject: [PATCH 19/36] fwu_arm_psa: Add ExitBootService() notification handler + +Provide a weak function that can be overridden + +Some boards need to perform custom actions on ExitBootService() +related to FWU. This function can be overridden by the board. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + lib/fwu_updates/fwu_arm_psa.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/lib/fwu_updates/fwu_arm_psa.c b/lib/fwu_updates/fwu_arm_psa.c +index 7297e724569..6a829c631b0 100644 +--- a/lib/fwu_updates/fwu_arm_psa.c ++++ b/lib/fwu_updates/fwu_arm_psa.c +@@ -1252,6 +1252,21 @@ static bool fwu_all_images_accepted(const struct fwu_data *fwu_data) + return true; + } + ++/** ++ * fwu_notify_exit_boot_services() - FWU notification handler ++ * ++ * Some boards need to perform custom actions on ExitBootService() ++ * related to FWU. This function can be overridden by the board. ++ * ++ * Return: ++ * ++ * EFI_SUCCESS on success. Otherwise, failure ++ */ ++efi_status_t __weak fwu_notify_exit_boot_services(void) ++{ ++ return EFI_SUCCESS; ++} ++ + /** + * fwu_accept_notify_exit_boot_services() - ExitBootServices callback + * +@@ -1292,6 +1307,8 @@ static void EFIAPI fwu_accept_notify_exit_boot_services(struct efi_event *event, + } + + out: ++ fwu_notify_exit_boot_services(); ++ + EFI_EXIT(efi_ret); + } + +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-corstone1000-enable-distro-booting-command.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-corstone1000-enable-distro-booting-command.patch deleted file mode 100644 index 8ee8343a..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-corstone1000-enable-distro-booting-command.patch +++ /dev/null @@ -1,25 +0,0 @@ -From c95dbed049801401ac98afc8ef53e917b69f9a62 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 5 Dec 2022 17:02:32 +0000 -Subject: [PATCH] corstone1000: enable distro booting command - -enable distro_bootcmd - -Signed-off-by: Abdellatif El Khlifi -Signed-off-by: Rui Miguel Silva -Upstream-Status: Pending [Not submitted to upstream yet] ---- - include/configs/corstone1000.h | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h -index 1466507f80..8622565a87 100644 ---- a/include/configs/corstone1000.h -+++ b/include/configs/corstone1000.h -@@ -55,5 +55,6 @@ - - #include - -+#define CFG_EXTRA_ENV_SETTINGS BOOTENV - - #endif diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-capsule-Add-runtime-capsule-flags-checks.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-capsule-Add-runtime-capsule-flags-checks.patch new file mode 100644 index 00000000..951607a9 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0020-efi_loader-capsule-Add-runtime-capsule-flags-checks.patch @@ -0,0 +1,67 @@ +From 898008bd55b0de115f62254be8fbc8a5d43894ba Mon Sep 17 00:00:00 2001 +From: Emekcan Aras +Date: Fri, 21 Mar 2025 15:34:44 +0000 +Subject: [PATCH 20/36] efi_loader: capsule: Add runtime capsule flags checks + +Add missing checks according to the UEFI specification [1] + +checks added for these capsule flags: + +CAPSULE_FLAGS_PERSIST_ACROSS_RESET +CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE +CAPSULE_FLAGS_INITIATE_RESET + +[1]: Table 8.8 Flag Firmware Behavior, + https://uefi.org/specs/UEFI/2.10/08_Services_Runtime_Services.html + +Signed-off-by: Emekcan Aras +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + lib/efi_loader/efi_capsule.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c +index e01f2a5f8a8..aeb05a00a0f 100644 +--- a/lib/efi_loader/efi_capsule.c ++++ b/lib/efi_loader/efi_capsule.c +@@ -791,6 +791,36 @@ efi_status_t EFIAPI efi_update_capsule( + continue; + } + ++ /* ++ * ScatterGatherList must point to a list when the ++ * CAPSULE_FLAGS_PERSIST_ACROSS_RESET flag is set. ++ */ ++ if ((capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) && ++ !scatter_gather_list) { ++ ret = EFI_INVALID_PARAMETER; ++ goto out; ++ } ++ ++ /* ++ * The CAPSULE_FLAGS_PERSIST_ACROSS_RESET flag must be set ++ * along with the CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE flag. ++ */ ++ if ((capsule->flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) && ++ !(capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)) { ++ ret = EFI_INVALID_PARAMETER; ++ goto out; ++ } ++ ++ /* ++ * The CAPSULE_FLAGS_PERSIST_ACROSS_RESET flag must be set ++ * along with the CAPSULE_FLAGS_INITIATE_RESET flag. ++ */ ++ if ((capsule->flags & CAPSULE_FLAGS_INITIATE_RESET) && ++ !(capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)) { ++ ret = EFI_INVALID_PARAMETER; ++ goto out; ++ } ++ + log_debug("Capsule[%d] (guid:%pUs)\n", + i, &capsule->capsule_guid); + ret = efi_capsule_update_firmware(capsule); +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-corstone1000-add-fwu-metadata-store-info.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-corstone1000-add-fwu-metadata-store-info.patch deleted file mode 100644 index c58f7b57..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-corstone1000-add-fwu-metadata-store-info.patch +++ /dev/null @@ -1,39 +0,0 @@ -From c250b6b896facee9ef42f88f5c76f055dbcfc708 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Wed, 1 Feb 2023 15:58:07 +0000 -Subject: [PATCH] corstone1000: add fwu-metadata store info - -Add fwu-mdata node and handle for the reference -nvmxip-qspi. - -Upstream-Status: Submitted -Signed-off-by: Rui Miguel Silva ---- - arch/arm/dts/corstone1000.dtsi | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi -index 533dfdf8e1..1e0ec075e4 100644 ---- a/arch/arm/dts/corstone1000.dtsi -+++ b/arch/arm/dts/corstone1000.dtsi -@@ -38,7 +38,7 @@ - reg = <0x88200000 0x77e00000>; - }; - -- nvmxip-qspi@08000000 { -+ nvmxip: nvmxip-qspi@08000000 { - compatible = "nvmxip,qspi"; - reg = <0x08000000 0x2000000>; - lba_shift = <9>; -@@ -106,6 +106,11 @@ - method = "smc"; - }; - -+ fwu-mdata { -+ compatible = "u-boot,fwu-mdata-gpt"; -+ fwu-mdata-store = <&nvmxip>; -+ }; -+ - soc { - compatible = "simple-bus"; - #address-cells = <1>; diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-fwu_arm_psa-corstone1000-Enable-FWU-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-fwu_arm_psa-corstone1000-Enable-FWU-support.patch new file mode 100644 index 00000000..14424124 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0021-fwu_arm_psa-corstone1000-Enable-FWU-support.patch @@ -0,0 +1,228 @@ +From 7aa05114f04ec5792d7948153baf0633f5ca8bcb Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 20 Mar 2025 14:41:41 +0000 +Subject: [PATCH 21/36] fwu_arm_psa: corstone1000: Enable FWU support + +Provide the update_info structure and FWU configs for Corstone-1000 + +update_info defines the image to be used for FWU. +The FWU configs enabled are the FWU Arm PSA configs. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + board/armltd/corstone1000/corstone1000.c | 138 ++++++++++++++++++++++- + configs/corstone1000_defconfig | 10 +- + 2 files changed, 146 insertions(+), 2 deletions(-) + +diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c +index 3ad77f51949..d2176b9174d 100644 +--- a/board/armltd/corstone1000/corstone1000.c ++++ b/board/armltd/corstone1000/corstone1000.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * (C) Copyright 2022 ARM Limited ++ * (C) Copyright 2022, 2025 Arm Limited + * (C) Copyright 2022 Linaro + * Rui Miguel Silva + */ +@@ -8,8 +8,11 @@ + #include + #include + #include ++#include + #include ++#include + #include ++#include + #include + #include + #include +@@ -21,6 +24,133 @@ + #define CORSTONE1000_KERNEL_PRIMARY "kernel_primary" + #define CORSTONE1000_KERNEL_SECONDARY "kernel_secondary" + ++#if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) ++ ++/* The total number of upgradable images including the start and end dummy payloads */ ++#define CAPSULE_PAYLOADS_MAX_COUNT (CONFIG_FWU_NUM_IMAGES_PER_BANK + 2) ++ ++/* ++ * GUIDs for capsule updatable firmware images ++ * ++ * The GUIDs are generating with the UUIDv5 format. ++ * Namespace used for FVP GUIDs: 989f3a4e-46e0-4cd0-9877-a25c70c01329 ++ * Namespace used for MPS3 GUIDs: df1865d1-90fb-4d59-9c38-c9f2c1bba8cc ++ * Names: the image names stated in the fw_name field ++ */ ++ ++#define FWU_FVP_BL2_IMAGE_GUID \ ++ EFI_GUID(0xf1d883f9, 0xdfeb, 0x5363, 0x98, 0xd8, \ ++ 0x68, 0x6e, 0xe3, 0xb6, 0x9f, 0x4f) ++ ++#define FWU_MPS3_BL2_IMAGE_GUID \ ++ EFI_GUID(0xfbfbefaa, 0x0a56, 0x50d5, 0xb6, 0x51, \ ++ 0x74, 0x09, 0x1d, 0x3d, 0x62, 0xcf) ++ ++#define FWU_FVP_TFM_S_IMAGE_GUID \ ++ EFI_GUID(0x7fad470e, 0x5ec5, 0x5c03, 0xa2, 0xc1, \ ++ 0x47, 0x56, 0xb4, 0x95, 0xde, 0x61) ++ ++#define FWU_MPS3_TFM_S_IMAGE_GUID \ ++ EFI_GUID(0xaf4cc7ad, 0xee2e, 0x5a39, 0xaa, 0xd5, \ ++ 0xfa, 0xc8, 0xa1, 0xe6, 0x17, 0x3c) ++ ++#define FWU_FVP_FIP_IMAGE_GUID \ ++ EFI_GUID(0xf1933675, 0x5a8c, 0x5b6d, 0x9e, 0xf4, \ ++ 0x84, 0x67, 0x39, 0xe8, 0x9b, 0xc8) ++ ++#define FWU_MPS3_FIP_IMAGE_GUID \ ++ EFI_GUID(0x55302f96, 0xc4f0, 0x5cf9, 0x86, 0x24, \ ++ 0xe7, 0xcc, 0x38, 0x8f, 0x2b, 0x68) ++ ++#define FWU_FVP_INITRAMFS_IMAGE_GUID \ ++ EFI_GUID(0xf771aff9, 0xc7e9, 0x5f99, 0x9e, 0xda, \ ++ 0x23, 0x69, 0xdd, 0x69, 0x4f, 0x61) ++ ++#define FWU_MPS3_INITRAMFS_IMAGE_GUID \ ++ EFI_GUID(0x3e8ac972, 0xc33c, 0x5cc9, 0x90, 0xa0, \ ++ 0xcd, 0xd3, 0x15, 0x96, 0x83, 0xea) ++ ++enum fw_image_index { ++ FW_IMAGE_INDEX_BL2 = 1, ++ FW_IMAGE_INDEX_TFM_S, ++ FW_IMAGE_INDEX_FIP, ++ FW_IMAGE_INDEX_INITRAMFS, ++ FW_IMAGE_INDEX_DUMMY_START, ++ FW_IMAGE_INDEX_DUMMY_END ++}; ++ ++struct efi_fw_image fw_mps3_images[] = { ++ { ++ .image_type_id = FWU_MPS3_BL2_IMAGE_GUID, ++ .fw_name = u"BL2", ++ .image_index = FW_IMAGE_INDEX_BL2, ++ }, ++ { ++ .image_type_id = FWU_MPS3_TFM_S_IMAGE_GUID, ++ .fw_name = u"TFM_S", ++ .image_index = FW_IMAGE_INDEX_TFM_S, ++ }, ++ { ++ .image_type_id = FWU_MPS3_FIP_IMAGE_GUID, ++ .fw_name = u"FIP", ++ .image_index = FW_IMAGE_INDEX_FIP, ++ }, ++ { ++ .image_type_id = FWU_MPS3_INITRAMFS_IMAGE_GUID, ++ .fw_name = u"INITRAMFS", ++ .image_index = FW_IMAGE_INDEX_INITRAMFS, ++ }, ++ { ++ .image_type_id = FWU_DUMMY_START_IMAGE_GUID, ++ .fw_name = u"DUMMY_START", ++ .image_index = FW_IMAGE_INDEX_DUMMY_START, ++ }, ++ { ++ .image_type_id = FWU_DUMMY_END_IMAGE_GUID, ++ .fw_name = u"DUMMY_END", ++ .image_index = FW_IMAGE_INDEX_DUMMY_END, ++ }, ++}; ++ ++struct efi_fw_image fw_fvp_images[] = { ++ { ++ .image_type_id = FWU_FVP_BL2_IMAGE_GUID, ++ .fw_name = u"BL2", ++ .image_index = FW_IMAGE_INDEX_BL2, ++ }, ++ { ++ .image_type_id = FWU_FVP_TFM_S_IMAGE_GUID, ++ .fw_name = u"TFM_S", ++ .image_index = FW_IMAGE_INDEX_TFM_S, ++ }, ++ { ++ .image_type_id = FWU_FVP_FIP_IMAGE_GUID, ++ .fw_name = u"FIP", ++ .image_index = FW_IMAGE_INDEX_FIP, ++ }, ++ { ++ .image_type_id = FWU_FVP_INITRAMFS_IMAGE_GUID, ++ .fw_name = u"INITRAMFS", ++ .image_index = FW_IMAGE_INDEX_INITRAMFS, ++ }, ++ { ++ .image_type_id = FWU_DUMMY_START_IMAGE_GUID, ++ .fw_name = u"DUMMY_START", ++ .image_index = FW_IMAGE_INDEX_DUMMY_START, ++ }, ++ { ++ .image_type_id = FWU_DUMMY_END_IMAGE_GUID, ++ .fw_name = u"DUMMY_END", ++ .image_index = FW_IMAGE_INDEX_DUMMY_END, ++ }, ++}; ++ ++struct efi_capsule_update_info update_info = { ++ .num_images = CAPSULE_PAYLOADS_MAX_COUNT, ++}; ++ ++#endif /* EFI_HAVE_CAPSULE_SUPPORT */ ++ + static int corstone1000_boot_idx; + + static struct mm_region corstone1000_mem_map[] = { +@@ -79,6 +209,12 @@ struct mm_region *mem_map = corstone1000_mem_map; + + int board_init(void) + { ++#if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) ++ if (!strcmp(DEVICE_TREE, "corstone1000-fvp")) ++ update_info.images = fw_fvp_images; ++ else ++ update_info.images = fw_mps3_images; ++#endif + return 0; + } + +diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig +index 80163580f85..5b10e3f7484 100644 +--- a/configs/corstone1000_defconfig ++++ b/configs/corstone1000_defconfig +@@ -10,11 +10,16 @@ CONFIG_DEFAULT_DEVICE_TREE="corstone1000-mps3" + CONFIG_SYS_BOOTM_LEN=0x800000 + CONFIG_SYS_LOAD_ADDR=0x82100000 + CONFIG_IDENT_STRING=" corstone1000 aarch64 " ++CONFIG_FWU_NUM_IMAGES_PER_BANK=4 + CONFIG_EFI_MM_COMM_TEE=y + CONFIG_FFA_SHARED_MM_BUF_SIZE=4096 + CONFIG_FFA_SHARED_MM_BUF_OFFSET=0 + CONFIG_FFA_SHARED_MM_BUF_ADDR=0x02000000 ++CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y + CONFIG_EFI_CAPSULE_ON_DISK=y ++CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y ++CONFIG_EFI_CAPSULE_AUTHENTICATE=y ++CONFIG_EFI_CAPSULE_CRT_FILE="CRT.crt" + CONFIG_FIT=y + CONFIG_DISTRO_DEFAULTS=y + CONFIG_BOOTDELAY=3 +@@ -38,6 +43,7 @@ CONFIG_CMD_LOADM=y + CONFIG_CMD_USB=y + # CONFIG_CMD_SETEXPR is not set + CONFIG_CMD_CACHE=y ++CONFIG_CMD_EFIDEBUG=y + CONFIG_CMD_RTC=y + CONFIG_CMD_TIME=y + CONFIG_CMD_GETTIME=y +@@ -67,4 +73,6 @@ CONFIG_USB_ISP1760=y + # CONFIG_RANDOM_UUID is not set + CONFIG_ERRNO_STR=y + CONFIG_FWU_MULTI_BANK_UPDATE=y +-CONFIG_FWU_MDATA_V1=y ++CONFIG_FWU_MDATA_V2=y ++CONFIG_FWU_ARM_PSA=y ++# CONFIG_TOOLS_MKEFICAPSULE is not set +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_arm_psa-corstone1000-Perform-bank-logic-when-rea.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_arm_psa-corstone1000-Perform-bank-logic-when-rea.patch new file mode 100644 index 00000000..1fe95f11 --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_arm_psa-corstone1000-Perform-bank-logic-when-rea.patch @@ -0,0 +1,143 @@ +From e3e4f4adae7bdf580490bd82013760e4f603022e Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Wed, 5 Mar 2025 19:09:20 +0000 +Subject: [PATCH 22/36] fwu_arm_psa: corstone1000: Perform bank logic when + reading boot index + +Move bank logic from board_late_init to fwu_plat_get_bootidx + +board_late_init is called very early before the FWU subsystem is setup. +So, the metadata is still not initialized at that level. Reading the boot +index at that level returns an invalid value. +Moving the bank logic to fwu_plat_get_bootidx guarantees the returned +boot index is reflecting the value read from the metadata. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + board/armltd/corstone1000/corstone1000.c | 63 +++++++++++------------- + configs/corstone1000_defconfig | 1 - + 2 files changed, 29 insertions(+), 35 deletions(-) + +diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c +index d2176b9174d..2ccf851e6c5 100644 +--- a/board/armltd/corstone1000/corstone1000.c ++++ b/board/armltd/corstone1000/corstone1000.c +@@ -151,8 +151,6 @@ struct efi_capsule_update_info update_info = { + + #endif /* EFI_HAVE_CAPSULE_SUPPORT */ + +-static int corstone1000_boot_idx; +- + static struct mm_region corstone1000_mem_map[] = { + { + /* CVM */ +@@ -234,45 +232,37 @@ int dram_init_banksize(void) + } + + void fwu_plat_get_bootidx(uint *boot_idx) +-{ +- int ret; +- +- /* +- * in our platform, the Secure Enclave is the one who controls +- * all the boot tries and status, so, every time we get here +- * we know that the we are booting from the active index +- */ +- ret = fwu_get_active_index(boot_idx); +- if (ret < 0) { +- *boot_idx = CONFIG_FWU_NUM_BANKS; +- log_err("corstone1000: failed to read active index\n"); +- } +-} +- +-int board_late_init(void) + { + struct disk_partition part_info; + struct udevice *dev, *bdev; + struct nvmxip_plat *plat; + struct blk_desc *desc; + int ret; ++ bool kernel_addr_set, kernel_size_set; + + ret = uclass_first_device_err(UCLASS_NVMXIP, &dev); + if (ret < 0) { +- log_err("Cannot find kernel device\n"); +- return ret; ++ log_err("Cannot find kernel device, err (%d)\n", ret); ++ return; + } + + plat = dev_get_plat(dev); + device_find_first_child(dev, &bdev); + desc = dev_get_uclass_plat(bdev); +- ret = fwu_get_active_index(&corstone1000_boot_idx); ++ ret = fwu_get_active_index(boot_idx); + if (ret < 0) { ++ *boot_idx = CONFIG_FWU_NUM_BANKS; + log_err("corstone1000: failed to read boot index\n"); +- return ret; ++ return; + } + +- if (!corstone1000_boot_idx) ++ kernel_addr_set = env_get_hex("kernel_addr", 0) ? true : false; ++ kernel_size_set = env_get_hex("kernel_size", 0) ? true : false; ++ ++ if (kernel_addr_set && kernel_size_set) ++ return; ++ ++ if (!(*boot_idx)) + ret = part_get_info_by_name(desc, CORSTONE1000_KERNEL_PRIMARY, + &part_info); + else +@@ -281,18 +271,23 @@ int board_late_init(void) + + if (ret < 0) { + log_err("failed to fetch kernel partition index: %d\n", +- corstone1000_boot_idx); +- return ret; ++ *boot_idx); ++ return; + } + +- ret = 0; +- +- ret |= env_set_hex("kernel_addr", plat->phys_base + +- (part_info.start * part_info.blksz)); +- ret |= env_set_hex("kernel_size", part_info.size * part_info.blksz); +- +- if (ret < 0) +- log_err("failed to setup kernel addr and size\n"); ++ if (!kernel_addr_set) { ++ ret = env_set_hex("kernel_addr", plat->phys_base + ++ (part_info.start * part_info.blksz)); ++ if (ret) ++ log_err("cannot set kernel_addr variable, err (%d)\n", ++ ret); ++ } + +- return ret; ++ if (!kernel_size_set) { ++ ret = env_set_hex("kernel_size", ++ part_info.size * part_info.blksz); ++ if (ret) ++ log_err("cannot set kernel_size variable, err (%d)\n", ++ ret); ++ } + } +diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig +index 5b10e3f7484..d52d39a0b36 100644 +--- a/configs/corstone1000_defconfig ++++ b/configs/corstone1000_defconfig +@@ -31,7 +31,6 @@ CONFIG_SYS_CBSIZE=512 + CONFIG_LOGLEVEL=7 + # CONFIG_DISPLAY_CPUINFO is not set + # CONFIG_DISPLAY_BOARDINFO is not set +-CONFIG_BOARD_LATE_INIT=y + CONFIG_SYS_PROMPT="corstone1000# " + # CONFIG_CMD_CONSOLE is not set + CONFIG_CMD_FWU_METADATA=y +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_metadata-make-sure-structures-are-packed.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_metadata-make-sure-structures-are-packed.patch deleted file mode 100644 index e556cabe..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0022-fwu_metadata-make-sure-structures-are-packed.patch +++ /dev/null @@ -1,47 +0,0 @@ -From b1445e50c1f260e3454bc4946ea1009ff3e0dda6 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Wed, 1 Feb 2023 16:13:24 +0000 -Subject: [PATCH] fwu_metadata: make sure structures are packed - -The fwu metadata in the metadata partitions -should/are packed to guarantee that the info is -correct in all platforms. Also the size of them -are used to calculate the crc32 and that is important -to get it right. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva ---- - include/fwu_mdata.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/include/fwu_mdata.h b/include/fwu_mdata.h -index 8fda4f4ac2..c61221a917 100644 ---- a/include/fwu_mdata.h -+++ b/include/fwu_mdata.h -@@ -22,7 +22,7 @@ struct fwu_image_bank_info { - efi_guid_t image_uuid; - uint32_t accepted; - uint32_t reserved; --}; -+} __packed; - - /** - * struct fwu_image_entry - information for a particular type of image -@@ -38,7 +38,7 @@ struct fwu_image_entry { - efi_guid_t image_type_uuid; - efi_guid_t location_uuid; - struct fwu_image_bank_info img_bank_info[CONFIG_FWU_NUM_BANKS]; --}; -+} __packed; - - /** - * struct fwu_mdata - FWU metadata structure for multi-bank updates -@@ -62,6 +62,6 @@ struct fwu_mdata { - uint32_t previous_active_index; - - struct fwu_image_entry img_entry[CONFIG_FWU_NUM_IMAGES_PER_BANK]; --}; -+} __packed; - - #endif /* _FWU_MDATA_H_ */ diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-corstone1000-add-boot-index.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-corstone1000-add-boot-index.patch deleted file mode 100644 index 4fc5de73..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-corstone1000-add-boot-index.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 7a71000da87c4b48c6c42043924863c2933d8bdf Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Mon, 17 Jul 2023 17:04:10 +0100 -Subject: [PATCH] corstone1000: add boot index - -it is expected that the firmware that runs before -u-boot somehow provide the information of the bank -(index) of it is booting. -We will need to extend tf-a to pass that info, -meanwhile just set it to the default bank. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva -Signed-off-by: Abdellatif El Khlifi ---- - board/armltd/corstone1000/corstone1000.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index ecfd8366df..ba6d024b80 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -107,6 +108,7 @@ int dram_init_banksize(void) - return 0; - } - --void reset_cpu(void) -+void fwu_plat_get_bootidx(uint *boot_idx) - { -+ *boot_idx = 0; - } diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-fwu_arm_psa-corstone1000-Notify-SE-Proxy-SP-on-ExitB.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-fwu_arm_psa-corstone1000-Notify-SE-Proxy-SP-on-ExitB.patch new file mode 100644 index 00000000..5317984f --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0023-fwu_arm_psa-corstone1000-Notify-SE-Proxy-SP-on-ExitB.patch @@ -0,0 +1,104 @@ +From fe7e49ae4fdf07aab3d882adcde94097b3dead82 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Thu, 20 Mar 2025 15:27:27 +0000 +Subject: [PATCH 23/36] fwu_arm_psa: corstone1000: Notify SE Proxy SP on + ExitBootService() + +Implement the notification in fwu_notify_exit_boot_services() + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + board/armltd/corstone1000/corstone1000.c | 60 ++++++++++++++++++++++++ + 1 file changed, 60 insertions(+) + +diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c +index 2ccf851e6c5..2532c5f10fa 100644 +--- a/board/armltd/corstone1000/corstone1000.c ++++ b/board/armltd/corstone1000/corstone1000.c +@@ -5,6 +5,7 @@ + * Rui Miguel Silva + */ + ++#include + #include + #include + #include +@@ -19,11 +20,28 @@ + #include + #include + #include ++#include + + #define CORSTONE1000_KERNEL_PARTS 2 + #define CORSTONE1000_KERNEL_PRIMARY "kernel_primary" + #define CORSTONE1000_KERNEL_SECONDARY "kernel_secondary" + ++/* The SE Proxy partition ID*/ ++#define CORSTONE1000_SEPROXY_PART_ID (0x8002) ++ ++/* Update service ID provided by the SE Proxy SP*/ ++#define CORSTONE1000_SEPROXY_UPDATE_SVC_ID (0x4) ++#define PREP_SEPROXY_SVC_ID_MASK GENMASK(31, 16) ++#define PREP_SEPROXY_SVC_ID(x) (FIELD_PREP(PREP_SEPROXY_SVC_ID_MASK, (x))) ++ ++/* Notification event used with SE Proxy SP */ ++#define CORSTONE1000_UBOOT_EFI_STARTED_EVT (0x3) ++#define PREP_SEPROXY_EVT_MASK GENMASK(15, 0) ++#define PREP_SEPROXY_EVT(x) (FIELD_PREP(PREP_SEPROXY_EVT_MASK, (x))) ++ ++/* Signal that there is no shared memory used when notifying SE Proxy SP */ ++#define FFA_MEM_HANDLE_INVALID (0xffffffff) ++ + #if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) + + /* The total number of upgradable images including the start and end dummy payloads */ +@@ -291,3 +309,45 @@ void fwu_plat_get_bootidx(uint *boot_idx) + ret); + } + } ++ ++/** ++ * fwu_notify_exit_boot_services() - ExitBootService event handler ++ * ++ * Notify SE Proxy SP when reaching ExitBootService(). ++ * ++ * Return: ++ * ++ * EFI_SUCCESS on success. Otherwise, failure ++ */ ++efi_status_t fwu_notify_exit_boot_services(void) ++{ ++ efi_status_t efi_ret = EFI_SUCCESS; ++ int ffa_ret; ++ struct ffa_send_direct_data msg = {0}; ++ struct udevice *dev; ++ ++ ffa_ret = uclass_first_device_err(UCLASS_FFA, &dev); ++ if (ffa_ret) { ++ log_err("Cannot find FF-A bus device, err (%d)\n", ffa_ret); ++ efi_ret = EFI_DEVICE_ERROR; ++ goto out; ++ } ++ ++ msg.data0 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | ++ PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); ++ ++ msg.data1 = FFA_MEM_HANDLE_INVALID; ++ msg.data2 = FFA_MEM_HANDLE_INVALID; ++ ++ ffa_ret = ffa_sync_send_receive(dev, CORSTONE1000_SEPROXY_PART_ID, &msg, 0); ++ if (ffa_ret) { ++ log_err("Cannot notify SE Proxy SP, err (%d)\n", ffa_ret); ++ efi_ret = EFI_NO_RESPONSE; ++ goto out; ++ } ++ ++ log_debug("SE Proxy SP notified\n"); ++ ++out: ++ return efi_ret; ++} +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-corstone1000-adjust-boot-bank-and-kernel-location.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-corstone1000-adjust-boot-bank-and-kernel-location.patch deleted file mode 100644 index 66c6c665..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-corstone1000-adjust-boot-bank-and-kernel-location.patch +++ /dev/null @@ -1,33 +0,0 @@ -From b15518faa5eba9ffb9da4d6e17d8ab4bb8e69f27 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Wed, 1 Feb 2023 16:17:21 +0000 -Subject: [PATCH] corstone1000: adjust boot bank and kernel location - -Adjust in the env boot script the address of the -bootbank with the new gpt layout, and also the -kernel partition address. Please be aware that -this is hack and needs a proper fix, since the -offset of the kernel partition is not fixed, -but for the propose of PoC it is enough for testing. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva ---- - board/armltd/corstone1000/corstone1000.env | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/board/armltd/corstone1000/corstone1000.env b/board/armltd/corstone1000/corstone1000.env -index b24ff07fc6..a6ee496221 100644 ---- a/board/armltd/corstone1000/corstone1000.env -+++ b/board/armltd/corstone1000/corstone1000.env -@@ -1,8 +1,8 @@ - /* SPDX-License-Identifier: GPL-2.0+ */ - - usb_pgood_delay=250 --boot_bank_flag=0x08002000 --kernel_addr_bank_0=0x083EE000 -+boot_bank_flag=0x08005006 -+kernel_addr_bank_0=0x08280000 - kernel_addr_bank_1=0x0936E000 - retrieve_kernel_load_addr= - if itest.l *${boot_bank_flag} == 0; then diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-fwu_arm_psa-corstone1000-Set-Boot0001-for-on-disk-FW.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-fwu_arm_psa-corstone1000-Set-Boot0001-for-on-disk-FW.patch new file mode 100644 index 00000000..2584183a --- /dev/null +++ b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0024-fwu_arm_psa-corstone1000-Set-Boot0001-for-on-disk-FW.patch @@ -0,0 +1,59 @@ +From 259e9c11412c89a528a18d7ae34f770914c122a4 Mon Sep 17 00:00:00 2001 +From: Abdellatif El Khlifi +Date: Fri, 2 May 2025 15:42:56 +0100 +Subject: [PATCH 24/36] fwu_arm_psa: corstone1000: Set Boot0001 for on-disk FWU + +Set Boot0001 to point to the ESP partition path + +On-disk FWU requires setting the boot option to where the +EFI System Partition (ESP) is so U-Boot's capsule driver +can detect the ESP partition and start the FWU. + +Corstone-1000 supports on-disk FWU on FVP. +The ESP partition is at mmc 1:1 and is accessible with boot option 1. + +To avoid setting manually Boot0001 at factory level, Boot0001 is +set in the bootcmd. So, before starting the on-disk FWU, the bootcmd +will be executed and Boot0001 will be set automatically. + +Signed-off-by: Abdellatif El Khlifi +Upstream-Status: Submitted [cover letter: https://lore.kernel.org/all/20250702152528.1180414-1-abdellatif.elkhlifi@arm.com/] +--- + board/armltd/corstone1000/corstone1000.env | 8 ++++++++ + configs/corstone1000_defconfig | 2 +- + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/board/armltd/corstone1000/corstone1000.env b/board/armltd/corstone1000/corstone1000.env +index ee318b1b1c3..6e631b12bc2 100644 +--- a/board/armltd/corstone1000/corstone1000.env ++++ b/board/armltd/corstone1000/corstone1000.env +@@ -1,5 +1,13 @@ + /* SPDX-License-Identifier: GPL-2.0+ */ + ++/* ++ * Copyright 2023, 2025 Arm Limited and/or its affiliates ++ */ ++ + usb_pgood_delay=250 + boot_bank_flag=0x08005006 + kernel_addr_r=0x88200000 ++prepare_ondisk_fwu= ++ if mmc dev 1; then ++ efidebug boot add -B 1 OnDiskFWU mmc 1:1 / ; ++ fi; +diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig +index d52d39a0b36..e02fb7cca67 100644 +--- a/configs/corstone1000_defconfig ++++ b/configs/corstone1000_defconfig +@@ -25,7 +25,7 @@ CONFIG_DISTRO_DEFAULTS=y + CONFIG_BOOTDELAY=3 + CONFIG_USE_BOOTARGS=y + CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9 ip=dhcp earlyprintk" +-CONFIG_BOOTCOMMAND="echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r $filesize; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" ++CONFIG_BOOTCOMMAND="echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r $filesize; usb start; usb reset; run prepare_ondisk_fwu ; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" + CONFIG_CONSOLE_RECORD=y + CONFIG_SYS_CBSIZE=512 + CONFIG_LOGLEVEL=7 +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-add-nvmxip-fwu-mdata-and-gpt-options.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-add-nvmxip-fwu-mdata-and-gpt-options.patch deleted file mode 100644 index c9e050a4..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0025-corstone1000-add-nvmxip-fwu-mdata-and-gpt-options.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 085b51e1545e905b4ba87c529954f31067032eaa Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Mon, 17 Jul 2023 17:33:52 +0100 -Subject: [PATCH] corstone1000: add nvmxip, fwu-mdata and gpt options - -Enable the newest features: nvmxip, fwu-metadata and -gpt. Commands to print the partition info, gpt info -and fwu metadata will be available. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva ---- - configs/corstone1000_defconfig | 21 ++++++++++++++------- - 1 file changed, 14 insertions(+), 7 deletions(-) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index a92668389a..4c75a01818 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -15,7 +15,7 @@ CONFIG_DISTRO_DEFAULTS=y - CONFIG_BOOTDELAY=3 - CONFIG_USE_BOOTARGS=y - CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9 ip=dhcp earlyprintk" --CONFIG_BOOTCOMMAND="run retrieve_kernel_load_addr; echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r 0xf00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" -+CONFIG_BOOTCOMMAND="echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r 0xf00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" - CONFIG_CONSOLE_RECORD=y - CONFIG_LOGLEVEL=7 - # CONFIG_DISPLAY_CPUINFO is not set -@@ -23,11 +23,15 @@ CONFIG_LOGLEVEL=7 - CONFIG_SYS_MAXARGS=64 - CONFIG_SYS_CBSIZE=512 - # CONFIG_CMD_CONSOLE is not set -+CONFIG_CMD_FWU_METADATA=y - CONFIG_CMD_BOOTZ=y - CONFIG_SYS_BOOTM_LEN=0x800000 - # CONFIG_CMD_XIMG is not set -+CONFIG_CMD_GPT=y -+# CONFIG_RANDOM_UUID is not set - CONFIG_CMD_LOADM=y - # CONFIG_CMD_LOADS is not set -+CONFIG_CMD_MMC=y - CONFIG_CMD_USB=y - # CONFIG_CMD_SETEXPR is not set - # CONFIG_CMD_NFS is not set -@@ -41,12 +45,7 @@ CONFIG_NET_RANDOM_ETHADDR=y - CONFIG_REGMAP=y - CONFIG_MISC=y - CONFIG_CLK=y --CONFIG_CMD_MMC=y --CONFIG_DM_MMC=y - CONFIG_ARM_PL180_MMCI=y --CONFIG_MMC_SDHCI_ADMA_HELPERS=y --CONFIG_MMC_WRITE=y --CONFIG_DM_GPIO=y - CONFIG_PHYLIB=y - CONFIG_PHY_SMSC=y - CONFIG_SMC911X=y -@@ -65,4 +64,12 @@ CONFIG_FFA_SHARED_MM_BUF_OFFSET=0 - CONFIG_FFA_SHARED_MM_BUF_ADDR=0x02000000 - CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y - CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y --CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y -+CONFIG_FWU_NUM_IMAGES_PER_BANK=4 -+CONFIG_FWU_MDATA=y -+CONFIG_FWU_MDATA_GPT_BLK=y -+CONFIG_SYSRESET=y -+CONFIG_EFI_CAPSULE_ON_DISK=y -+CONFIG_EFI_IGNORE_OSINDICATIONS=y -+CONFIG_FWU_MULTI_BANK_UPDATE=y -+# CONFIG_TOOLS_MKEFICAPSULE is not set -+CONFIG_DM_GPIO=y -\ No newline at end of file diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-nvmxip-move-header-to-include.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-nvmxip-move-header-to-include.patch deleted file mode 100644 index 46734385..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0026-nvmxip-move-header-to-include.patch +++ /dev/null @@ -1,39 +0,0 @@ -From e7db287eb8bda80465d0c11cbb41acc798bb9fc6 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Fri, 9 Jun 2023 13:31:53 +0100 -Subject: [PATCH] nvmxip: move header to include - -Move header to include to allow external code -to get the internal bdev structures to access -block device operations. - -as at it, just add the UCLASS_NVMXIP string -so we get the correct output in partitions -listing. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva ---- - disk/part.c | 3 +++ - {drivers/mtd/nvmxip => include}/nvmxip.h | 0 - 2 files changed, 3 insertions(+) - rename {drivers/mtd/nvmxip => include}/nvmxip.h (100%) - -diff --git a/disk/part.c b/disk/part.c -index 35300df590..f57dce7a29 100644 ---- a/disk/part.c -+++ b/disk/part.c -@@ -271,6 +271,9 @@ static void print_part_header(const char *type, struct blk_desc *dev_desc) - case UCLASS_NVME: - puts ("NVMe"); - break; -+ case UCLASS_NVMXIP: -+ puts ("NVMXIP"); -+ break; - case UCLASS_PVBLOCK: - puts("PV BLOCK"); - break; -diff --git a/drivers/mtd/nvmxip/nvmxip.h b/include/nvmxip.h -similarity index 100% -rename from drivers/mtd/nvmxip/nvmxip.h -rename to include/nvmxip.h diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-corstone1000-set-kernel_addr-based-on-boot_idx.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-corstone1000-set-kernel_addr-based-on-boot_idx.patch deleted file mode 100644 index 352873f9..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0027-corstone1000-set-kernel_addr-based-on-boot_idx.patch +++ /dev/null @@ -1,132 +0,0 @@ -From ae098fd5c47f6d805b356c892558a85d571bed67 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Tue, 18 Jul 2023 12:14:47 +0100 -Subject: [PATCH] corstone1000: set kernel_addr based on boot_idx - -We need to distinguish between boot banks and from which -partition to load the kernel+initramfs to memory. - -For that, fetch the boot index, fetch the correspondent -partition, calculate the correct kernel address and -then set the env variable kernel_addr with that value. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva ---- - board/armltd/corstone1000/corstone1000.c | 58 +++++++++++++++++++++- - board/armltd/corstone1000/corstone1000.env | 8 --- - configs/corstone1000_defconfig | 1 + - 3 files changed, 58 insertions(+), 9 deletions(-) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index ba6d024b80..a045262ebb 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -5,15 +5,25 @@ - * Rui Miguel Silva - */ - -+#include - #include - #include - #include -+#include - #include - #include -+#include -+#include - #include - #include - #include - -+#define CORSTONE1000_KERNEL_PARTS 2 -+#define CORSTONE1000_KERNEL_PRIMARY "kernel_primary" -+#define CORSTONE1000_KERNEL_SECONDARY "kernel_secondary" -+ -+static int corstone1000_boot_idx; -+ - static struct mm_region corstone1000_mem_map[] = { - { - /* CVM */ -@@ -110,5 +120,51 @@ int dram_init_banksize(void) - - void fwu_plat_get_bootidx(uint *boot_idx) - { -- *boot_idx = 0; -+ *boot_idx = corstone1000_boot_idx; -+} -+ -+int board_late_init(void) -+{ -+ struct disk_partition part_info; -+ struct udevice *dev, *bdev; -+ struct nvmxip_plat *plat; -+ struct blk_desc *desc; -+ int ret; -+ -+ ret = uclass_first_device_err(UCLASS_NVMXIP, &dev); -+ if (ret < 0) { -+ log_err("Cannot find kernel device\n"); -+ return ret; -+ } -+ -+ plat = dev_get_plat(dev); -+ device_find_first_child(dev, &bdev); -+ desc = dev_get_uclass_plat(bdev); -+ ret = fwu_get_active_index(&corstone1000_boot_idx); -+ if (ret < 0) -+ log_err("corstone1000: failed to read boot index\n"); -+ -+ if (!corstone1000_boot_idx) -+ ret = part_get_info_by_name(desc, CORSTONE1000_KERNEL_PRIMARY, -+ &part_info); -+ else -+ ret = part_get_info_by_name(desc, CORSTONE1000_KERNEL_SECONDARY, -+ &part_info); -+ -+ if (ret < 0) { -+ log_err("failed to fetch kernel partition index: %d\n", -+ corstone1000_boot_idx); -+ return ret; -+ } -+ -+ ret = 0; -+ -+ ret |= env_set_hex("kernel_addr", plat->phys_base + -+ (part_info.start * part_info.blksz)); -+ ret |= env_set_hex("kernel_size", part_info.size * part_info.blksz); -+ -+ if (ret < 0) -+ log_err("failed to setup kernel addr and size\n"); -+ -+ return ret; - } -diff --git a/board/armltd/corstone1000/corstone1000.env b/board/armltd/corstone1000/corstone1000.env -index a6ee496221..ee318b1b1c 100644 ---- a/board/armltd/corstone1000/corstone1000.env -+++ b/board/armltd/corstone1000/corstone1000.env -@@ -2,12 +2,4 @@ - - usb_pgood_delay=250 - boot_bank_flag=0x08005006 --kernel_addr_bank_0=0x08280000 --kernel_addr_bank_1=0x0936E000 --retrieve_kernel_load_addr= -- if itest.l *${boot_bank_flag} == 0; then -- setenv kernel_addr $kernel_addr_bank_0; -- else -- setenv kernel_addr $kernel_addr_bank_1; -- fi; - kernel_addr_r=0x88200000 -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 4c75a01818..0232131a11 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -20,6 +20,7 @@ CONFIG_CONSOLE_RECORD=y - CONFIG_LOGLEVEL=7 - # CONFIG_DISPLAY_CPUINFO is not set - # CONFIG_DISPLAY_BOARDINFO is not set -+CONFIG_BOARD_LATE_INIT=y - CONFIG_SYS_MAXARGS=64 - CONFIG_SYS_CBSIZE=512 - # CONFIG_CMD_CONSOLE is not set diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-corstone1000-boot-index-from-active.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-corstone1000-boot-index-from-active.patch deleted file mode 100644 index fee77974..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-corstone1000-boot-index-from-active.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 67c439b974da80208962c1c7f0a1291908e23a30 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Mon, 27 Feb 2023 14:40:13 +0000 -Subject: [PATCH] corstone1000: boot index from active - -In our platform, the Secure Enclave is the one who control -all the boot tries and status, so, every time we get here -we know that the we are booting from the active index. - -Upstream-Status: Pending -Signed-off-by: Rui Miguel Silva -Signed-off-by: Abdellatif El Khlifi ---- - board/armltd/corstone1000/corstone1000.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index a045262ebb..53c65506d5 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -120,7 +120,16 @@ int dram_init_banksize(void) - - void fwu_plat_get_bootidx(uint *boot_idx) - { -- *boot_idx = corstone1000_boot_idx; -+ int ret; -+ -+ /* -+ * in our platform, the Secure Enclave is the one who control -+ * all the boot tries and status, so, every time we get here -+ * we know that the we are booting from the active index -+ */ -+ ret = fwu_get_active_index(boot_idx); -+ if (ret < 0) -+ log_err("corstone1000: failed to read active index err %d\n", ret); - } - - int board_late_init(void) diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0029-corstone1000-enable-PSCI-reset.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0029-corstone1000-enable-PSCI-reset.patch deleted file mode 100644 index f722f81c..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0029-corstone1000-enable-PSCI-reset.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 8b7260db2b0c560b430657f801dd102fb2b141de Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Tue, 18 Jul 2023 12:19:17 +0100 -Subject: [PATCH] corstone1000: enable PSCI reset - -Even though corstone1000 does not implement entire PSCI APIs,it relies on -PSCI reset interface for the system reset. U-boot change the config name, so we -need to enable it again. - -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Emekcan Aras ---- - configs/corstone1000_defconfig | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 0232131a11..ccd558cfce 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -73,4 +73,5 @@ CONFIG_EFI_CAPSULE_ON_DISK=y - CONFIG_EFI_IGNORE_OSINDICATIONS=y - CONFIG_FWU_MULTI_BANK_UPDATE=y - # CONFIG_TOOLS_MKEFICAPSULE is not set --CONFIG_DM_GPIO=y -\ No newline at end of file -+CONFIG_DM_GPIO=y -+CONFIG_SYSRESET_PSCI=y -\ No newline at end of file diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0030-Enable-EFI-set-get-time-services.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0030-Enable-EFI-set-get-time-services.patch deleted file mode 100644 index 015ed439..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0030-Enable-EFI-set-get-time-services.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 03f53356a5b8b30b981ab7a16c6f48ca7fffe489 Mon Sep 17 00:00:00 2001 -From: Gowtham Suresh Kumar -Date: Tue, 18 Jul 2023 12:21:39 +0100 -Subject: [PATCH] Enable EFI set/get time services - -SetTime_Conf and SetTime_Func tests in UEFI SCT test suite of ACS -fails with unsupported return value. CONFIG_EFI_SET_TIME and -CONFIG_EFI_GET_TIME config values are added to enable these EFI -services. - -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Gowtham Suresh Kumar -Signed-off-by: Abdellatif El Khlifi ---- - configs/corstone1000_defconfig | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index ccd558cfce..a0af413de8 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -74,4 +74,6 @@ CONFIG_EFI_IGNORE_OSINDICATIONS=y - CONFIG_FWU_MULTI_BANK_UPDATE=y - # CONFIG_TOOLS_MKEFICAPSULE is not set - CONFIG_DM_GPIO=y --CONFIG_SYSRESET_PSCI=y -\ No newline at end of file -+CONFIG_SYSRESET_PSCI=y -+CONFIG_EFI_SET_TIME=y -+CONFIG_EFI_GET_TIME=y diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0031-corstone1000-detect-inflated-kernel-size.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0031-corstone1000-detect-inflated-kernel-size.patch deleted file mode 100644 index 8ee20aaa..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0031-corstone1000-detect-inflated-kernel-size.patch +++ /dev/null @@ -1,26 +0,0 @@ -From affde70e4ba728b0ce855f53501bdb5caa8afa6d Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Fri, 11 Aug 2023 10:41:19 +0100 -Subject: [PATCH] corstone1000: detect inflated kernel size - -use filesize variable set by unzip command - -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Abdellatif El Khlifi ---- - configs/corstone1000_defconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index a0af413de8..5b0b2ac3bf 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -15,7 +15,7 @@ CONFIG_DISTRO_DEFAULTS=y - CONFIG_BOOTDELAY=3 - CONFIG_USE_BOOTARGS=y - CONFIG_BOOTARGS="console=ttyAMA0 loglevel=9 ip=dhcp earlyprintk" --CONFIG_BOOTCOMMAND="echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r 0xf00000; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" -+CONFIG_BOOTCOMMAND="echo Loading kernel from $kernel_addr to memory ... ; unzip $kernel_addr 0x90000000; loadm 0x90000000 $kernel_addr_r $filesize; usb start; usb reset; run distro_bootcmd; bootefi $kernel_addr_r $fdtcontroladdr;" - CONFIG_CONSOLE_RECORD=y - CONFIG_LOGLEVEL=7 - # CONFIG_DISPLAY_CPUINFO is not set diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0032-corstone1000-ESRT-add-unique-firmware-GUID.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0032-corstone1000-ESRT-add-unique-firmware-GUID.patch deleted file mode 100644 index 1c34f338..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0032-corstone1000-ESRT-add-unique-firmware-GUID.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 1f1e0c35c9a11e956a8dc10002d17a497de947e3 Mon Sep 17 00:00:00 2001 -From: Anusmita Dutta Mazumder -Date: Tue, 8 Aug 2023 10:24:39 +0000 -Subject: [PATCH] corstone1000: ESRT: add unique firmware GUID - -Add unique Corstone-1000 firmware GUID - -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Anusmita Dutta Mazumder ---- - lib/efi_loader/efi_firmware.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c -index c6ab6e2182..7792a6aa83 100644 ---- a/lib/efi_loader/efi_firmware.c -+++ b/lib/efi_loader/efi_firmware.c -@@ -20,12 +20,12 @@ - #define FMP_PAYLOAD_HDR_SIGNATURE SIGNATURE_32('M', 'S', 'S', '1') - - #if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) --#define EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID \ -- EFI_GUID(0xe2bb9c06, 0x70e9, 0x4b14, 0x97, 0xa3, \ -- 0x5a, 0x79, 0x13, 0x17, 0x6e, 0x3f) -+/* Firmware GUID */ -+#define EFI_CORSTONE1000_FIRMWARE_GUID \ -+ EFI_GUID(0x989f3a4e, 0x46e0, 0x4cd0, 0x98, 0x77, \ -+ 0xa2, 0x5c, 0x70, 0xc0, 0x13, 0x29) - -- const efi_guid_t efi_firmware_image_type_uboot_raw = -- EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID; -+efi_guid_t corstone1000_firmware_guid = EFI_CORSTONE1000_FIRMWARE_GUID; - - static efi_status_t efi_corstone1000_img_info_get ( - efi_uintn_t *image_info_size, -@@ -353,7 +353,7 @@ efi_status_t EFIAPI efi_firmware_get_image_info( - descriptor_version, descriptor_count, - descriptor_size, - package_version, package_version_name, -- &efi_firmware_image_type_uboot_raw); -+ &corstone1000_firmware_guid); - #else - ret = efi_fill_image_desc_array(image_info_size, image_info, - descriptor_version, descriptor_count, diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0033-dt-Provide-a-way-to-remove-non-compliant-nodes-and-p.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0033-dt-Provide-a-way-to-remove-non-compliant-nodes-and-p.patch deleted file mode 100644 index ecc35675..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0033-dt-Provide-a-way-to-remove-non-compliant-nodes-and-p.patch +++ /dev/null @@ -1,134 +0,0 @@ -From f098724d2a59bf5c265a81c5b8767563c6c2d8de Mon Sep 17 00:00:00 2001 -From: Sughosh Ganu -Date: Thu, 21 Sep 2023 14:13:42 +0100 -Subject: [PATCH] dt: Provide a way to remove non-compliant nodes and - properties - -Add a function which is registered to spy for a EVT_FT_FIXUP event, -and removes the non upstreamed nodes and properties from the -devicetree before it gets passed to the OS. - -This allows removing entire nodes, or specific properties under nodes -from the devicetree. The required nodes and properties can be -registered for removal through the DT_NON_COMPLIANT_PURGE and -DT_NON_COMPLIANT_PURGE_LIST macros. - -Signed-off-by: Sughosh Ganu -Upstream-Status: Submitted [RFC: https://lore.kernel.org/u-boot/aca7e6fa-2dec-a7c5-e47e-84c5ffa6f9b7@gmx.de/T/#m16d14ee960427cc88066bdcdd76f0a26738bb66d] ---- - include/dt-structs.h | 11 +++++++ - lib/Makefile | 1 + - lib/dt_purge.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 85 insertions(+) - create mode 100644 lib/dt_purge.c - -diff --git a/include/dt-structs.h b/include/dt-structs.h -index fa1622cb1d..f535c60471 100644 ---- a/include/dt-structs.h -+++ b/include/dt-structs.h -@@ -57,3 +57,14 @@ struct phandle_2_arg { - #endif - - #endif -+ -+struct dt_non_compliant_purge { -+ const char *node_path; -+ const char *prop; -+}; -+ -+#define DT_NON_COMPLIANT_PURGE(__name) \ -+ ll_entry_declare(struct dt_non_compliant_purge, __name, dt_purge) -+ -+#define DT_NON_COMPLIANT_PURGE_LIST(__name) \ -+ ll_entry_declare_list(struct dt_non_compliant_purge, __name, dt_purge) -diff --git a/lib/Makefile b/lib/Makefile -index 8d8ccc8bbc..82a906daa0 100644 ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -37,6 +37,7 @@ endif - obj-y += crc8.o - obj-y += crc16.o - obj-y += crc16-ccitt.o -+obj-y += dt_purge.o - obj-$(CONFIG_ERRNO_STR) += errno_str.o - obj-$(CONFIG_FIT) += fdtdec_common.o - obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o -diff --git a/lib/dt_purge.c b/lib/dt_purge.c -new file mode 100644 -index 0000000000..f893ba9796 ---- /dev/null -+++ b/lib/dt_purge.c -@@ -0,0 +1,73 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (c) 2023, Linaro Limited -+ */ -+ -+#include -+#include -+#include -+ -+#include -+ -+/** -+ * dt_non_compliant_purge() - Remove non-upstreamed nodes and properties -+ * from the DT -+ * @ctx: Context for event -+ * @event: Event to process -+ * -+ * Iterate through an array of DT nodes and properties, and remove them -+ * from the device-tree before the DT gets handed over to the kernel. -+ * These are nodes and properties which do not have upstream bindings -+ * and need to be purged before being handed over to the kernel. -+ * -+ * If both the node and property are specified, delete the property. If -+ * only the node is specified, delete the entire node, including it's -+ * subnodes, if any. -+ * -+ * Return: 0 if OK, -ve on error -+ */ -+static int dt_non_compliant_purge(void *ctx, struct event *event) -+{ -+ int nodeoff = 0; -+ int err = 0; -+ void *fdt; -+ const struct event_ft_fixup *fixup = &event->data.ft_fixup; -+ struct dt_non_compliant_purge *purge_entry; -+ struct dt_non_compliant_purge *purge_start = -+ ll_entry_start(struct dt_non_compliant_purge, dt_purge); -+ int nentries = ll_entry_count(struct dt_non_compliant_purge, dt_purge); -+ -+ if (fixup->images) -+ return 0; -+ -+ fdt = fixup->tree.fdt; -+ for (purge_entry = purge_start; purge_entry != purge_start + nentries; -+ purge_entry++) { -+ nodeoff = fdt_path_offset(fdt, purge_entry->node_path); -+ if (nodeoff < 0) { -+ log_debug("Error (%d) getting node offset for %s\n", -+ nodeoff, purge_entry->node_path); -+ continue; -+ } -+ -+ if (purge_entry->prop) { -+ err = fdt_delprop(fdt, nodeoff, purge_entry->prop); -+ if (err < 0 && err != -FDT_ERR_NOTFOUND) { -+ log_debug("Error (%d) deleting %s\n", -+ err, purge_entry->prop); -+ goto out; -+ } -+ } else { -+ err = fdt_del_node(fdt, nodeoff); -+ if (err) { -+ log_debug("Error (%d) trying to delete node %s\n", -+ err, purge_entry->node_path); -+ goto out; -+ } -+ } -+ } -+ -+out: -+ return err; -+} -+EVENT_SPY(EVT_FT_FIXUP, dt_non_compliant_purge); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0034-bootefi-Call-the-EVT_FT_FIXUP-event-handler.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0034-bootefi-Call-the-EVT_FT_FIXUP-event-handler.patch deleted file mode 100644 index 54363e99..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0034-bootefi-Call-the-EVT_FT_FIXUP-event-handler.patch +++ /dev/null @@ -1,53 +0,0 @@ -From ff83070da7d1f547fc640e8446251f8e1e4ffc33 Mon Sep 17 00:00:00 2001 -From: Sughosh Ganu -Date: Thu, 21 Sep 2023 14:15:13 +0100 -Subject: [PATCH] bootefi: Call the EVT_FT_FIXUP event handler - -The bootefi command passes the devicetree to the kernel through the -EFI config table. Call the event handlers for fixing the devicetree -before jumping into the kernel. This removes any devicetree nodes -and/or properties that are specific only to U-Boot, and are not to be -passed to the OS. - -Signed-off-by: Sughosh Ganu -Upstream-Status: Submitted [RFC: https://lore.kernel.org/u-boot/aca7e6fa-2dec-a7c5-e47e-84c5ffa6f9b7@gmx.de/T/#m16d14ee960427cc88066bdcdd76f0a26738bb66d] ---- - cmd/bootefi.c | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/cmd/bootefi.c b/cmd/bootefi.c -index 5c0afec154..f9588b66c7 100644 ---- a/cmd/bootefi.c -+++ b/cmd/bootefi.c -@@ -237,6 +237,23 @@ static void *get_config_table(const efi_guid_t *guid) - return NULL; - } - -+/** -+ * event_notify_dt_fixup() - call ft_fixup event -+ * -+ * @fdt: address of the device tree to be passed to the kernel -+ * through the configuration table -+ * Return: None -+ */ -+static void event_notify_dt_fixup(void *fdt) -+{ -+ int ret; -+ struct event_ft_fixup fixup = {0}; -+ -+ fixup.tree.fdt = fdt; -+ ret = event_notify(EVT_FT_FIXUP, &fixup, sizeof(fixup)); -+ if (ret) -+ printf("Error: %d: FDT Fixup event failed\n", ret); -+} - #endif /* !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE) */ - - /** -@@ -318,6 +335,7 @@ efi_status_t efi_install_fdt(void *fdt) - efi_carve_out_dt_rsv(fdt); - - efi_try_purge_kaslr_seed(fdt); -+ event_notify_dt_fixup(fdt); - - if (CONFIG_IS_ENABLED(EFI_TCG2_PROTOCOL_MEASURE_DTB)) { - ret = efi_tcg2_measure_dtb(fdt); diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0035-corstone1000-purge-U-Boot-specific-DT-nodes.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0035-corstone1000-purge-U-Boot-specific-DT-nodes.patch deleted file mode 100644 index 090f32c5..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0035-corstone1000-purge-U-Boot-specific-DT-nodes.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 49e3463a397b61e859df5e1a383f82d64c1e4f3f Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Thu, 21 Sep 2023 15:24:34 +0100 -Subject: [PATCH] corstone1000: purge U-Boot specific DT nodes - -Remove U-Boot specific DT nodes before passing the DT to Linux - -This is needed to pass SystemReady IR 2.0 dt-schema tests - -Signed-off-by: Abdellatif El Khlifi -Upstream-Status: Pending [RFC: https://lore.kernel.org/u-boot/aca7e6fa-2dec-a7c5-e47e-84c5ffa6f9b7@gmx.de/T/#m16d14ee960427cc88066bdcdd76f0a26738bb66d] ---- - board/armltd/corstone1000/corstone1000.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index 53c65506d5..e3c0e5bf50 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -18,6 +19,20 @@ - #include - #include - -+/* remove the DT nodes not needed in Linux */ -+DT_NON_COMPLIANT_PURGE_LIST(foo) = { -+ { .node_path = "/fwu-mdata" }, -+ { .node_path = "/nvmxip-qspi@08000000" }, -+ { .node_path = "/soc/mailbox@1b820000" }, -+ { .node_path = "/soc/mailbox@1b830000" }, -+ { .node_path = "/soc/mhu@1b000000" }, -+ { .node_path = "/soc/mhu@1b010000" }, -+ { .node_path = "/soc/mhu@1b020000" }, -+ { .node_path = "/soc/mhu@1b030000" }, -+ { .node_path = "/soc/client" }, -+ { .node_path = "/soc/extsys@1A010310" }, -+}; -+ - #define CORSTONE1000_KERNEL_PARTS 2 - #define CORSTONE1000_KERNEL_PRIMARY "kernel_primary" - #define CORSTONE1000_KERNEL_SECONDARY "kernel_secondary" diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0036-corstone1000-add-signature-device-tree-overlay.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0036-corstone1000-add-signature-device-tree-overlay.patch deleted file mode 100644 index 62713abf..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0036-corstone1000-add-signature-device-tree-overlay.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 57e2230470c32bf2c6206813bcdfc9ce30b70c1d Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Wed, 13 Sep 2023 13:20:15 +0100 -Subject: [PATCH] corstone1000: add signature device tree overlay - -Adds signature device tree overlay. - -Signed-off-by: Emekcan Aras -Upstream-Status: Pending [Not submitted to upstream yet] ---- - arch/arm/dts/corstone1000.dtsi | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi -index 1e0ec075e4..077673dd44 100644 ---- a/arch/arm/dts/corstone1000.dtsi -+++ b/arch/arm/dts/corstone1000.dtsi -@@ -111,6 +111,10 @@ - fwu-mdata-store = <&nvmxip>; - }; - -+ signature { -+ capsule-key = /incbin/("../../../CRT.esl"); -+ }; -+ - soc { - compatible = "simple-bus"; - #address-cells = <1>; diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0037-corstone1000-enable-authenticated-capsule-config.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0037-corstone1000-enable-authenticated-capsule-config.patch deleted file mode 100644 index 65d5e151..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0037-corstone1000-enable-authenticated-capsule-config.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 509645079f3dbb6b14e920102bea75c2f408d195 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Wed, 13 Sep 2023 13:52:02 +0100 -Subject: [PATCH] corstone1000: enable authenticated capsule config - -Enables authenticated capsule update config for corstone1000. - -Signed-off-by: Emekcan Aras -Upstream-Status: Pending [Not submitted to upstream yet] ---- - configs/corstone1000_defconfig | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 5b0b2ac3bf..2de3f5d7b3 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -70,6 +70,7 @@ CONFIG_FWU_MDATA=y - CONFIG_FWU_MDATA_GPT_BLK=y - CONFIG_SYSRESET=y - CONFIG_EFI_CAPSULE_ON_DISK=y -+CONFIG_EFI_CAPSULE_AUTHENTICATE=y - CONFIG_EFI_IGNORE_OSINDICATIONS=y - CONFIG_FWU_MULTI_BANK_UPDATE=y - # CONFIG_TOOLS_MKEFICAPSULE is not set diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0038-corstone1000-introduce-EFI-authenticated-capsule-upd.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0038-corstone1000-introduce-EFI-authenticated-capsule-upd.patch deleted file mode 100644 index ae409321..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0038-corstone1000-introduce-EFI-authenticated-capsule-upd.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 3f06f148656fbe238ed8bd93f9631a95668f9406 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Wed, 13 Sep 2023 13:55:08 +0100 -Subject: [PATCH] corstone1000: introduce EFI authenticated capsule update - -Introduces EFI authenticated capsule update for corstone1000. Corstone1000 -implements platform-specific capsule update mechanism in u-bootdue to the SoC -design. This patch add authenticated capsule update mechanism to the -platform-specific firmware-update routine. - -Signed-off-by: Emekcan Aras -Upstream-Status: Inappropriate [Redesign of Capsule update interface is required] ---- - lib/efi_loader/efi_capsule.c | 39 ++++++++++++++++++++++++++++++++++++ - 1 file changed, 39 insertions(+) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index 6a06605ad9..e1c78d8c1c 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -820,6 +820,12 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule( - u64 scatter_gather_list) - { - struct efi_capsule_header *capsule; -+ struct efi_firmware_management_capsule_header *capsule_header; -+ struct efi_firmware_management_capsule_image_header *image; -+ size_t image_binary_size; -+ size_t tmp_capsule_payload_size=0; -+ void *tmp_capsule_payload=NULL; -+ void *image_binary; - unsigned int i; - efi_status_t ret; - -@@ -859,6 +865,39 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule( - goto out; - } - -+ capsule_header = (void *)capsule + capsule->header_size; -+ image = (void *)capsule_header + capsule_header->item_offset_list[0]; -+ if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE) && -+ !(image->image_capsule_support & -+ CAPSULE_SUPPORT_AUTHENTICATION)) { -+ /* no signature */ -+ log_err("Corstone1000: Capsule authentication flag check failed. Aborting update\n"); -+ ret = EFI_SECURITY_VIOLATION; -+ goto out; -+ } -+ -+ image_binary = (void *)image + sizeof(*image); -+ image_binary_size = image->update_image_size; -+ if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE) && -+ (image->image_capsule_support & -+ CAPSULE_SUPPORT_AUTHENTICATION)){ -+ ret = efi_capsule_authenticate(image_binary, image_binary_size, -+ &tmp_capsule_payload, -+ &tmp_capsule_payload_size); -+ -+ if (ret == EFI_SECURITY_VIOLATION) { -+ log_err("Corstone1000: Capsule authentication check failed. Aborting update\n"); -+ goto out; -+ } else if (ret != EFI_SUCCESS) { -+ goto out; -+ } -+ -+ log_debug("Corstone1000: Capsule authentication successful\n"); -+ } else { -+ log_debug("Corstone1000: Capsule authentication disabled. "); -+ log_debug("Corstone1000: Updating capsule without authenticating.\n"); -+ } -+ - /* copy the data to the contiguous buffer */ - efi_memcpy_runtime(corstone1000_capsule_buf, capsule, capsule->capsule_image_size); - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0039-enables-ondisk-capsule-update-feature.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0039-enables-ondisk-capsule-update-feature.patch deleted file mode 100644 index cd002aca..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0039-enables-ondisk-capsule-update-feature.patch +++ /dev/null @@ -1,33 +0,0 @@ -From e5057a10641a7c84186bcbbcd12ee904300ebc53 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Fri, 13 Oct 2023 15:19:32 +0100 -Subject: [PATCH] Enables on-disk capsule update feature - -Enables on-disk capsule update feature for corstone1000. - -Signed-off-by: Emekcan Aras -Upstream-Status: Inappropriate [Redesign of Capsule update interface is required] ---- - lib/efi_loader/efi_capsule.c | 5 ++++ - 1 file changed, 5 insertions(+) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index e1c78d8c1c..63e4c06e58 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -1499,7 +1499,12 @@ efi_status_t efi_launch_capsules(void) - index = 0; - ret = efi_capsule_read_file(files[i], &capsule); - if (ret == EFI_SUCCESS) { -+ #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -+ /* capsule update only supports 1 image and no scatter gather list for corstone1000 */ -+ efi_update_capsule(&capsule, 1, 0); -+ #elif - ret = efi_capsule_update_firmware(capsule); -+ #endif - if (ret != EFI_SUCCESS) { - log_err("Applying capsule %ls failed.\n", - files[i]); --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0040-fix-runtime-capsule-update-flags-checks.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0040-fix-runtime-capsule-update-flags-checks.patch deleted file mode 100644 index b1d400d7..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0040-fix-runtime-capsule-update-flags-checks.patch +++ /dev/null @@ -1,56 +0,0 @@ -From a83aa9e1b8f6e312da82e54614fbca498493c34d Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Thu, 19 Oct 2023 14:56:55 +0100 -Subject: [PATCH] fix runtime capsule update flags checks for corstone1000 - -Fixes capsule update flags checks in capsule update as these checks are missing -in the platform-specific capsule-update implementation in corstone1000. - -Signed-off-by: Emekcan Aras -Upstream-Status: Inappropriate [Redesign of Capsule update interface is required] ---- - lib/efi_loader/efi_capsule.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index 307bcfd73c..34507482b7 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -854,6 +854,34 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule( - continue; - } - -+ /* According to UEFI specs when the flag is CAPSULE_FLAGS_PERSIST_ACROSS_RESET, -+ ScatterGatherList can't be NULL.*/ -+ if ((capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) && -+ scatter_gather_list == 0){ -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ -+ /*According to UEFI specs a capsule which has the CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE -+ * flag must have CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its -+ * header as well.*/ -+ if (capsule->flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE){ -+ if(!(capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)){ -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ } -+ -+ /* According to UEFI specs, a capsule which has the CAPSULE_FLAGS_INITIATE_RESET -+ * Flag must have CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its -+ * header as well.*/ -+ if (capsule->flags & CAPSULE_FLAGS_INITIATE_RESET){ -+ if(!(capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)){ -+ ret = EFI_INVALID_PARAMETER; -+ goto out; -+ } -+ } -+ - log_debug("Capsule[%d] (guid:%pUs)\n", - i, &capsule->capsule_guid); - --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0041-scatter-gather-flag-workaround.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0041-scatter-gather-flag-workaround.patch deleted file mode 100644 index 8ce82a75..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0041-scatter-gather-flag-workaround.patch +++ /dev/null @@ -1,39 +0,0 @@ -From abc3b43996198012498abe5777cfeedde4538a90 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Mon, 6 Nov 2023 14:52:05 +0000 -Subject: [PATCH] workaround for scatter gather flag check for corstone1000 - -This workaround passes 1 as scatter_gather_list value to pass the NULL checks -for scatter_gather_list while CAPSULE_FLAGS_PERSIST_ACROSS_RESET flag is set -(which is introduced lately to align with UEFI specs). Since these flag checks -are not implemented in u-boot properly and corstone1000 does not support -scatter_gather_list during capsule update, this patch will skip the check only -for on-disk capsule update. - -Signed-off-by: Emekcan Aras -Upstream-Status: Inappropriate [Redesign of Capsule update interface is required] ---- - lib/efi_loader/efi_capsule.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index a7d70acf2a..efbedce460 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -1530,8 +1530,11 @@ efi_status_t efi_launch_capsules(void) - ret = efi_capsule_read_file(files[i], &capsule); - if (ret == EFI_SUCCESS) { - #if IS_ENABLED(CONFIG_TARGET_CORSTONE1000) -- /* capsule update only supports 1 image and no scatter gather list for corstone1000 */ -- efi_update_capsule(&capsule, 1, 0); -+ /* capsule update only supports 1 image and use of scatter_gather_list -+ * is not implemented for corstone1000 passing 1 to pass -+ * the NULL flag checks. This should will be fixed with -+ * new capsule update design*/ -+ ret = efi_update_capsule(&capsule, 1, 1); - #elif - ret = efi_capsule_update_firmware(capsule); - #endif --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0042-corstone1000-enable-virtio-net-support.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0042-corstone1000-enable-virtio-net-support.patch deleted file mode 100644 index 58b21a9c..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0042-corstone1000-enable-virtio-net-support.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 46a1faf3687764ddf1567455de39482b72e50725 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Wed, 15 Nov 2023 16:04:06 +0000 -Subject: [PATCH] corstone1000: enable virtio-net support - -Adds virtio-net support in corstone1000-fvp. - -Signed-off-by: Emekcan Aras -Upstream-Status: Pending [Not submitted to upstream yet] ---- - arch/arm/dts/corstone1000-fvp.dts | 6 ++++++ - board/armltd/corstone1000/corstone1000.c | 24 +++++++++++++++++++++++- - configs/corstone1000_defconfig | 2 ++ - 3 files changed, 31 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/dts/corstone1000-fvp.dts b/arch/arm/dts/corstone1000-fvp.dts -index 26b0f1b3ce..8e54a40113 100644 ---- a/arch/arm/dts/corstone1000-fvp.dts -+++ b/arch/arm/dts/corstone1000-fvp.dts -@@ -21,6 +21,12 @@ - reg-io-width = <2>; - }; - -+ virtio: virtio-net@40400000 { -+ compatible = "virtio,mmio"; -+ reg = <0x40400000 0x10000>; -+ interrupts = <145>; -+ }; -+ - vmmc_v3_3d: fixed_v3_3d { - compatible = "regulator-fixed"; - regulator-name = "vmmc_supply"; -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index e3c0e5bf50..ef74dc9032 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - - /* remove the DT nodes not needed in Linux */ - DT_NON_COMPLIANT_PURGE_LIST(foo) = { -@@ -101,6 +102,14 @@ static struct mm_region corstone1000_mem_map[] = { - .size = 0x80000000UL, - .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | - PTE_BLOCK_INNER_SHARE -+ }, { -+ /* ethernet */ -+ .virt = 0x40400000UL, -+ .phys = 0x40400000UL, -+ .size = 0x00100000UL, -+ .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | -+ PTE_BLOCK_NON_SHARE | -+ PTE_BLOCK_PXN | PTE_BLOCK_UXN - }, { - /* List terminator */ - 0, -@@ -150,10 +159,23 @@ void fwu_plat_get_bootidx(uint *boot_idx) - int board_late_init(void) - { - struct disk_partition part_info; -- struct udevice *dev, *bdev; -+ struct udevice *dev, *bdev,*virtio_bus, *virtio_child;; - struct nvmxip_plat *plat; - struct blk_desc *desc; - int ret; -+ const char *cmp_dtb = DEVICE_TREE; -+ -+ if (!strcmp(cmp_dtb, "corstone1000-fvp")) { -+ ret = uclass_first_device_err(UCLASS_VIRTIO, &virtio_bus); -+ if (!virtio_bus){ -+ log_err("Cannot find virtio device\n"); -+ return ret; -+ } -+ while (virtio_bus) { -+ device_foreach_child_probe(virtio_child, virtio_bus); -+ uclass_next_device(&virtio_bus); -+ } -+ } - - ret = uclass_first_device_err(UCLASS_NVMXIP, &dev); - if (ret < 0) { -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 2de3f5d7b3..8770b474e2 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -78,3 +78,5 @@ CONFIG_DM_GPIO=y - CONFIG_SYSRESET_PSCI=y - CONFIG_EFI_SET_TIME=y - CONFIG_EFI_GET_TIME=y -+CONFIG_VIRTIO_NET=y -+CONFIG_VIRTIO_MMIO=y diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0043-firmware-psci-Fix-bind_smccc_features-psci-check.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0043-firmware-psci-Fix-bind_smccc_features-psci-check.patch deleted file mode 100644 index 946caa24..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0043-firmware-psci-Fix-bind_smccc_features-psci-check.patch +++ /dev/null @@ -1,57 +0,0 @@ -From fda3d08d17050a8b338ef4288d20389788b5b7e6 Mon Sep 17 00:00:00 2001 -From: Weizhao Ouyang -Date: Mon, 4 Mar 2024 14:42:40 +0000 -Subject: [PATCH] firmware: psci: Fix bind_smccc_features psci check - -Message-ID: <20240304144242.11666-2-o451686892@gmail.com> (raw) -In-Reply-To: <20240304144242.11666-1-o451686892@gmail.com> - -According to PSCI specification DEN0022F, PSCI_FEATURES is used to check -whether the SMCCC is implemented by discovering SMCCC_VERSION. - -Signed-off-by: Weizhao Ouyang -Signed-off-by: Bence Balogh -Upstream-Status: Submitted [https://lore.kernel.org/all/20240304144242.11666-2-o451686892@gmail.com/] ---- - drivers/firmware/psci.c | 5 ++++- - include/linux/arm-smccc.h | 6 ++++++ - 2 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c -index c6b9efab41..03544d76ed 100644 ---- a/drivers/firmware/psci.c -+++ b/drivers/firmware/psci.c -@@ -135,10 +135,13 @@ static int bind_smccc_features(struct udevice *dev, int psci_method) - PSCI_VERSION_MAJOR(psci_0_2_get_version()) == 0) - return 0; - -- if (request_psci_features(ARM_SMCCC_ARCH_FEATURES) == -+ if (request_psci_features(ARM_SMCCC_VERSION) == - PSCI_RET_NOT_SUPPORTED) - return 0; - -+ if (invoke_psci_fn(ARM_SMCCC_VERSION, 0, 0, 0) < ARM_SMCCC_VERSION_1_1) -+ return 0; -+ - if (psci_method == PSCI_METHOD_HVC) - pdata->invoke_fn = smccc_invoke_hvc; - else -diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h -index f44e9e8f93..da3d29aabe 100644 ---- a/include/linux/arm-smccc.h -+++ b/include/linux/arm-smccc.h -@@ -55,8 +55,14 @@ - #define ARM_SMCCC_QUIRK_NONE 0 - #define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */ - -+#define ARM_SMCCC_VERSION 0x80000000 - #define ARM_SMCCC_ARCH_FEATURES 0x80000001 - -+#define ARM_SMCCC_VERSION_1_0 0x10000 -+#define ARM_SMCCC_VERSION_1_1 0x10001 -+#define ARM_SMCCC_VERSION_1_2 0x10002 -+#define ARM_SMCCC_VERSION_1_3 0x10003 -+ - #define ARM_SMCCC_RET_NOT_SUPPORTED ((unsigned long)-1) - - #ifndef __ASSEMBLY__ diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0044-corstone1000-set-unique-GUID-for-fvp-and-mps3.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0044-corstone1000-set-unique-GUID-for-fvp-and-mps3.patch deleted file mode 100644 index 86b1071c..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0044-corstone1000-set-unique-GUID-for-fvp-and-mps3.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 6dc17c01df592f685636e34ad8bb0a6ecb994e15 Mon Sep 17 00:00:00 2001 -From: Anusmita Dutta Mazumder -Date: Thu, 21 Mar 2024 20:34:46 +0000 -Subject: [PATCH] corstone1000: set unique GUID for fvp and mps3 - -This patch sets unique GUID for Corstone1000 FVP and MPS3 - -Upstream-Status: Inappropriate [Redesign of Capsule update interface is required] -Signed-off-by: Anusmita Dutta Mazumder ---- - lib/efi_loader/efi_firmware.c | 15 +++++++++++++-- - 1 file changed, 13 insertions(+), 2 deletions(-) - -diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c -index 7792a6aa83..1e49f79864 100644 ---- a/lib/efi_loader/efi_firmware.c -+++ b/lib/efi_loader/efi_firmware.c -@@ -16,16 +16,19 @@ - - #include - #include -+#include - - #define FMP_PAYLOAD_HDR_SIGNATURE SIGNATURE_32('M', 'S', 'S', '1') - - #if CONFIG_IS_ENABLED(TARGET_CORSTONE1000) - /* Firmware GUID */ --#define EFI_CORSTONE1000_FIRMWARE_GUID \ -+#define EFI_CORSTONE1000_FIRMWARE_GUID_FVP \ - EFI_GUID(0x989f3a4e, 0x46e0, 0x4cd0, 0x98, 0x77, \ - 0xa2, 0x5c, 0x70, 0xc0, 0x13, 0x29) - --efi_guid_t corstone1000_firmware_guid = EFI_CORSTONE1000_FIRMWARE_GUID; -+#define EFI_CORSTONE1000_FIRMWARE_GUID_MPS3 \ -+ EFI_GUID(0xdf1865d1, 0x90fb, 0x4d59, 0x9c, 0x38, \ -+ 0xc9, 0xf2, 0xc1, 0xbb, 0xa8, 0xcc) - - static efi_status_t efi_corstone1000_img_info_get ( - efi_uintn_t *image_info_size, -@@ -334,6 +337,14 @@ efi_status_t EFIAPI efi_firmware_get_image_info( - u16 **package_version_name) - { - efi_status_t ret; -+ efi_guid_t corstone1000_firmware_guid; -+ const char *cmp_dtb = DEVICE_TREE; -+ -+ if (!strcmp(cmp_dtb, "corstone1000-fvp")) { -+ corstone1000_firmware_guid = (efi_guid_t)EFI_CORSTONE1000_FIRMWARE_GUID_FVP; -+ } else { -+ corstone1000_firmware_guid = (efi_guid_t)EFI_CORSTONE1000_FIRMWARE_GUID_MPS3; -+ } - - EFI_ENTRY("%p %p %p %p %p %p %p %p\n", this, - image_info_size, image_info, --- -2.38.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0045-efi-corstone1000-fwu-update-RPC-ABI.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0045-efi-corstone1000-fwu-update-RPC-ABI.patch deleted file mode 100644 index 00fc1f07..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0045-efi-corstone1000-fwu-update-RPC-ABI.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 7c25404d64ef8efec63c154ce38b0bb38845680f Mon Sep 17 00:00:00 2001 -From: Bence Balogh -Date: Tue, 5 Dec 2023 20:23:55 +0100 -Subject: [PATCH] efi: corstone1000: fwu: update RPC ABI - -The Trusted Services RPC protocol format changed: the -data has to be placed in w3 and the memory handle has -to be placed in w4-w5. - -Signed-off-by: Bence Balogh -Upstream-Status: Pending [Not submitted to upstream yet] ---- - lib/efi_loader/efi_capsule.c | 14 +++++++++++--- - lib/efi_loader/efi_setup.c | 14 +++++++++++--- - 2 files changed, 22 insertions(+), 6 deletions(-) - -diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c -index f3326b1f67..1d966e3f26 100644 ---- a/lib/efi_loader/efi_capsule.c -+++ b/lib/efi_loader/efi_capsule.c -@@ -790,12 +790,20 @@ static int __efi_runtime efi_corstone1000_buffer_ready_event(u32 capsule_image_s - } - - /* -- * setting the buffer ready event arguments in register w4: -+ * setting the buffer ready event arguments in register w3: - * - capsule update interface ID (31:16) - * - the buffer ready event ID (15:0) - */ -- msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | -- PREP_SEPROXY_EVT(CORSTONE1000_BUFFER_READY_EVT); /* w4 */ -+ msg.data0 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | -+ PREP_SEPROXY_EVT(CORSTONE1000_BUFFER_READY_EVT); /* w3 */ -+ -+ /* -+ * setting the memory handle fields to -+ * FFA_MEM_HANDLE_INVALID (0xFFFF_FFFF_FFFF_FFFF) -+ * to signal that there is no shared memory used -+ */ -+ msg.data1 = 0xFFFFFFFF; /* w4 */ -+ msg.data2 = 0xFFFFFFFF; /* w5 */ - - return ffa_sync_send_receive(dev, CORSTONE1000_SEPROXY_PART_ID, &msg, 0); - } -diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c -index d20568c1c8..c31e74532f 100644 ---- a/lib/efi_loader/efi_setup.c -+++ b/lib/efi_loader/efi_setup.c -@@ -157,12 +157,20 @@ static int efi_corstone1000_uboot_efi_started_event(void) - } - - /* -- * setting the kernel started event arguments: -+ * setting the kernel started event arguments in register w3:: - * setting capsule update interface ID(31:16) - * the kernel started event ID(15:0) - */ -- msg.data1 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | -- PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); /* w4 */ -+ msg.data0 = PREP_SEPROXY_SVC_ID(CORSTONE1000_SEPROXY_UPDATE_SVC_ID) | -+ PREP_SEPROXY_EVT(CORSTONE1000_UBOOT_EFI_STARTED_EVT); /* w3 */ -+ -+ /* -+ * setting the memory handle fields to -+ * FFA_MEM_HANDLE_INVALID (0xFFFF_FFFF_FFFF_FFFF) -+ * to signal that there is no shared memory used -+ */ -+ msg.data1 = 0xFFFFFFFF; /* w4 */ -+ msg.data2 = 0xFFFFFFFF; /* w5 */ - - return ffa_sync_send_receive(dev, CORSTONE1000_SEPROXY_PART_ID, &msg, 0); - } --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0046-Corstone1000-Change-MMCOMM-buffer-location.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0046-Corstone1000-Change-MMCOMM-buffer-location.patch deleted file mode 100644 index 500db81e..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0046-Corstone1000-Change-MMCOMM-buffer-location.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 7721d33dfc87b40db72cefa399c46b25b1255247 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Wed, 3 Apr 2024 14:02:42 +0100 -Subject: [PATCH] Corstone1000: Change MMCOMM buffer location - -MM Communicate buffer is accessed by normal world but at the moment -it's allocated in the secure ram. This moves mm communicate buffer -to the DDR and also fixes the capsule buffer size since it cannot be -more than the bank size. - -Signed-off-by: Emekcan Aras -Upstream-Status: Pending [Not submitted to upstream yet] ---- - configs/corstone1000_defconfig | 2 +- - include/configs/corstone1000.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 8770b474e2..ae164be030 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -62,7 +62,7 @@ CONFIG_NVMXIP_QSPI=y - CONFIG_EFI_MM_COMM_TEE=y - CONFIG_FFA_SHARED_MM_BUF_SIZE=4096 - CONFIG_FFA_SHARED_MM_BUF_OFFSET=0 --CONFIG_FFA_SHARED_MM_BUF_ADDR=0x02000000 -+CONFIG_FFA_SHARED_MM_BUF_ADDR=0x81FFF000 - CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y - CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y - CONFIG_FWU_NUM_IMAGES_PER_BANK=4 -diff --git a/include/configs/corstone1000.h b/include/configs/corstone1000.h -index 8622565a87..fe5b064c85 100644 ---- a/include/configs/corstone1000.h -+++ b/include/configs/corstone1000.h -@@ -31,7 +31,7 @@ - #define PREP_SEPROXY_EVT(x) (FIELD_PREP(PREP_SEPROXY_EVT_MASK, (x))) - - /* Size in 4KB pages of the EFI capsule buffer */ --#define CORSTONE1000_CAPSULE_BUFFER_SIZE (8192) /* 32 MB */ -+#define CORSTONE1000_CAPSULE_BUFFER_SIZE (4096) /* 16 MB */ - - /* Capsule GUID */ - #define EFI_CORSTONE1000_CAPSULE_ID_GUID \ --- -2.25.1 - - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0047-corstone1000-dts-add-external-system-node.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0047-corstone1000-dts-add-external-system-node.patch deleted file mode 100644 index 1c873001..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0047-corstone1000-dts-add-external-system-node.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 03df80671f1f2102b04baa810b59ffb6edaece0b Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Mon, 18 Mar 2024 17:00:56 +0000 -Subject: [PATCH] corstone1000: dts: add external system node - -add the external system node - -Signed-off-by: Abdellatif El Khlifi -Upstream-Status: Pending [Not submitted to upstream yet] ---- - arch/arm/dts/corstone1000.dtsi | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi -index 077673dd44..5cc4c26bac 100644 ---- a/arch/arm/dts/corstone1000.dtsi -+++ b/arch/arm/dts/corstone1000.dtsi -@@ -122,6 +122,13 @@ - interrupt-parent = <&gic>; - ranges; - -+ extsys0: remoteproc@1a010310 { -+ compatible = "arm,corstone1000-extsys"; -+ reg = <0x1a010310 0x4>, <0x1a010314 0x4>; -+ reg-names = "reset-control", "reset-status"; -+ firmware-name = "es_flashfw.elf"; -+ }; -+ - timer@1a220000 { - compatible = "arm,armv7-timer-mem"; - reg = <0x1a220000 0x1000>; --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0048-corstone1000-Enable-UEFI-Secure-boot.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0048-corstone1000-Enable-UEFI-Secure-boot.patch deleted file mode 100644 index 1e91249a..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0048-corstone1000-Enable-UEFI-Secure-boot.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b2ef7318686d13cfa2ac76d6f2d69c17135328df Mon Sep 17 00:00:00 2001 -From: Harsimran Singh Tungal -Date: Thu, 11 Apr 2024 13:35:54 +0000 -Subject: [PATCH] corstone1000: Enable UEFI Secure boot - -Enable secure boot and related configurations for corstone1000 - -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Harsimran Singh Tungal ---- - configs/corstone1000_defconfig | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/configs/corstone1000_defconfig b/configs/corstone1000_defconfig -index 8770b474e2..0ecba096d5 100644 ---- a/configs/corstone1000_defconfig -+++ b/configs/corstone1000_defconfig -@@ -80,3 +80,7 @@ CONFIG_EFI_SET_TIME=y - CONFIG_EFI_GET_TIME=y - CONFIG_VIRTIO_NET=y - CONFIG_VIRTIO_MMIO=y -+CONFIG_EFI_SECURE_BOOT=y -+CONFIG_FIT_SIGNATURE=y -+CONFIG_EFI_LOADER=y -+CONFIG_CMD_NVEDIT_EFI=y --- -2.34.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0049-corstone1000-Add-secondary-cores-cpu-nodes-for-FVP.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0049-corstone1000-Add-secondary-cores-cpu-nodes-for-FVP.patch deleted file mode 100644 index 0e90f577..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0049-corstone1000-Add-secondary-cores-cpu-nodes-for-FVP.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 68708d6b4953f58a0484b9a83efa8318747cea80 Mon Sep 17 00:00:00 2001 -From: Harsimran Singh Tungal -Date: Thu, 9 May 2024 14:16:55 +0000 -Subject: [PATCH] arm: dts: corstone1000: enable secondary cores for FVP - -Add the secondary cores nodes in the dts file - -Upstream-Status: Submitted [https://lore.kernel.org/all/20240612100421.47938-1-harsimransingh.tungal@arm.com/] -Signed-off-by: Harsimran Singh Tungal ---- - arch/arm/dts/corstone1000-fvp.dts | 25 +++++++++++++++++++++++++ - arch/arm/dts/corstone1000.dtsi | 2 +- - 2 files changed, 26 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/dts/corstone1000-fvp.dts b/arch/arm/dts/corstone1000-fvp.dts -index 26b0f1b3ce..3076fb9f34 100644 ---- a/arch/arm/dts/corstone1000-fvp.dts -+++ b/arch/arm/dts/corstone1000-fvp.dts -@@ -49,3 +49,28 @@ - clock-names = "smclk", "apb_pclk"; - }; - }; -+ -+&cpus { -+ cpu1: cpu@1 { -+ device_type = "cpu"; -+ compatible = "arm,cortex-a35"; -+ reg = <0x1>; -+ enable-method = "psci"; -+ next-level-cache = <&L2_0>; -+ }; -+ cpu2: cpu@2 { -+ device_type = "cpu"; -+ compatible = "arm,cortex-a35"; -+ reg = <0x2>; -+ enable-method = "psci"; -+ next-level-cache = <&L2_0>; -+ }; -+ cpu3: cpu@3 { -+ device_type = "cpu"; -+ compatible = "arm,cortex-a35"; -+ reg = <0x3>; -+ enable-method = "psci"; -+ next-level-cache = <&L2_0>; -+ }; -+}; -+ -diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi -index 1e0ec075e4..5d9d95b21c 100644 ---- a/arch/arm/dts/corstone1000.dtsi -+++ b/arch/arm/dts/corstone1000.dtsi -@@ -21,7 +21,7 @@ - stdout-path = "serial0:115200n8"; - }; - -- cpus { -+ cpus: cpus { - #address-cells = <1>; - #size-cells = <0>; - --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0050-fwu-Use-metadata-v2.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0050-fwu-Use-metadata-v2.patch deleted file mode 100644 index 4388db44..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0050-fwu-Use-metadata-v2.patch +++ /dev/null @@ -1,105 +0,0 @@ -From 54b407fc74c9989c72ab7a571395d8793b409514 Mon Sep 17 00:00:00 2001 -From: Bence Balogh -Date: Wed, 3 Jul 2024 16:38:22 +0200 -Subject: [PATCH] fwu: Use metadata v2 - -The mdata structure was modified to use the v2 and did the minimal -necessarry changes to make it build without errors. This way the -U-Boot metadata is aligned with the TF-A and TF-M structs. - -Upstream-Status: Inappropriate -[This is done correctly upstream but using the upstream patches would -require too many backported patches. The merge commit of the upstream -changes is 7e52d6ccfb76e2afc2d183b357abe2a2e2f948cf.] -Signed-off-by: Bence Balogh ---- - cmd/fwu_mdata.c | 2 +- - include/fwu_mdata.h | 17 ++++++++++++++++- - lib/fwu_updates/fwu.c | 8 ++++---- - 3 files changed, 21 insertions(+), 6 deletions(-) - -diff --git a/cmd/fwu_mdata.c b/cmd/fwu_mdata.c -index f04af27de6..73374dca8b 100644 ---- a/cmd/fwu_mdata.c -+++ b/cmd/fwu_mdata.c -@@ -27,7 +27,7 @@ static void print_mdata(struct fwu_mdata *mdata) - - printf("\tImage Info\n"); - for (i = 0; i < CONFIG_FWU_NUM_IMAGES_PER_BANK; i++) { -- img_entry = &mdata->img_entry[i]; -+ img_entry = &mdata->fw_desc.img_entry[i]; - printf("\nImage Type Guid: %pUL\n", - &img_entry->image_type_uuid); - printf("Location Guid: %pUL\n", &img_entry->location_uuid); -diff --git a/include/fwu_mdata.h b/include/fwu_mdata.h -index c61221a917..6a0eb7dce9 100644 ---- a/include/fwu_mdata.h -+++ b/include/fwu_mdata.h -@@ -40,6 +40,16 @@ struct fwu_image_entry { - struct fwu_image_bank_info img_bank_info[CONFIG_FWU_NUM_BANKS]; - } __packed; - -+struct fwu_fw_store_desc { -+ uint8_t num_banks; -+ uint8_t reserved; -+ uint16_t num_images; -+ uint16_t img_entry_size; -+ uint16_t bank_info_entry_size; -+ -+ struct fwu_image_entry img_entry[CONFIG_FWU_NUM_IMAGES_PER_BANK]; -+} __packed; -+ - /** - * struct fwu_mdata - FWU metadata structure for multi-bank updates - * @crc32: crc32 value for the FWU metadata -@@ -60,8 +70,13 @@ struct fwu_mdata { - uint32_t version; - uint32_t active_index; - uint32_t previous_active_index; -+ uint32_t metadata_size; -+ uint16_t desc_offset; -+ uint16_t reserved1; -+ uint8_t bank_state[4]; -+ uint32_t reserved2; - -- struct fwu_image_entry img_entry[CONFIG_FWU_NUM_IMAGES_PER_BANK]; -+ struct fwu_fw_store_desc fw_desc; - } __packed; - - #endif /* _FWU_MDATA_H_ */ -diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c -index 5313d07302..488c9cc661 100644 ---- a/lib/fwu_updates/fwu.c -+++ b/lib/fwu_updates/fwu.c -@@ -131,7 +131,7 @@ static int in_trial_state(struct fwu_mdata *mdata) - struct fwu_image_bank_info *img_bank_info; - - active_bank = mdata->active_index; -- img_entry = &mdata->img_entry[0]; -+ img_entry = &mdata->fw_desc.img_entry[0]; - for (i = 0; i < CONFIG_FWU_NUM_IMAGES_PER_BANK; i++) { - img_bank_info = &img_entry[i].img_bank_info[active_bank]; - if (!img_bank_info->accepted) { -@@ -418,8 +418,8 @@ int fwu_get_image_index(u8 *image_index) - */ - for (i = 0; i < CONFIG_FWU_NUM_IMAGES_PER_BANK; i++) { - if (!guidcmp(&image_type_id, -- &mdata.img_entry[i].image_type_uuid)) { -- img_entry = &mdata.img_entry[i]; -+ &mdata.fw_desc.img_entry[i].image_type_uuid)) { -+ img_entry = &mdata.fw_desc.img_entry[i]; - img_bank_info = &img_entry->img_bank_info[update_bank]; - image_guid = &img_bank_info->image_uuid; - ret = fwu_plat_get_alt_num(dev, image_guid, &alt_num); -@@ -512,7 +512,7 @@ static int fwu_clrset_image_accept(efi_guid_t *img_type_id, u32 bank, u8 action) - if (ret) - return ret; - -- img_entry = &mdata.img_entry[0]; -+ img_entry = &mdata.fw_desc.img_entry[0]; - for (i = 0; i < CONFIG_FWU_NUM_IMAGES_PER_BANK; i++) { - if (!guidcmp(&img_entry[i].image_type_uuid, img_type_id)) { - img_bank_info = &img_entry[i].img_bank_info[bank]; --- -2.25.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0051-corstone1000-purge-remoteproc-dts-node.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0051-corstone1000-purge-remoteproc-dts-node.patch deleted file mode 100644 index 3b0430c8..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0051-corstone1000-purge-remoteproc-dts-node.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 4e0ab7af882fcf498fd8beb4024ea024e6464cef Mon Sep 17 00:00:00 2001 -From: Harsimran Singh Tungal -Date: Wed, 14 Aug 2024 14:33:50 +0000 -Subject: [PATCH] corstone1000: purge remoteproc DTS node - -Purge remoteproc DTS node -This is done to remove the remote proc node from the DTS passed -to Linux from U-Boot because the device tree binding for remoteproc -has not been upstreamed yet. Existence of remoteproc DTS node in Linux -is causing dt-schema test for SystemReady-IR v2.0 certification to fail. - -Upstream-Status: Pending -Signed-off-by: Harsimran Singh Tungal ---- - board/armltd/corstone1000/corstone1000.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/board/armltd/corstone1000/corstone1000.c b/board/armltd/corstone1000/corstone1000.c -index ef74dc9032..d474fce1b2 100644 ---- a/board/armltd/corstone1000/corstone1000.c -+++ b/board/armltd/corstone1000/corstone1000.c -@@ -30,8 +30,7 @@ DT_NON_COMPLIANT_PURGE_LIST(foo) = { - { .node_path = "/soc/mhu@1b010000" }, - { .node_path = "/soc/mhu@1b020000" }, - { .node_path = "/soc/mhu@1b030000" }, -- { .node_path = "/soc/client" }, -- { .node_path = "/soc/extsys@1A010310" }, -+ { .node_path = "/soc/remoteproc@1a010310" }, - }; - - #define CORSTONE1000_KERNEL_PARTS 2 --- -2.34.1 - diff --git a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0052-reserve-memory-for-se-comm.patch b/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0052-reserve-memory-for-se-comm.patch deleted file mode 100644 index 73fdc4bd..00000000 --- a/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0052-reserve-memory-for-se-comm.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 8fdd91630f335b71e55e570a011f07b083c47dd6 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Mon, 10 Jul 2023 19:00:43 +0100 -Subject: [PATCH] arm-bsp/u-boot: Reserve memory for RSS comm pointer access protocol - -This memory was used by OpenAMP to establish communication between -the Secure Enclave and Trusted Services. After transitioning from -OpenAMP to RSE_COMMS, this shared memory is now configured for the -pointer access protocol in RSE_COMMS. - -Since this memory may be still used by a user-space application -in linux as U-Boot is passing an EFI memory map starting from -0x80000000, this memory range should be reserved as the -pointer access protocol may be enabled on corstone1000 in the future. - -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Emekcan Aras - ---- - arch/arm/dts/corstone1000.dtsi | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/arch/arm/dts/corstone1000.dtsi b/arch/arm/dts/corstone1000.dtsi -index 0f8ad255ce..a71b89c025 100644 ---- a/arch/arm/dts/corstone1000.dtsi -+++ b/arch/arm/dts/corstone1000.dtsi -@@ -45,6 +45,17 @@ - lba = <65536>; - }; - -+ reserved-memory { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ -+ smem_mem: smem_region@88000000 { -+ reg = <0x0 0x88000000 0x0 0x100000>; -+ no-map; -+ }; -+ }; -+ - gic: interrupt-controller@1c000000 { - compatible = "arm,gic-400"; - #interrupt-cells = <3>; --- -2.17.1