linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V3 0/2] firmware: arm_scmi: add smc/hvc transports support
@ 2020-02-26  7:12 peng.fan
  2020-02-26  7:12 ` [PATCH V3 1/2] dt-bindings: arm: arm,scmi: add smc/hvc transport peng.fan
  2020-02-26  7:12 ` [PATCH V3 2/2] firmware: arm_scmi: " peng.fan
  0 siblings, 2 replies; 7+ messages in thread
From: peng.fan @ 2020-02-26  7:12 UTC (permalink / raw)
  To: sudeep.holla, robh+dt, mark.rutland, robh
  Cc: viresh.kumar, f.fainelli, linux-imx, linux-arm-kernel,
	linux-kernel, devicetree, andre.przywara, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

V3:
 Add back arm,scmi-smc compatible string
 Change smc-id to arm,smc-id
 Directly use arm_smccc_1_1_invoke
 Add prot_id in scmi_chan_info for per protocol shmem usage.

V2:
 patch 1/2: only add smc-id property
 patch 2/2: Parse smc/hvc from psci node
	    Use prot_id as 2nd arg when issue smc/hvc
	    Differentiate tranports using mboxes or smc-id property
https://lore.kernel.org/patchwork/cover/1193435/

This is to add smc/hvc transports support, based on Viresh's v6.
SCMI firmware could be implemented in EL3, S-EL1, NS-EL2 or other
A core exception level. Then smc/hvc could be used. And for vendor
specific firmware, a wrapper layer could added in EL3, S-EL1,
NS-EL2 and etc to translate SCMI calls to vendor specific firmware calls.

A new compatible string arm,scmi-smc is added. arm,scmi is still for
mailbox transports.

All protocol share same smc/hvc id, the protocol id will be take as
2nd arg when issue smc/hvc.
Each protocol could use its own shmem or share the same shmem
Per smc/hvc, only Tx supported.

Peng Fan (2):
  dt-bindings: arm: arm,scmi: add smc/hvc transport
  firmware: arm_scmi: add smc/hvc transport

 Documentation/devicetree/bindings/arm/arm,scmi.txt |   3 +-
 drivers/firmware/arm_scmi/Makefile                 |   2 +-
 drivers/firmware/arm_scmi/common.h                 |   3 +
 drivers/firmware/arm_scmi/driver.c                 |   2 +
 drivers/firmware/arm_scmi/smc.c                    | 146 +++++++++++++++++++++
 5 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 drivers/firmware/arm_scmi/smc.c

-- 
2.16.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH V3 1/2] dt-bindings: arm: arm,scmi: add smc/hvc transport
  2020-02-26  7:12 [PATCH V3 0/2] firmware: arm_scmi: add smc/hvc transports support peng.fan
@ 2020-02-26  7:12 ` peng.fan
  2020-02-26  7:12 ` [PATCH V3 2/2] firmware: arm_scmi: " peng.fan
  1 sibling, 0 replies; 7+ messages in thread
From: peng.fan @ 2020-02-26  7:12 UTC (permalink / raw)
  To: sudeep.holla, robh+dt, mark.rutland, robh
  Cc: viresh.kumar, f.fainelli, linux-imx, linux-arm-kernel,
	linux-kernel, devicetree, andre.przywara, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

SCMI could use SMC/HVC as tranports. Since there is no
standardized id, we need to use vendor specific id. So
add into devicetree binding doc.

Also add arm,scmi-smc compatible string for smc/hvc transport

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 Documentation/devicetree/bindings/arm/arm,scmi.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/arm/arm,scmi.txt b/Documentation/devicetree/bindings/arm/arm,scmi.txt
index f493d69e6194..4ce57b88f84d 100644
--- a/Documentation/devicetree/bindings/arm/arm,scmi.txt
+++ b/Documentation/devicetree/bindings/arm/arm,scmi.txt
@@ -14,7 +14,7 @@ Required properties:
 
 The scmi node with the following properties shall be under the /firmware/ node.
 
-- compatible : shall be "arm,scmi"
+- compatible : shall be "arm,scmi" or "arm,scmi-smc" for smc/hvc transports
 - mboxes: List of phandle and mailbox channel specifiers. It should contain
 	  exactly one or two mailboxes, one for transmitting messages("tx")
 	  and another optional for receiving the notifications("rx") if
@@ -25,6 +25,7 @@ The scmi node with the following properties shall be under the /firmware/ node.
 	  protocol identifier for a given sub-node.
 - #size-cells : should be '0' as 'reg' property doesn't have any size
 	  associated with it.
+- arm,smc-id : SMC id required when using smc or hvc transports
 
 Optional properties:
 
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
  2020-02-26  7:12 [PATCH V3 0/2] firmware: arm_scmi: add smc/hvc transports support peng.fan
  2020-02-26  7:12 ` [PATCH V3 1/2] dt-bindings: arm: arm,scmi: add smc/hvc transport peng.fan
@ 2020-02-26  7:12 ` peng.fan
  2020-02-28 16:18   ` Sudeep Holla
  1 sibling, 1 reply; 7+ messages in thread
From: peng.fan @ 2020-02-26  7:12 UTC (permalink / raw)
  To: sudeep.holla, robh+dt, mark.rutland, robh
  Cc: viresh.kumar, f.fainelli, linux-imx, linux-arm-kernel,
	linux-kernel, devicetree, andre.przywara, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Take arm,smc-id as the 1st arg, and protocol id as the 2nd arg when
issuing SMC/HVC. Since we need protocol id, so add this parameter
to scmi_chan_info, then smc transport driver could directly use it.
There is no Rx, only Tx because of smc/hvc not support Rx.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/firmware/arm_scmi/Makefile |   2 +-
 drivers/firmware/arm_scmi/common.h |   3 +
 drivers/firmware/arm_scmi/driver.c |   2 +
 drivers/firmware/arm_scmi/smc.c    | 146 +++++++++++++++++++++++++++++++++++++
 4 files changed, 152 insertions(+), 1 deletion(-)
 create mode 100644 drivers/firmware/arm_scmi/smc.c

diff --git a/drivers/firmware/arm_scmi/Makefile b/drivers/firmware/arm_scmi/Makefile
index 6694d0d908d6..6b1b0d6c6d0e 100644
--- a/drivers/firmware/arm_scmi/Makefile
+++ b/drivers/firmware/arm_scmi/Makefile
@@ -2,6 +2,6 @@
 obj-y	= scmi-bus.o scmi-driver.o scmi-protocols.o scmi-transport.o
 scmi-bus-y = bus.o
 scmi-driver-y = driver.o
-scmi-transport-y = mailbox.o shmem.o
+scmi-transport-y = mailbox.o shmem.o smc.o
 scmi-protocols-y = base.o clock.o perf.o power.o reset.o sensors.o
 obj-$(CONFIG_ARM_SCMI_POWER_DOMAIN) += scmi_pm_domain.o
diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
index 5ac06469b01c..8cf330809e9e 100644
--- a/drivers/firmware/arm_scmi/common.h
+++ b/drivers/firmware/arm_scmi/common.h
@@ -162,11 +162,13 @@ int scmi_base_protocol_init(struct scmi_handle *h);
  *	 channel
  * @handle: Pointer to SCMI entity handle
  * @transport_info: Transport layer related information
+ * @prot_id: The id of the protocol that will use this channel
  */
 struct scmi_chan_info {
 	struct device *dev;
 	struct scmi_handle *handle;
 	void *transport_info;
+	int prot_id;
 };
 
 /**
@@ -210,6 +212,7 @@ struct scmi_desc {
 };
 
 extern const struct scmi_desc scmi_mailbox_desc;
+extern const struct scmi_desc scmi_smc_desc;
 
 void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr);
 void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id);
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index dbec767222e9..3715aecd0fc1 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -606,6 +606,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device *dev,
 		return ret;
 	}
 
+	cinfo->prot_id = prot_id;
 	cinfo->handle = &info->handle;
 	return 0;
 }
@@ -827,6 +828,7 @@ ATTRIBUTE_GROUPS(versions);
 /* Each compatible listed below must have descriptor associated with it */
 static const struct of_device_id scmi_of_match[] = {
 	{ .compatible = "arm,scmi", .data = &scmi_mailbox_desc },
+	{ .compatible = "arm,scmi-smc", .data = &scmi_smc_desc},
 	{ /* Sentinel */ },
 };
 
diff --git a/drivers/firmware/arm_scmi/smc.c b/drivers/firmware/arm_scmi/smc.c
new file mode 100644
index 000000000000..58d5f44fa77b
--- /dev/null
+++ b/drivers/firmware/arm_scmi/smc.c
@@ -0,0 +1,146 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * System Control and Management Interface (SCMI) Message SMC/HVC
+ * Transport driver
+ *
+ * Copyright 2020 NXP
+ */
+
+#include <linux/arm-smccc.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+
+#include "common.h"
+
+/**
+ * struct scmi_smc - Structure representing a SCMI smc transport
+ *
+ * @cinfo: SCMI channel info
+ * @shmem: Transmit/Receive shared memory area
+ * @func_id: smc/hvc call function id
+ */
+
+struct scmi_smc {
+	struct scmi_chan_info *cinfo;
+	struct scmi_shared_mem __iomem *shmem;
+	u32 func_id;
+};
+
+static bool smc_chan_available(struct device *dev, int idx)
+{
+	return true;
+}
+
+static int smc_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
+			  bool tx)
+{
+	struct device *cdev = cinfo->dev;
+	struct scmi_smc *scmi_info;
+	resource_size_t size;
+	struct resource res;
+	struct device_node *np;
+	u32 func_id;
+	int ret;
+
+	if (!tx)
+		return -ENODEV;
+
+	scmi_info = devm_kzalloc(dev, sizeof(*scmi_info), GFP_KERNEL);
+	if (!scmi_info)
+		return -ENOMEM;
+
+	np = of_parse_phandle(cdev->of_node, "shmem", 0);
+	if (!np)
+		np = of_parse_phandle(dev->of_node, "shmem", 0);
+	ret = of_address_to_resource(np, 0, &res);
+	of_node_put(np);
+	if (ret) {
+		dev_err(cdev, "failed to get SCMI Tx shared memory\n");
+		return ret;
+	}
+
+	size = resource_size(&res);
+	scmi_info->shmem = devm_ioremap(dev, res.start, size);
+	if (!scmi_info->shmem) {
+		dev_err(dev, "failed to ioremap SCMI Tx shared memory\n");
+		return -EADDRNOTAVAIL;
+	}
+
+	ret = of_property_read_u32(dev->of_node, "arm,smc-id", &func_id);
+	if (ret < 0)
+		return ret;
+
+	scmi_info->func_id = func_id;
+	scmi_info->cinfo = cinfo;
+	cinfo->transport_info = scmi_info;
+
+	return 0;
+}
+
+static int smc_chan_free(int id, void *p, void *data)
+{
+	struct scmi_chan_info *cinfo = p;
+	struct scmi_smc *scmi_info = cinfo->transport_info;
+
+	cinfo->transport_info = NULL;
+	scmi_info->cinfo = NULL;
+
+	scmi_free_channel(cinfo, data, id);
+
+	return 0;
+}
+
+static int smc_send_message(struct scmi_chan_info *cinfo,
+			    struct scmi_xfer *xfer)
+{
+	struct scmi_smc *scmi_info = cinfo->transport_info;
+	struct arm_smccc_res res;
+
+	shmem_tx_prepare(scmi_info->shmem, xfer);
+
+	arm_smccc_1_1_invoke(scmi_info->func_id, cinfo->prot_id, 0, 0, 0,
+			     0, 0, 0, &res);
+	scmi_rx_callback(scmi_info->cinfo, shmem_read_header(scmi_info->shmem));
+
+	return res.a0;
+}
+
+static void smc_mark_txdone(struct scmi_chan_info *cinfo, int ret)
+{
+}
+
+static void smc_fetch_response(struct scmi_chan_info *cinfo,
+			       struct scmi_xfer *xfer)
+{
+	struct scmi_smc *scmi_info = cinfo->transport_info;
+
+	shmem_fetch_response(scmi_info->shmem, xfer);
+}
+
+static bool
+smc_poll_done(struct scmi_chan_info *cinfo, struct scmi_xfer *xfer)
+{
+	struct scmi_smc *scmi_info = cinfo->transport_info;
+
+	return shmem_poll_done(scmi_info->shmem, xfer);
+}
+
+static struct scmi_transport_ops scmi_smc_ops = {
+	.chan_available = smc_chan_available,
+	.chan_setup = smc_chan_setup,
+	.chan_free = smc_chan_free,
+	.send_message = smc_send_message,
+	.mark_txdone = smc_mark_txdone,
+	.fetch_response = smc_fetch_response,
+	.poll_done = smc_poll_done,
+};
+
+const struct scmi_desc scmi_smc_desc = {
+	.ops = &scmi_smc_ops,
+	.max_rx_timeout_ms = 30,
+	.max_msg = 1,
+	.max_msg_size = 128,
+};
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
  2020-02-26  7:12 ` [PATCH V3 2/2] firmware: arm_scmi: " peng.fan
@ 2020-02-28 16:18   ` Sudeep Holla
  2020-02-29  2:07     ` Peng Fan
  0 siblings, 1 reply; 7+ messages in thread
From: Sudeep Holla @ 2020-02-28 16:18 UTC (permalink / raw)
  To: peng.fan
  Cc: robh+dt, mark.rutland, robh, viresh.kumar, f.fainelli, linux-imx,
	linux-arm-kernel, linux-kernel, devicetree, andre.przywara,
	Sudeep Holla

On Wed, Feb 26, 2020 at 03:12:51PM +0800, peng.fan@nxp.com wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Take arm,smc-id as the 1st arg, and protocol id as the 2nd arg when
> issuing SMC/HVC. Since we need protocol id, so add this parameter

And why do we need protocol id here ? I couldn't find it out myself.
I would like to know why/what/how is it used in the firmware(smc/hvc
handler). I hope you are not mixing the need for multiple channel with
protocol id ? One can find out id from the command itself, no need to
pass it and hence asking here for more details.

-- 
Regards,
Sudeep

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
  2020-02-28 16:18   ` Sudeep Holla
@ 2020-02-29  2:07     ` Peng Fan
  2020-03-02 11:21       ` Sudeep Holla
  0 siblings, 1 reply; 7+ messages in thread
From: Peng Fan @ 2020-02-29  2:07 UTC (permalink / raw)
  To: Sudeep Holla
  Cc: robh+dt, mark.rutland, robh, viresh.kumar, f.fainelli,
	dl-linux-imx, linux-arm-kernel, linux-kernel, devicetree,
	andre.przywara

Hi Sudeep,

> Subject: Re: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
> 
> On Wed, Feb 26, 2020 at 03:12:51PM +0800, peng.fan@nxp.com wrote:
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > Take arm,smc-id as the 1st arg, and protocol id as the 2nd arg when
> > issuing SMC/HVC. Since we need protocol id, so add this parameter
> 
> And why do we need protocol id here ? I couldn't find it out myself.
> I would like to know why/what/how is it used in the firmware(smc/hvc
> handler). I hope you are not mixing the need for multiple channel with
> protocol id ? One can find out id from the command itself, no need to pass it
> and hence asking here for more details.

When each protocol needs its own shmem area, we need let firmware
know which shmem area to parse the message from. Without protocol
id, firmware not know which shmem area should use. Hope this is clear.

Thanks,
Peng.

> 
> --
> Regards,
> Sudeep

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
  2020-02-29  2:07     ` Peng Fan
@ 2020-03-02 11:21       ` Sudeep Holla
  2020-03-02 13:40         ` Peng Fan
  0 siblings, 1 reply; 7+ messages in thread
From: Sudeep Holla @ 2020-03-02 11:21 UTC (permalink / raw)
  To: Peng Fan
  Cc: robh+dt, mark.rutland, robh, viresh.kumar, f.fainelli,
	dl-linux-imx, linux-arm-kernel, linux-kernel, devicetree,
	andre.przywara

On Sat, Feb 29, 2020 at 02:07:30AM +0000, Peng Fan wrote:
> Hi Sudeep,
>
> > Subject: Re: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
> >
> > On Wed, Feb 26, 2020 at 03:12:51PM +0800, peng.fan@nxp.com wrote:
> > > From: Peng Fan <peng.fan@nxp.com>
> > >
> > > Take arm,smc-id as the 1st arg, and protocol id as the 2nd arg when
> > > issuing SMC/HVC. Since we need protocol id, so add this parameter
> >
> > And why do we need protocol id here ? I couldn't find it out myself.
> > I would like to know why/what/how is it used in the firmware(smc/hvc
> > handler). I hope you are not mixing the need for multiple channel with
> > protocol id ? One can find out id from the command itself, no need to pass it
> > and hence asking here for more details.
>
> When each protocol needs its own shmem area, we need let firmware
> know which shmem area to parse the message from. Without protocol
> id, firmware not know which shmem area should use. Hope this is clear.
>

Not all platforms need to have a separate shmem for each protocol. Make it
it separate transport.

--
Regards,
Sudeep

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
  2020-03-02 11:21       ` Sudeep Holla
@ 2020-03-02 13:40         ` Peng Fan
  0 siblings, 0 replies; 7+ messages in thread
From: Peng Fan @ 2020-03-02 13:40 UTC (permalink / raw)
  To: Sudeep Holla
  Cc: mark.rutland, robh, f.fainelli, devicetree, viresh.kumar,
	linux-kernel, robh+dt, dl-linux-imx, andre.przywara,
	linux-arm-kernel

> Subject: Re: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc transport
> 
> On Sat, Feb 29, 2020 at 02:07:30AM +0000, Peng Fan wrote:
> > Hi Sudeep,
> >
> > > Subject: Re: [PATCH V3 2/2] firmware: arm_scmi: add smc/hvc
> > > transport
> > >
> > > On Wed, Feb 26, 2020 at 03:12:51PM +0800, peng.fan@nxp.com wrote:
> > > > From: Peng Fan <peng.fan@nxp.com>
> > > >
> > > > Take arm,smc-id as the 1st arg, and protocol id as the 2nd arg
> > > > when issuing SMC/HVC. Since we need protocol id, so add this
> > > > parameter
> > >
> > > And why do we need protocol id here ? I couldn't find it out myself.
> > > I would like to know why/what/how is it used in the firmware(smc/hvc
> > > handler). I hope you are not mixing the need for multiple channel
> > > with protocol id ? One can find out id from the command itself, no
> > > need to pass it and hence asking here for more details.
> >
> > When each protocol needs its own shmem area, we need let firmware know
> > which shmem area to parse the message from. Without protocol id,
> > firmware not know which shmem area should use. Hope this is clear.
> >
> 
> Not all platforms need to have a separate shmem for each protocol. Make it it
> separate transport.

I added that in case somebody needs it, but actually my platform not need it.
I'll remove the protocol id change in v4. If others need it in future, they
could add then.

Thanks,
Peng.

> 
> --
> Regards,
> Sudeep
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flists.infr
> adead.org%2Fmailman%2Flistinfo%2Flinux-arm-kernel&amp;data=02%7C01
> %7Cpeng.fan%40nxp.com%7Ca9c9201db90749d46cfd08d7be9be1a2%7C686
> ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C637187449022127405&a
> mp;sdata=mwxo5a%2F4jW5ram7%2BRyHpjJ6N9ngPn5SoT4L4uq1tJ44%3D&a
> mp;reserved=0

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-03-02 13:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-26  7:12 [PATCH V3 0/2] firmware: arm_scmi: add smc/hvc transports support peng.fan
2020-02-26  7:12 ` [PATCH V3 1/2] dt-bindings: arm: arm,scmi: add smc/hvc transport peng.fan
2020-02-26  7:12 ` [PATCH V3 2/2] firmware: arm_scmi: " peng.fan
2020-02-28 16:18   ` Sudeep Holla
2020-02-29  2:07     ` Peng Fan
2020-03-02 11:21       ` Sudeep Holla
2020-03-02 13:40         ` Peng Fan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).