[PATCH] firmware: stratix10-svc: extend support for async generic mailbox command
From: Adrian Ng Ho Yin
Date: Fri Jul 31 2026 - 03:44:29 EST
Add INTEL_SIP_SMC_ASYNC_MBOX_SEND (function ID 0xEE) to send a generic
mailbox command to the SDM via the async SMC interface. Handle the new
COMMAND_MBOX_SEND_CMD in stratix10_svc_async_send() by resolving input
and output payload virtual addresses to their physical counterparts and
populating SMC argument registers a2-a6. Also handle the response in
stratix10_svc_async_prepare_response() by forwarding the SDM return
code via kaddr1.
Signed-off-by: Adrian Ng Ho Yin <adrian.ho.yin.ng@xxxxxxxxxx>
---
Note: This patch depends on the Agilex5 SVC enablement series:
"[PATCH v2 0/5] Add Agilex5 support in SVC driver and FPGA
configuration and partial reconfiguration support for Agilex5"
(Message-ID: <cover.1784712583.git.adrian.ho.yin.ng@xxxxxxxxxx>)
drivers/firmware/stratix10-svc.c | 28 +++++++++++++++++++-
include/linux/firmware/intel/stratix10-smc.h | 22 +++++++++++++++
2 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c
index 5e20057ee344..6db3c68155b1 100644
--- a/drivers/firmware/stratix10-svc.c
+++ b/drivers/firmware/stratix10-svc.c
@@ -1329,6 +1329,29 @@ int stratix10_svc_async_send(struct stratix10_svc_chan *chan, void *msg,
args.a0 = INTEL_SIP_SMC_ASYNC_RSU_NOTIFY;
args.a2 = p_msg->arg[0];
break;
+ case COMMAND_MBOX_SEND_CMD: {
+ struct stratix10_svc_data_mem *p_mem;
+
+ args.a0 = INTEL_SIP_SMC_ASYNC_MBOX_SEND;
+ args.a2 = p_msg->arg[0];
+
+ guard(mutex)(&svc_mem_lock);
+ list_for_each_entry(p_mem, &svc_data_mem, node)
+ if (p_mem->vaddr == p_msg->payload) {
+ args.a3 = (unsigned long)p_mem->paddr;
+ args.a4 = p_msg->payload_length;
+ break;
+ }
+ if (p_msg->payload_output) {
+ list_for_each_entry(p_mem, &svc_data_mem, node)
+ if (p_mem->vaddr == p_msg->payload_output) {
+ args.a5 = (unsigned long)p_mem->paddr;
+ args.a6 = p_msg->payload_length_output;
+ break;
+ }
+ }
+ break;
+ }
default:
dev_err(ctrl->dev, "Invalid command ,%d\n", p_msg->command);
ret = -EINVAL;
@@ -1422,9 +1445,12 @@ static int stratix10_svc_async_prepare_response(struct stratix10_svc_chan *chan,
*/
data->kaddr1 = (void *)&handle->res;
break;
+ case COMMAND_MBOX_SEND_CMD:
+ data->kaddr1 = (void *)&handle->res.a2;
+ break;
default:
- dev_alert(ctrl->dev, "Invalid command\n ,%d", p_msg->command);
+ dev_alert(ctrl->dev, "Invalid command ,%d", p_msg->command);
return -ENOENT;
}
dev_dbg(ctrl->dev, "Async message completed transaction_id 0x%02x\n",
diff --git a/include/linux/firmware/intel/stratix10-smc.h b/include/linux/firmware/intel/stratix10-smc.h
index 9224974fffc4..0fc70409c9f6 100644
--- a/include/linux/firmware/intel/stratix10-smc.h
+++ b/include/linux/firmware/intel/stratix10-smc.h
@@ -752,4 +752,26 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_NOTIFY (0xEC)
#define INTEL_SIP_SMC_ASYNC_RSU_NOTIFY \
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_NOTIFY)
+
+/**
+ * Request INTEL_SIP_SMC_ASYNC_MBOX_SEND
+ * Async call to send a generic mailbox command to the SDM.
+ * Call register usage:
+ * a0 INTEL_SIP_SMC_ASYNC_MBOX_SEND
+ * a1 transaction job id
+ * a2 mailbox command
+ * a3 physical address of command buffer
+ * a4 size of command buffer
+ * a5 physical address of response buffer
+ * a6 size of response buffer
+ * a7-a17 not used
+ *
+ * Return status:
+ * a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_REJECTED
+ * or INTEL_SIP_SMC_STATUS_BUSY
+ * a1-a17 not used
+ */
+#define INTEL_SIP_SMC_ASYNC_FUNC_ID_MBOX_SEND (0xEE)
+#define INTEL_SIP_SMC_ASYNC_MBOX_SEND \
+ INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_MBOX_SEND)
#endif
--
2.49.GIT