All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yao Zi <me@ziyao.cc>
To: Charles Perry <charles.perry@microchip.com>, <u-boot@lists.denx.de>
Cc: Rahul Pathak <rahul@summations.net>,
	Anup Patel <anup@brainfault.org>, Rick Chen <rick@andestech.com>,
	Leo <ycliang@andestech.com>, Tom Rini <trini@konsulko.com>,
	Yao Zi <me@ziyao.cc>
Subject: Re: [PATCH 2/7] firmware: rpmi: add support for the SBI MPXY transport
Date: Sat, 27 Jun 2026 01:30:24 +0000	[thread overview]
Message-ID: <aj8nsG6JrIbBsGLM@pie> (raw)
In-Reply-To: <20260626201613.1035208-3-charles.perry@microchip.com>

On Fri, Jun 26, 2026 at 01:15:43PM -0700, Charles Perry wrote:
> This adds an RPMI transport driver for the Supervisor Binary Interface
> (SBI) message proxy (MPXY) extension [1].
> 
> This is for S-Mode U-Boot where some supervisor software (such as
> OpenSBI) runs in M-Mode and handles the low level communication with the
> PuC.
> 
> [1]: https://github.com/riscv-non-isa/riscv-sbi-doc (chapter 20)
> 
> Signed-off-by: Charles Perry <charles.perry@microchip.com>
> ---
>  arch/riscv/include/asm/sbi.h          |  57 ++++
>  drivers/firmware/rpmi/Kconfig         |   9 +
>  drivers/firmware/rpmi/Makefile        |   1 +
>  drivers/firmware/rpmi/rpmi-sbi-mpxy.c | 449 ++++++++++++++++++++++++++
>  4 files changed, 516 insertions(+)
>  create mode 100644 drivers/firmware/rpmi/rpmi-sbi-mpxy.c

...

> diff --git a/drivers/firmware/rpmi/rpmi-sbi-mpxy.c b/drivers/firmware/rpmi/rpmi-sbi-mpxy.c
> new file mode 100644
> index 000000000000..84af4787187a
> --- /dev/null
> +++ b/drivers/firmware/rpmi/rpmi-sbi-mpxy.c

...

> +/* RPMI message protocol specific MPXY attributes */
> +enum sbi_mpxy_rpmi_attribute_id {
> +	SBI_MPXY_RPMI_ATTR_SERVICEGROUP_ID = SBI_MPXY_ATTR_MSGPROTO_ATTR_START,
> +	SBI_MPXY_RPMI_ATTR_SERVICEGROUP_VERSION,
> +	SBI_MPXY_RPMI_ATTR_IMPL_ID,
> +	SBI_MPXY_RPMI_ATTR_IMPL_VERSION,
> +	SBI_MPXY_RPMI_ATTR_MAX_ID
> +};
> +
> +/*
> + * RPMI specific SBI MPXY channel attributes.
> + */
> +struct sbi_mpxy_rpmi_channel_attrs {

Would it make sense to organize sbi_mpxy_rpmi_channel_attrs as an
array indexed by sbi_mpxy_rpmi_attributed_id subtracted by
SBI_MPXY_RPMI_ATTR_MSGPROTO_ATTR_START? With which we could simplify
rpmi_sbi_mpxy_get_attr().

> +	/* RPMI service group ID */
> +	u32 servicegroup_id;
> +	/* RPMI service group version */
> +	u32 servicegroup_version;
> +	/* RPMI implementation ID */
> +	u32 impl_id;
> +	/* RPMI implementation version */
> +	u32 impl_version;
> +};

...

> +static int rpmi_sbi_mpxy_get_attr(struct rpmi_chan *chan,
> +				  enum rpmi_attribute_id id, u32 *data)
> +{
> +	struct rpmi_sbi_mpxy *mpxy = dev_get_priv(chan->dev);
> +	struct sbi_mpxy_chan_desc *desc = &mpxy->channel_descs[chan->id];
> +
> +	switch (id) {
> +	case RPMI_ATTR_SPEC_VERSION:
> +		*data = desc->attrs.msg_proto_version;
> +		break;
> +	case RPMI_ATTR_MAX_MSG_DATA_SIZE:
> +		*data = desc->max_xfer_len;
> +		break;
> +	case RPMI_ATTR_SERVICEGROUP_ID:
> +		*data = desc->rpmi_attrs.servicegroup_id;
> +		break;
> +	case RPMI_ATTR_SERVICEGROUP_VERSION:
> +		*data = desc->rpmi_attrs.servicegroup_version;
> +		break;
> +	case RPMI_ATTR_IMPL_ID:
> +		*data = desc->rpmi_attrs.impl_id;
> +		break;
> +	case RPMI_ATTR_IMPL_VERSION:
> +		*data = desc->rpmi_attrs.impl_version;
> +		break;
> +	default:
> +		return -EOPNOTSUPP;
> +	}
> +
> +	return 0;
> +}

...

> +static int rpmi_sbi_mpxy_probe(struct udevice *dev)
> +{
> +	struct rpmi_sbi_mpxy *mpxy = dev_get_priv(dev);
> +	struct sbi_mpxy_chan_desc *desc;
> +	unsigned long flags;
> +	struct sbiret sret;
> +	int i, ret;
> +
> +	mpxy->dev = dev;
> +
> +	/* Probe for SBI MPXY extension */
> +	if (sbi_get_spec_version() < sbi_mk_version(1, 0) ||
> +	    sbi_probe_extension(SBI_EXT_MPXY) <= 0) {
> +		dev_info(dev, "SBI MPXY extension not available\n");
> +		return -ENODEV;
> +	}
> +
> +	/* Find-out shared memory size */
> +	ret = rpmi_sbi_mpxy_get_shmem_size(&mpxy->shmem_size);
> +	if (ret) {
> +		dev_err(dev, "failed to get MPXY shared memory size\n");
> +		return -ENODEV;
> +	}
> +
> +	mpxy->shmem = memalign(PAGE_SIZE, mpxy->shmem_size);
> +	if (!mpxy->shmem)
> +		return -ENOMEM;
> +
> +	/* Setup shmem in OVERWRITE mode. (flags[1:0] = 00b) */
> +	flags = 0;
> +	sret = sbi_ecall(SBI_EXT_MPXY, SBI_EXT_MPXY_SET_SHMEM,
> +			 virt_to_phys(mpxy->shmem), 0, flags, 0, 0, 0);
> +	if (sret.error) {
> +		ret = sbi_to_linux_error(sret.error);
> +		goto err;
> +	}
> +
> +	ret = rpmi_sbi_mpxy_get_channel_ids(mpxy);
> +	if (ret)
> +		goto err;
> +
> +	for (i = 0; i < mpxy->channel_count; i++) {
> +		desc = &mpxy->channel_descs[i];
> +		desc->max_xfer_len =
> +			min((u32)mpxy->shmem_size, desc->attrs.msg_max_len);
> +	}
> +
> +	return 0;
> +
> +err:
> +	if (mpxy->channel_descs)
> +		free(mpxy->channel_descs);
> +
> +	if (mpxy->shmem)
> +		free(mpxy->shmem);

free() is no-op when the argument is NULL, so the check is redundant.
This applies to rpmi_sbi_mpxy_remove() and other similar cases in the
series, too.

> +
> +	return ret;
> +}
> +
> +static int rpmi_sbi_mpxy_remove(struct udevice *dev)
> +{
> +	struct rpmi_sbi_mpxy *mpxy = dev_get_priv(dev);
> +
> +	if (mpxy->channel_descs)
> +		free(mpxy->channel_descs);
> +
> +	if (mpxy->shmem)
> +		free(mpxy->shmem);
> +
> +	return 0;
> +}

Regards,
Yao Zi

  reply	other threads:[~2026-06-27  1:30 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26 20:15 [PATCH 0/7] Add support for RPMI to U-Boot Charles Perry
2026-06-26 20:15 ` [PATCH 1/7] firmware: add support for RPMI Charles Perry
2026-06-27  1:09   ` Yao Zi
2026-06-26 20:15 ` [PATCH 2/7] firmware: rpmi: add support for the SBI MPXY transport Charles Perry
2026-06-27  1:30   ` Yao Zi [this message]
2026-06-26 20:15 ` [PATCH 3/7] firmware: rpmi: add support for shared memory transport Charles Perry
2026-06-26 20:15 ` [PATCH 4/7] drivers: clk: add support for RPMI clocks Charles Perry
2026-06-27  1:47   ` Yao Zi
2026-06-26 20:15 ` [PATCH 5/7] drivers: power: add support for RPMI power domains Charles Perry
2026-06-26 20:15 ` [PATCH 6/7] firmware: rpmi: add a test and a sandbox driver Charles Perry
2026-06-26 20:15 ` [PATCH 7/7] firmware: rpmi: add a test and sandbox for device power Charles Perry

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aj8nsG6JrIbBsGLM@pie \
    --to=me@ziyao.cc \
    --cc=anup@brainfault.org \
    --cc=charles.perry@microchip.com \
    --cc=rahul@summations.net \
    --cc=rick@andestech.com \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=ycliang@andestech.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.