On 1/15/25 2:28 PM, Alice Guo wrote:
From: Viorel Suman <[email protected]>
i.MX95 System Manager uses interrupt driven communication which requires
the caller to set Bit[0] of channel flags to 1. When transmission
completes and the previous general purpose interrupt has been processed
by the other core, i.MX95 System Manager will set General Purpose
Interrupt Control Register (GCR). U-Boot polls General-purpose Status
(GSR) to check if the operation is finished.
Signed-off-by: Viorel Suman <[email protected]>
Signed-off-by: Alice Guo <[email protected]>
Reviewed-by: Ye Li <[email protected]>
---
drivers/firmware/scmi/Kconfig | 6 ++++++
drivers/firmware/scmi/smt.c | 3 +++
drivers/firmware/scmi/smt.h | 10 ++++++++++
3 files changed, 19 insertions(+)
diff --git a/drivers/firmware/scmi/Kconfig b/drivers/firmware/scmi/Kconfig
index
8cf85f0d7a12c9e58dc249539727081ec25dd7b3..eb62b88615b5cd95635571556e79ba40d1a387e9
100644
--- a/drivers/firmware/scmi/Kconfig
+++ b/drivers/firmware/scmi/Kconfig
@@ -41,3 +41,9 @@ config SCMI_AGENT_OPTEE
help
Enable the SCMI communication channel based on OP-TEE transport
for compatible "linaro,scmi-optee".
+
+config SCMI_TRANSPORT_SMT_INTR
+ bool
+ depends on SCMI_FIRMWARE
+ help
+ Enable interrupt communication of shared memory based transport.
diff --git a/drivers/firmware/scmi/smt.c b/drivers/firmware/scmi/smt.c
index
67d2f45002490ab64a6bc997eda93a8f4681d99b..ee7ae5d50b226b92a3961c181de83c730a621401
100644
--- a/drivers/firmware/scmi/smt.c
+++ b/drivers/firmware/scmi/smt.c
@@ -48,6 +48,9 @@ int scmi_dt_get_smt_buffer(struct udevice *dev, struct
scmi_smt *smt)
if (!smt->buf)
return -ENOMEM;
+ if (IS_ENABLED(CONFIG_SCMI_TRANSPORT_SMT_INTR))
+ scmi_smt_enable_intr(smt, true);
+
#ifdef CONFIG_ARM
if (dcache_status())
mmu_set_region_dcache_behaviour(ALIGN_DOWN((uintptr_t)smt->buf,
MMU_SECTION_SIZE),
diff --git a/drivers/firmware/scmi/smt.h b/drivers/firmware/scmi/smt.h
index
9d669a6c922666c48e7dce4c0affd7b47cb137e4..768b0f4c8a8d1cc7966530e724d278d72c2a167b
100644
--- a/drivers/firmware/scmi/smt.h
+++ b/drivers/firmware/scmi/smt.h
@@ -84,6 +84,16 @@ static inline void scmi_smt_put_channel(struct scmi_smt *smt)
hdr->channel_status &= ~SCMI_SHMEM_CHAN_STAT_CHANNEL_ERROR;
}
+static inline void scmi_smt_enable_intr(struct scmi_smt *smt, bool enable)
Is this expected to be called from somewhere else except
drivers/firmware/scmi/smt.c ? If not, please move it into
drivers/firmware/scmi/smt.c .
Drop the 'inline' , compiler can figure that out.
+{
+ struct scmi_smt_header *hdr = (void *)smt->buf;
The cast should be (struct scmi_smt_header *) instead of (void *)
+ if (enable)
+ hdr->flags |= SCMI_SHMEM_FLAG_INTR_ENABLED;
+ else
+ hdr->flags &= ~SCMI_SHMEM_FLAG_INTR_ENABLED;
+}
+
int scmi_dt_get_smt_buffer(struct udevice *dev, struct scmi_smt *smt);