[PATCH v4 02/20] firmware: scmi: smt: Interrupt communication enable
Marek Vasut
marex at denx.de
Fri Jan 24 12:06:26 CET 2025
On 1/15/25 2:28 PM, Alice Guo wrote:
> From: Viorel Suman <viorel.suman at nxp.com>
>
> 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 <viorel.suman at nxp.com>
> Signed-off-by: Alice Guo <alice.guo at nxp.com>
> Reviewed-by: Ye Li <ye.li at nxp.com>
> ---
> 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);
More information about the U-Boot
mailing list