[PATCH 23/25] fwu_arm_psa: corstone1000: Notify SE Proxy SP on ExitBootService()
abdellatif.elkhlifi at arm.com
abdellatif.elkhlifi at arm.com
Wed Jul 2 17:25:26 CEST 2025
From: Abdellatif El Khlifi <abdellatif.elkhlifi at arm.com>
Implement the notification in fwu_notify_exit_boot_services()
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi at arm.com>
Cc: Tom Rini <trini at konsulko.com>
Cc: Hugues Kamba Mpiana <hugues.kambampiana at 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 <rui.silva at linaro.org>
*/
+#include <arm_ffa.h>
#include <blk.h>
#include <cpu_func.h>
#include <dm.h>
@@ -19,11 +20,28 @@
#include <dm/platform_data/serial_pl01x.h>
#include <asm/armv8/mmu.h>
#include <asm/global_data.h>
+#include <linux/bitfield.h>
#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
More information about the U-Boot
mailing list