2023-05-09 09:21:45

by Peng Fan (OSS)

[permalink] [raw]
Subject: [PATCH V2] soc: imx: support i.MX93 soc device

From: Peng Fan <[email protected]>

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

Signed-off-by: Peng Fan <[email protected]>
---

V2:
The ocotp yaml has got R-b from DT maintainer:
https://lore.kernel.org/all/[email protected]/

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) {
+ 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


2023-05-15 03:17:11

by Shawn Guo

[permalink] [raw]
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 <[email protected]>
>
> 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 <[email protected]>
> ---
>
> V2:
> The ocotp yaml has got R-b from DT maintainer:
> https://lore.kernel.org/all/[email protected]/
>
> 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
>

2023-05-15 06:52:36

by Peng Fan

[permalink] [raw]
Subject: RE: [PATCH V2] soc: imx: support i.MX93 soc device

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 <[email protected]>
> >
> > 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 <[email protected]>
> > ---
> >
> > 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
> >