[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