linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support
@ 2019-05-17  5:49 Anson Huang
  2019-05-17  5:49 ` [PATCH V4 2/2] arm64: defconfig: Add i.MX SCU SoC info driver Anson Huang
  2019-05-21 11:56 ` [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Leonard Crestez
  0 siblings, 2 replies; 5+ messages in thread
From: Anson Huang @ 2019-05-17  5:49 UTC (permalink / raw)
  To: catalin.marinas, will.deacon, shawnguo, s.hauer, kernel,
	festevam, maxime.ripard, agross, olof, jagan, bjorn.andersson,
	Leonard Crestez, marc.w.gonzalez, dinguyen, enric.balletbo,
	Aisheng Dong, robh, l.stach, Abel Vesa, linux-arm-kernel,
	linux-kernel
  Cc: dl-linux-imx

Add i.MX SCU SoC info driver to support i.MX8QXP SoC, introduce
driver dependency into Kconfig as CONFIG_IMX_SCU must be
selected to support i.MX SCU SoC driver, also need to use
platform driver model to make sure IMX_SCU driver is probed
before i.MX SCU SoC driver.

With this patch, SoC info can be read from sysfs:

i.mx8qxp-mek# cat /sys/devices/soc0/family
Freescale i.MX

i.mx8qxp-mek# cat /sys/devices/soc0/soc_id
0x2

i.mx8qxp-mek# cat /sys/devices/soc0/machine
Freescale i.MX8QXP MEK

i.mx8qxp-mek# cat /sys/devices/soc0/revision
1.1

Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
---
Changes since V3:
	- remove of_device_id table to make it generic for all i.MX8 SoC with SCU inside, and check
	  "fsl,imx-scu" node to devide whether to register soc platform driver;
	- for soc_id, just return the value reading from SCU firmware instead of creating string, for
	  detail name of soc_id, the machine name already contains it;
	- fix some error handling of kasprintf.
---
 drivers/soc/imx/Kconfig       |   9 +++
 drivers/soc/imx/Makefile      |   1 +
 drivers/soc/imx/soc-imx-scu.c | 155 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 165 insertions(+)
 create mode 100644 drivers/soc/imx/soc-imx-scu.c

diff --git a/drivers/soc/imx/Kconfig b/drivers/soc/imx/Kconfig
index d80f899..cbc1a41 100644
--- a/drivers/soc/imx/Kconfig
+++ b/drivers/soc/imx/Kconfig
@@ -7,4 +7,13 @@ config IMX_GPCV2_PM_DOMAINS
 	select PM_GENERIC_DOMAINS
 	default y if SOC_IMX7D
 
+config IMX_SCU_SOC
+	bool "i.MX System Controller Unit SoC info support"
+	depends on IMX_SCU
+	select SOC_BUS
+	help
+	  If you say yes here you get support for the NXP i.MX System
+	  Controller Unit SoC info module, it will provide the SoC info
+	  like SoC family, ID and revision etc.
+
 endmenu
diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile
index d6b529e0..ddf343d 100644
--- a/drivers/soc/imx/Makefile
+++ b/drivers/soc/imx/Makefile
@@ -1,3 +1,4 @@
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o
 obj-$(CONFIG_ARCH_MXC) += soc-imx8.o
+obj-$(CONFIG_IMX_SCU_SOC) += soc-imx-scu.o
diff --git a/drivers/soc/imx/soc-imx-scu.c b/drivers/soc/imx/soc-imx-scu.c
new file mode 100644
index 0000000..60458ac
--- /dev/null
+++ b/drivers/soc/imx/soc-imx-scu.c
@@ -0,0 +1,155 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 NXP.
+ */
+
+#include <dt-bindings/firmware/imx/rsrc.h>
+#include <linux/firmware/imx/sci.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+
+#define IMX_SCU_SOC_DRIVER_NAME		"imx-scu-soc"
+
+static struct imx_sc_ipc *soc_ipc_handle;
+
+struct imx_sc_msg_misc_get_soc_id {
+	struct imx_sc_rpc_msg hdr;
+	union {
+		struct {
+			u32 control;
+			u16 resource;
+		} send;
+		struct {
+			u32 id;
+			u16 reserved;
+		} resp;
+	} data;
+} __packed;
+
+static u32 imx_scu_soc_id(void)
+{
+	struct imx_sc_msg_misc_get_soc_id msg;
+	struct imx_sc_rpc_msg *hdr = &msg.hdr;
+	int ret;
+
+	hdr->ver = IMX_SC_RPC_VERSION;
+	hdr->svc = IMX_SC_RPC_SVC_MISC;
+	hdr->func = IMX_SC_MISC_FUNC_GET_CONTROL;
+	hdr->size = 3;
+
+	msg.data.send.control = IMX_SC_C_ID;
+	msg.data.send.resource = IMX_SC_R_SYSTEM;
+
+	ret = imx_scu_call_rpc(soc_ipc_handle, &msg, true);
+	if (ret) {
+		pr_err("%s: get soc info failed, ret %d\n", __func__, ret);
+		/* return 0 means getting revision failed */
+		return 0;
+	}
+
+	return msg.data.resp.id;
+}
+
+static int imx_scu_soc_probe(struct platform_device *pdev)
+{
+	struct soc_device_attribute *soc_dev_attr;
+	struct soc_device *soc_dev;
+	struct device_node *root;
+	u32 id, val;
+	int ret;
+
+	/* wait i.MX SCU driver ready */
+	ret = imx_scu_get_handle(&soc_ipc_handle);
+	if (ret)
+		return ret;
+
+	soc_dev_attr = devm_kzalloc(&pdev->dev, sizeof(*soc_dev_attr),
+				    GFP_KERNEL);
+	if (!soc_dev_attr)
+		return -ENOMEM;
+
+	soc_dev_attr->family = "Freescale i.MX";
+
+	root = of_find_node_by_path("/");
+	ret = of_property_read_string(root,
+				      "model",
+				      &soc_dev_attr->machine);
+	if (ret)
+		return ret;
+
+	id = imx_scu_soc_id();
+
+	/* format soc_id value passed from SCU firmware */
+	val = id & 0x1f;
+	soc_dev_attr->soc_id = val ? kasprintf(GFP_KERNEL, "0x%x", val)
+			       : "unknown";
+	if (!soc_dev_attr->soc_id)
+		return -ENOMEM;
+
+	/* format revision value passed from SCU firmware */
+	val = (id >> 5) & 0xf;
+	val = (((val >> 2) + 1) << 4) | (val & 0x3);
+	soc_dev_attr->revision = val ? kasprintf(GFP_KERNEL,
+						 "%d.%d",
+						 (val >> 4) & 0xf,
+						 val & 0xf) : "unknown";
+	if (!soc_dev_attr->revision) {
+		ret = -ENOMEM;
+		goto free_soc_id;
+	}
+
+	soc_dev = soc_device_register(soc_dev_attr);
+	if (IS_ERR(soc_dev)) {
+		ret = PTR_ERR(soc_dev);
+		goto free_revision;
+	}
+
+	return 0;
+
+free_revision:
+	kfree(soc_dev_attr->revision);
+free_soc_id:
+	kfree(soc_dev_attr->soc_id);
+	return ret;
+}
+
+static struct platform_driver imx_scu_soc_driver = {
+	.driver = {
+		.name = IMX_SCU_SOC_DRIVER_NAME,
+	},
+	.probe = imx_scu_soc_probe,
+};
+
+static int __init imx_scu_soc_init(void)
+{
+	struct platform_device *imx_scu_soc_pdev;
+	struct device_node *np;
+	int ret;
+
+	np = of_find_compatible_node(NULL, NULL, "fsl,imx-scu");
+	if (!np)
+		return -ENODEV;
+
+	ret = platform_driver_register(&imx_scu_soc_driver);
+	if (ret)
+		return ret;
+
+	imx_scu_soc_pdev =
+		platform_device_register_simple(IMX_SCU_SOC_DRIVER_NAME,
+						-1,
+						NULL,
+						0);
+	if (IS_ERR(imx_scu_soc_pdev)) {
+		ret = PTR_ERR(imx_scu_soc_pdev);
+		goto unreg_platform_driver;
+	}
+
+	return 0;
+
+unreg_platform_driver:
+	platform_driver_unregister(&imx_scu_soc_driver);
+	return ret;
+}
+device_initcall(imx_scu_soc_init);
-- 
2.7.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [PATCH V4 2/2] arm64: defconfig: Add i.MX SCU SoC info driver
  2019-05-17  5:49 [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Anson Huang
@ 2019-05-17  5:49 ` Anson Huang
  2019-05-21 11:56 ` [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Leonard Crestez
  1 sibling, 0 replies; 5+ messages in thread
From: Anson Huang @ 2019-05-17  5:49 UTC (permalink / raw)
  To: catalin.marinas, will.deacon, shawnguo, s.hauer, kernel,
	festevam, maxime.ripard, agross, olof, jagan, bjorn.andersson,
	Leonard Crestez, marc.w.gonzalez, dinguyen, enric.balletbo,
	Aisheng Dong, robh, l.stach, Abel Vesa, linux-arm-kernel,
	linux-kernel
  Cc: dl-linux-imx

This patch selects CONFIG_IMX_SCU_SOC by default to support
i.MX system controller unit SoC info driver.

Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
---
No changes.
---
 arch/arm64/configs/defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 8871cf7..d3a4508 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -691,6 +691,7 @@ CONFIG_RPMSG_QCOM_GLINK_RPM=y
 CONFIG_RPMSG_QCOM_GLINK_SMEM=m
 CONFIG_RPMSG_QCOM_SMD=y
 CONFIG_RASPBERRYPI_POWER=y
+CONFIG_IMX_SCU_SOC=y
 CONFIG_QCOM_COMMAND_DB=y
 CONFIG_QCOM_GENI_SE=y
 CONFIG_QCOM_GLINK_SSR=m
-- 
2.7.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support
  2019-05-17  5:49 [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Anson Huang
  2019-05-17  5:49 ` [PATCH V4 2/2] arm64: defconfig: Add i.MX SCU SoC info driver Anson Huang
@ 2019-05-21 11:56 ` Leonard Crestez
  2019-05-21 12:34   ` Marc Gonzalez
  1 sibling, 1 reply; 5+ messages in thread
From: Leonard Crestez @ 2019-05-21 11:56 UTC (permalink / raw)
  To: Anson Huang
  Cc: Aisheng Dong, enric.balletbo, Abel Vesa, marc.w.gonzalez,
	maxime.ripard, catalin.marinas, s.hauer, will.deacon,
	linux-kernel, bjorn.andersson, dinguyen, agross, jagan, kernel,
	dl-linux-imx, olof, shawnguo, festevam, robh, linux-arm-kernel,
	l.stach

On 5/17/2019 8:49 AM, Anson Huang wrote:

> +	root = of_find_node_by_path("/");
> +
> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx-scu");

It's possibly not very important for root or FW communication nodes but 
you should probably of_node_put those back.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support
  2019-05-21 11:56 ` [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Leonard Crestez
@ 2019-05-21 12:34   ` Marc Gonzalez
  2019-05-21 14:42     ` Anson Huang
  0 siblings, 1 reply; 5+ messages in thread
From: Marc Gonzalez @ 2019-05-21 12:34 UTC (permalink / raw)
  To: Leonard Crestez, Anson Huang; +Cc: Mark Rutland, DT, Rob Herring, Linux ARM

On 21/05/2019 13:56, Leonard Crestez wrote:

> On 5/17/2019 8:49 AM, Anson Huang wrote:
> 
>> +	root = of_find_node_by_path("/");
>> +
>> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx-scu");
> 
> It's possibly not very important for root or FW communication nodes but 
> you should probably of_node_put those back.

Isn't it better/simpler to use of_root?

extern struct device_node *of_root;

Regards.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* RE: [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support
  2019-05-21 12:34   ` Marc Gonzalez
@ 2019-05-21 14:42     ` Anson Huang
  0 siblings, 0 replies; 5+ messages in thread
From: Anson Huang @ 2019-05-21 14:42 UTC (permalink / raw)
  To: Marc Gonzalez, Leonard Crestez; +Cc: Mark Rutland, DT, Rob Herring, Linux ARM

Hi, Marc/Leonard

> -----Original Message-----
> From: Marc Gonzalez [mailto:marc.w.gonzalez@free.fr]
> Sent: Tuesday, May 21, 2019 8:34 PM
> To: Leonard Crestez <leonard.crestez@nxp.com>; Anson Huang
> <anson.huang@nxp.com>
> Cc: Mark Rutland <mark.rutland@arm.com>; Rob Herring
> <robh+dt@kernel.org>; Linux ARM <linux-arm-kernel@lists.infradead.org>;
> DT <devicetree@vger.kernel.org>
> Subject: Re: [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support
> 
> On 21/05/2019 13:56, Leonard Crestez wrote:
> 
> > On 5/17/2019 8:49 AM, Anson Huang wrote:
> >
> >> +	root = of_find_node_by_path("/");
> >> +
> >> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx-scu");
> >
> > It's possibly not very important for root or FW communication nodes
> > but you should probably of_node_put those back.
> 
> Isn't it better/simpler to use of_root?
> 
> extern struct device_node *of_root;

You are right, I will add below changes into V5, one change is to use extern of_root
directly, the other is to add of_put_node() after "fsl,imx-scu" is found.

@@ -56,7 +56,6 @@ static int imx_scu_soc_probe(struct platform_device *pdev)
 {
        struct soc_device_attribute *soc_dev_attr;
        struct soc_device *soc_dev;
-       struct device_node *root;
        u32 id, val;
        int ret;

@@ -72,8 +71,7 @@ static int imx_scu_soc_probe(struct platform_device *pdev)

        soc_dev_attr->family = "Freescale i.MX";

-       root = of_find_node_by_path("/");
-       ret = of_property_read_string(root,
+       ret = of_property_read_string(of_root,
                                      "model",
                                      &soc_dev_attr->machine);
        if (ret)
@@ -132,6 +130,8 @@ static int __init imx_scu_soc_init(void)
        if (!np)
                return -ENODEV;

+       of_node_put(np);
+
        ret = platform_driver_register(&imx_scu_soc_driver);
        if (ret)
                return ret;

thanks,
Anson

> 
> Regards.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

end of thread, other threads:[~2019-05-21 14:43 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-17  5:49 [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Anson Huang
2019-05-17  5:49 ` [PATCH V4 2/2] arm64: defconfig: Add i.MX SCU SoC info driver Anson Huang
2019-05-21 11:56 ` [PATCH V4 1/2] soc: imx: Add SCU SoC info driver support Leonard Crestez
2019-05-21 12:34   ` Marc Gonzalez
2019-05-21 14:42     ` Anson Huang

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).