[V2] soc: imx: support i.MX93 soc device

Message ID 20230509091942.2923330-1-peng.fan@oss.nxp.com
State New
Headers
Series [V2] soc: imx: support i.MX93 soc device |

Commit Message

Peng Fan (OSS) May 9, 2023, 9:19 a.m. UTC
  From: Peng Fan <peng.fan@nxp.com>

Similar to i.MX8M, add i.MX93 soc device support

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---

V2:
 The ocotp yaml has got R-b from DT maintainer:
 https://lore.kernel.org/all/01be24b3-aaf2-e27b-d00e-f8649a497463@linaro.org/

 Remove uid_length from V1 which is unused.

 drivers/soc/imx/Makefile    |  2 +-
 drivers/soc/imx/soc-imx8m.c | 64 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 64 insertions(+), 2 deletions(-)
  

Comments

Shawn Guo May 15, 2023, 3:07 a.m. UTC | #1
On Tue, May 09, 2023 at 05:19:42PM +0800, Peng Fan (OSS) wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Similar to i.MX8M, add i.MX93 soc device support

This commit log doesn't provide too much helpful information.  You may
want to briefly introduce i.MX93 UID, which looks something new?

> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
> 
> V2:
>  The ocotp yaml has got R-b from DT maintainer:
>  https://lore.kernel.org/all/01be24b3-aaf2-e27b-d00e-f8649a497463@linaro.org/
> 
>  Remove uid_length from V1 which is unused.
> 
>  drivers/soc/imx/Makefile    |  2 +-
>  drivers/soc/imx/soc-imx8m.c | 64 ++++++++++++++++++++++++++++++++++++-
>  2 files changed, 64 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile
> index a28c44a1f16a..83aff181ae51 100644
> --- a/drivers/soc/imx/Makefile
> +++ b/drivers/soc/imx/Makefile
> @@ -7,5 +7,5 @@ obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o
>  obj-$(CONFIG_SOC_IMX8M) += soc-imx8m.o
>  obj-$(CONFIG_IMX8M_BLK_CTRL) += imx8m-blk-ctrl.o
>  obj-$(CONFIG_IMX8M_BLK_CTRL) += imx8mp-blk-ctrl.o
> -obj-$(CONFIG_SOC_IMX9) += imx93-src.o imx93-pd.o
> +obj-$(CONFIG_SOC_IMX9) += soc-imx8m.o imx93-src.o imx93-pd.o
>  obj-$(CONFIG_IMX9_BLK_CTRL) += imx93-blk-ctrl.o
> diff --git a/drivers/soc/imx/soc-imx8m.c b/drivers/soc/imx/soc-imx8m.c
> index 1dcd243df567..0e69b8b48183 100644
> --- a/drivers/soc/imx/soc-imx8m.c
> +++ b/drivers/soc/imx/soc-imx8m.c
> @@ -25,8 +25,11 @@
>  
>  #define IMX8MP_OCOTP_UID_OFFSET		0x10
>  
> +#define IMX93_OCOTP_UID_OFFSET		0x80c0
> +
>  /* Same as ANADIG_DIGPROG_IMX7D */
>  #define ANADIG_DIGPROG_IMX8MM	0x800
> +#define ANADIG_DIGPROG_IMX93	0x800
>  
>  struct imx8_soc_data {
>  	char *name;
> @@ -34,6 +37,7 @@ struct imx8_soc_data {
>  };
>  
>  static u64 soc_uid;
> +static u64 soc_uid_h;
>  
>  #ifdef CONFIG_HAVE_ARM_SMCCC
>  static u32 imx8mq_soc_revision_from_atf(void)
> @@ -141,6 +145,53 @@ static u32 __init imx8mm_soc_revision(void)
>  	return rev;
>  }
>  
> +static void __init imx93_soc_uid(void)
> +{
> +	void __iomem *ocotp_base;
> +	struct device_node *np;
> +
> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx93-ocotp");
> +	if (!np)
> +		return;
> +
> +	ocotp_base = of_iomap(np, 0);
> +	WARN_ON(!ocotp_base);
> +
> +	soc_uid = readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0x8);
> +	soc_uid <<= 32;
> +	soc_uid |= readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0xC);
> +
> +	soc_uid_h = readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0x0);
> +	soc_uid_h <<= 32;
> +	soc_uid_h |= readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0x4);
> +
> +	iounmap(ocotp_base);
> +	of_node_put(np);
> +}
> +
> +static u32 __init imx93_soc_revision(void)
> +{
> +	struct device_node *np;
> +	void __iomem *anatop_base;
> +	u32 rev;
> +
> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx93-anatop");
> +	if (!np)
> +		return 0;
> +
> +	anatop_base = of_iomap(np, 0);
> +	WARN_ON(!anatop_base);
> +
> +	rev = readl_relaxed(anatop_base + ANADIG_DIGPROG_IMX93);
> +
> +	iounmap(anatop_base);
> +	of_node_put(np);
> +
> +	imx93_soc_uid();
> +
> +	return rev;
> +}
> +
>  static const struct imx8_soc_data imx8mq_soc_data = {
>  	.name = "i.MX8MQ",
>  	.soc_revision = imx8mq_soc_revision,
> @@ -161,11 +212,17 @@ static const struct imx8_soc_data imx8mp_soc_data = {
>  	.soc_revision = imx8mm_soc_revision,
>  };
>  
> +static const struct imx8_soc_data imx93_soc_data = {
> +	.name = "i.MX93",
> +	.soc_revision = imx93_soc_revision,
> +};
> +
>  static __maybe_unused const struct of_device_id imx8_soc_match[] = {
>  	{ .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
>  	{ .compatible = "fsl,imx8mm", .data = &imx8mm_soc_data, },
>  	{ .compatible = "fsl,imx8mn", .data = &imx8mn_soc_data, },
>  	{ .compatible = "fsl,imx8mp", .data = &imx8mp_soc_data, },
> +	{ .compatible = "fsl,imx93", .data = &imx93_soc_data, },
>  	{ }
>  };
>  
> @@ -212,7 +269,12 @@ static int __init imx8_soc_init(void)
>  		goto free_soc;
>  	}
>  
> -	soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX", soc_uid);
> +	if (soc_uid_h) {

Unnecessary parentheses.

Shawn

> +		soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX%016llX",
> +							soc_uid_h, soc_uid);
> +	} else {
> +		soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX", soc_uid);
> +	}
>  	if (!soc_dev_attr->serial_number) {
>  		ret = -ENOMEM;
>  		goto free_rev;
> -- 
> 2.37.1
>
  
Peng Fan May 15, 2023, 6:33 a.m. UTC | #2
Shawn,

Just posted V3 to address your comments.

Thanks,
Peng.

> Subject: Re: [PATCH V2] soc: imx: support i.MX93 soc device
> 
> On Tue, May 09, 2023 at 05:19:42PM +0800, Peng Fan (OSS) wrote:
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > Similar to i.MX8M, add i.MX93 soc device support
> 
> This commit log doesn't provide too much helpful information.  You may
> want to briefly introduce i.MX93 UID, which looks something new?
> 
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >
> > V2:
> >  The ocotp yaml has got R-b from DT maintainer:
> >
> >
> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore
> > .kernel.org%2Fall%2F01be24b3-aaf2-e27b-d00e-
> f8649a497463%40linaro.org%
> >
> 2F&data=05%7C01%7Cpeng.fan%40nxp.com%7Ced8cd9c0eac146837e8c08d
> b54f1950
> >
> 5%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C638197168793784
> 144%7CUn
> >
> known%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI
> 6Ik1haW
> >
> wiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=2QBo%2ByyZflXjzQ%2FW
> 8jQBlald6Gt
> > w9kyUIu0pP2iIqhg%3D&reserved=0
> >
> >  Remove uid_length from V1 which is unused.
> >
> >  drivers/soc/imx/Makefile    |  2 +-
> >  drivers/soc/imx/soc-imx8m.c | 64
> > ++++++++++++++++++++++++++++++++++++-
> >  2 files changed, 64 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile index
> > a28c44a1f16a..83aff181ae51 100644
> > --- a/drivers/soc/imx/Makefile
> > +++ b/drivers/soc/imx/Makefile
> > @@ -7,5 +7,5 @@ obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o
> >  obj-$(CONFIG_SOC_IMX8M) += soc-imx8m.o
> >  obj-$(CONFIG_IMX8M_BLK_CTRL) += imx8m-blk-ctrl.o
> >  obj-$(CONFIG_IMX8M_BLK_CTRL) += imx8mp-blk-ctrl.o
> > -obj-$(CONFIG_SOC_IMX9) += imx93-src.o imx93-pd.o
> > +obj-$(CONFIG_SOC_IMX9) += soc-imx8m.o imx93-src.o imx93-pd.o
> >  obj-$(CONFIG_IMX9_BLK_CTRL) += imx93-blk-ctrl.o diff --git
> > a/drivers/soc/imx/soc-imx8m.c b/drivers/soc/imx/soc-imx8m.c index
> > 1dcd243df567..0e69b8b48183 100644
> > --- a/drivers/soc/imx/soc-imx8m.c
> > +++ b/drivers/soc/imx/soc-imx8m.c
> > @@ -25,8 +25,11 @@
> >
> >  #define IMX8MP_OCOTP_UID_OFFSET		0x10
> >
> > +#define IMX93_OCOTP_UID_OFFSET		0x80c0
> > +
> >  /* Same as ANADIG_DIGPROG_IMX7D */
> >  #define ANADIG_DIGPROG_IMX8MM	0x800
> > +#define ANADIG_DIGPROG_IMX93	0x800
> >
> >  struct imx8_soc_data {
> >  	char *name;
> > @@ -34,6 +37,7 @@ struct imx8_soc_data {  };
> >
> >  static u64 soc_uid;
> > +static u64 soc_uid_h;
> >
> >  #ifdef CONFIG_HAVE_ARM_SMCCC
> >  static u32 imx8mq_soc_revision_from_atf(void)
> > @@ -141,6 +145,53 @@ static u32 __init imx8mm_soc_revision(void)
> >  	return rev;
> >  }
> >
> > +static void __init imx93_soc_uid(void) {
> > +	void __iomem *ocotp_base;
> > +	struct device_node *np;
> > +
> > +	np = of_find_compatible_node(NULL, NULL, "fsl,imx93-ocotp");
> > +	if (!np)
> > +		return;
> > +
> > +	ocotp_base = of_iomap(np, 0);
> > +	WARN_ON(!ocotp_base);
> > +
> > +	soc_uid = readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET +
> 0x8);
> > +	soc_uid <<= 32;
> > +	soc_uid |= readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET
> + 0xC);
> > +
> > +	soc_uid_h = readl_relaxed(ocotp_base +
> IMX93_OCOTP_UID_OFFSET + 0x0);
> > +	soc_uid_h <<= 32;
> > +	soc_uid_h |= readl_relaxed(ocotp_base +
> IMX93_OCOTP_UID_OFFSET +
> > +0x4);
> > +
> > +	iounmap(ocotp_base);
> > +	of_node_put(np);
> > +}
> > +
> > +static u32 __init imx93_soc_revision(void) {
> > +	struct device_node *np;
> > +	void __iomem *anatop_base;
> > +	u32 rev;
> > +
> > +	np = of_find_compatible_node(NULL, NULL, "fsl,imx93-anatop");
> > +	if (!np)
> > +		return 0;
> > +
> > +	anatop_base = of_iomap(np, 0);
> > +	WARN_ON(!anatop_base);
> > +
> > +	rev = readl_relaxed(anatop_base + ANADIG_DIGPROG_IMX93);
> > +
> > +	iounmap(anatop_base);
> > +	of_node_put(np);
> > +
> > +	imx93_soc_uid();
> > +
> > +	return rev;
> > +}
> > +
> >  static const struct imx8_soc_data imx8mq_soc_data = {
> >  	.name = "i.MX8MQ",
> >  	.soc_revision = imx8mq_soc_revision, @@ -161,11 +212,17 @@
> static
> > const struct imx8_soc_data imx8mp_soc_data = {
> >  	.soc_revision = imx8mm_soc_revision,  };
> >
> > +static const struct imx8_soc_data imx93_soc_data = {
> > +	.name = "i.MX93",
> > +	.soc_revision = imx93_soc_revision,
> > +};
> > +
> >  static __maybe_unused const struct of_device_id imx8_soc_match[] = {
> >  	{ .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
> >  	{ .compatible = "fsl,imx8mm", .data = &imx8mm_soc_data, },
> >  	{ .compatible = "fsl,imx8mn", .data = &imx8mn_soc_data, },
> >  	{ .compatible = "fsl,imx8mp", .data = &imx8mp_soc_data, },
> > +	{ .compatible = "fsl,imx93", .data = &imx93_soc_data, },
> >  	{ }
> >  };
> >
> > @@ -212,7 +269,12 @@ static int __init imx8_soc_init(void)
> >  		goto free_soc;
> >  	}
> >
> > -	soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX",
> soc_uid);
> > +	if (soc_uid_h) {
> 
> Unnecessary parentheses.
> 
> Shawn
> 
> > +		soc_dev_attr->serial_number = kasprintf(GFP_KERNEL,
> "%016llX%016llX",
> > +							soc_uid_h, soc_uid);
> > +	} else {
> > +		soc_dev_attr->serial_number = kasprintf(GFP_KERNEL,
> "%016llX", soc_uid);
> > +	}
> >  	if (!soc_dev_attr->serial_number) {
> >  		ret = -ENOMEM;
> >  		goto free_rev;
> > --
> > 2.37.1
> >
  

Patch

diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile
index a28c44a1f16a..83aff181ae51 100644
--- a/drivers/soc/imx/Makefile
+++ b/drivers/soc/imx/Makefile
@@ -7,5 +7,5 @@  obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o
 obj-$(CONFIG_SOC_IMX8M) += soc-imx8m.o
 obj-$(CONFIG_IMX8M_BLK_CTRL) += imx8m-blk-ctrl.o
 obj-$(CONFIG_IMX8M_BLK_CTRL) += imx8mp-blk-ctrl.o
-obj-$(CONFIG_SOC_IMX9) += imx93-src.o imx93-pd.o
+obj-$(CONFIG_SOC_IMX9) += soc-imx8m.o imx93-src.o imx93-pd.o
 obj-$(CONFIG_IMX9_BLK_CTRL) += imx93-blk-ctrl.o
diff --git a/drivers/soc/imx/soc-imx8m.c b/drivers/soc/imx/soc-imx8m.c
index 1dcd243df567..0e69b8b48183 100644
--- a/drivers/soc/imx/soc-imx8m.c
+++ b/drivers/soc/imx/soc-imx8m.c
@@ -25,8 +25,11 @@ 
 
 #define IMX8MP_OCOTP_UID_OFFSET		0x10
 
+#define IMX93_OCOTP_UID_OFFSET		0x80c0
+
 /* Same as ANADIG_DIGPROG_IMX7D */
 #define ANADIG_DIGPROG_IMX8MM	0x800
+#define ANADIG_DIGPROG_IMX93	0x800
 
 struct imx8_soc_data {
 	char *name;
@@ -34,6 +37,7 @@  struct imx8_soc_data {
 };
 
 static u64 soc_uid;
+static u64 soc_uid_h;
 
 #ifdef CONFIG_HAVE_ARM_SMCCC
 static u32 imx8mq_soc_revision_from_atf(void)
@@ -141,6 +145,53 @@  static u32 __init imx8mm_soc_revision(void)
 	return rev;
 }
 
+static void __init imx93_soc_uid(void)
+{
+	void __iomem *ocotp_base;
+	struct device_node *np;
+
+	np = of_find_compatible_node(NULL, NULL, "fsl,imx93-ocotp");
+	if (!np)
+		return;
+
+	ocotp_base = of_iomap(np, 0);
+	WARN_ON(!ocotp_base);
+
+	soc_uid = readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0x8);
+	soc_uid <<= 32;
+	soc_uid |= readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0xC);
+
+	soc_uid_h = readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0x0);
+	soc_uid_h <<= 32;
+	soc_uid_h |= readl_relaxed(ocotp_base + IMX93_OCOTP_UID_OFFSET + 0x4);
+
+	iounmap(ocotp_base);
+	of_node_put(np);
+}
+
+static u32 __init imx93_soc_revision(void)
+{
+	struct device_node *np;
+	void __iomem *anatop_base;
+	u32 rev;
+
+	np = of_find_compatible_node(NULL, NULL, "fsl,imx93-anatop");
+	if (!np)
+		return 0;
+
+	anatop_base = of_iomap(np, 0);
+	WARN_ON(!anatop_base);
+
+	rev = readl_relaxed(anatop_base + ANADIG_DIGPROG_IMX93);
+
+	iounmap(anatop_base);
+	of_node_put(np);
+
+	imx93_soc_uid();
+
+	return rev;
+}
+
 static const struct imx8_soc_data imx8mq_soc_data = {
 	.name = "i.MX8MQ",
 	.soc_revision = imx8mq_soc_revision,
@@ -161,11 +212,17 @@  static const struct imx8_soc_data imx8mp_soc_data = {
 	.soc_revision = imx8mm_soc_revision,
 };
 
+static const struct imx8_soc_data imx93_soc_data = {
+	.name = "i.MX93",
+	.soc_revision = imx93_soc_revision,
+};
+
 static __maybe_unused const struct of_device_id imx8_soc_match[] = {
 	{ .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
 	{ .compatible = "fsl,imx8mm", .data = &imx8mm_soc_data, },
 	{ .compatible = "fsl,imx8mn", .data = &imx8mn_soc_data, },
 	{ .compatible = "fsl,imx8mp", .data = &imx8mp_soc_data, },
+	{ .compatible = "fsl,imx93", .data = &imx93_soc_data, },
 	{ }
 };
 
@@ -212,7 +269,12 @@  static int __init imx8_soc_init(void)
 		goto free_soc;
 	}
 
-	soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX", soc_uid);
+	if (soc_uid_h) {
+		soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX%016llX",
+							soc_uid_h, soc_uid);
+	} else {
+		soc_dev_attr->serial_number = kasprintf(GFP_KERNEL, "%016llX", soc_uid);
+	}
 	if (!soc_dev_attr->serial_number) {
 		ret = -ENOMEM;
 		goto free_rev;