Hi Alice,

On 9/1/25 03:48, Alice Guo (OSS) wrote:
> From: Ye Li <ye...@nxp.com>
> 
> - Add base addresses for WDG3, WDG4, GPIO6, and GPIO7 for i.MX94.
> - Introduce common.h with macros of clock IDs, power domains, and CPU
>   types for platform-specific replacement (e.g., i.MX94, i.MX95).
> - Extend imx_get_mac_from_fuse() to support i.MX94.
> 
> Signed-off-by: Ye Li <ye...@nxp.com>
> Signed-off-by: Alice Guo <alice....@nxp.com>
> Acked-by: Peng Fan <peng....@nxp.com>
> Reviewed-by: Jacky Bai <ping....@nxp.com>
> ---
>  arch/arm/include/asm/arch-imx9/imx-regs.h |  9 ++++++
>  arch/arm/mach-imx/imx9/scmi/clock.c       | 28 +++++++++--------
>  arch/arm/mach-imx/imx9/scmi/common.h      | 41 +++++++++++++++++++++++++
>  arch/arm/mach-imx/imx9/scmi/soc.c         | 50 
> ++++++++++++++++++++++++-------
>  4 files changed, 105 insertions(+), 23 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-imx9/imx-regs.h 
> b/arch/arm/include/asm/arch-imx9/imx-regs.h
> index 5127fe8f286..a44fa6663c3 100644
> --- a/arch/arm/include/asm/arch-imx9/imx-regs.h
> +++ b/arch/arm/include/asm/arch-imx9/imx-regs.h
> @@ -17,14 +17,23 @@
>  
>  #define ANATOP_BASE_ADDR    0x44480000UL
>  
> +#ifdef CONFIG_IMX94
> +#define WDG3_BASE_ADDR      0x49220000UL
> +#define WDG4_BASE_ADDR      0x49230000UL
> +#else
>  #define WDG3_BASE_ADDR      0x42490000UL
>  #define WDG4_BASE_ADDR      0x424a0000UL
> +#endif
>  #define WDG5_BASE_ADDR      0x424b0000UL
>  
>  #define GPIO2_BASE_ADDR          0x43810000UL
>  #define GPIO3_BASE_ADDR          0x43820000UL
>  #define GPIO4_BASE_ADDR          0x43840000UL
>  #define GPIO5_BASE_ADDR          0x43850000UL
> +#ifdef CONFIG_IMX94
> +#define GPIO6_BASE_ADDR          0x43860000UL
> +#define GPIO7_BASE_ADDR          0x43870000UL
> +#endif
>  
>  #define FSB_BASE_ADDR       0x47510000UL
>  
> diff --git a/arch/arm/mach-imx/imx9/scmi/clock.c 
> b/arch/arm/mach-imx/imx9/scmi/clock.c
> index 6e6541eaa31..1f071873dca 100644
> --- a/arch/arm/mach-imx/imx9/scmi/clock.c
> +++ b/arch/arm/mach-imx/imx9/scmi/clock.c
> @@ -6,16 +6,18 @@
>  #include <asm/arch/clock.h>
>  #include <dm/uclass.h>
>  #include <scmi_agent.h>
> +#include <scmi_nxp_protocols.h>

>  #include "../../../../../dts/upstream/src/arm64/freescale/imx95-clock.h"

What is this? I asked and it was suggested to send a patch upstream, but
they said no. Ref:
https://lore.kernel.org/lkml/paxpr04mb845970863a16718967270d1a88...@paxpr04mb8459.eurprd04.prod.outlook.com/

> +#include "common.h"
>  
>  u32 get_arm_core_clk(void)
>  {
>       u32 val;
>  
> -     val = imx_clk_scmi_get_rate(IMX95_CLK_SEL_A55C0);
> +     val = imx_clk_scmi_get_rate(SCMI_CLK(SEL_A55C0));
>       if (val)
>               return val;
> -     return imx_clk_scmi_get_rate(IMX95_CLK_A55);
> +     return imx_clk_scmi_get_rate(SCMI_CLK(A55));
>  }
>  
>  void init_uart_clk(u32 index)
> @@ -24,13 +26,13 @@ void init_uart_clk(u32 index)
>  
>       switch (index) {
>       case 0:
> -             clock_id = IMX95_CLK_LPUART1;
> +             clock_id = SCMI_CLK(LPUART1);
>               break;
>       case 1:
> -             clock_id = IMX95_CLK_LPUART2;
> +             clock_id = SCMI_CLK(LPUART2);
>               break;
>       case 2:
> -             clock_id = IMX95_CLK_LPUART3;
> +             clock_id = SCMI_CLK(LPUART3);
>               break;
>       default:
>               return;
> @@ -38,7 +40,7 @@ void init_uart_clk(u32 index)
>  
>       /* 24MHz */
>       imx_clk_scmi_enable(clock_id, false);
> -     imx_clk_scmi_set_parent(clock_id, IMX95_CLK_24M);
> +     imx_clk_scmi_set_parent(clock_id, SCMI_CLK(24M));
>       imx_clk_scmi_set_rate(clock_id, 24000000);
>       imx_clk_scmi_enable(clock_id, true);
>  }
> @@ -49,19 +51,19 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
>       case MXC_ARM_CLK:
>               return get_arm_core_clk();
>       case MXC_IPG_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_BUSWAKEUP);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(BUSWAKEUP));
>       case MXC_CSPI_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_LPSPI1);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(LPSPI1));
>       case MXC_ESDHC_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_USDHC1);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(USDHC1));
>       case MXC_ESDHC2_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_USDHC2);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(USDHC2));
>       case MXC_ESDHC3_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_USDHC3);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(USDHC3));
>       case MXC_UART_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_LPUART1);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(LPUART1));
>       case MXC_FLEXSPI_CLK:
> -             return imx_clk_scmi_get_rate(IMX95_CLK_FLEXSPI1);
> +             return imx_clk_scmi_get_rate(SCMI_CLK(FLEXSPI1));
>       default:
>               return -1;
>       };
> diff --git a/arch/arm/mach-imx/imx9/scmi/common.h 
> b/arch/arm/mach-imx/imx9/scmi/common.h
> new file mode 100644
> index 00000000000..df26ecff3e4
> --- /dev/null
> +++ b/arch/arm/mach-imx/imx9/scmi/common.h
> @@ -0,0 +1,41 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright 2025 NXP
> + */
> +
> +#ifndef _SCMI_CLOCK_COMMON_H_
> +#define _SCMI_CLOCK_COMMON_H_
> +

> +#ifdef CONFIG_IMX94
> +#define IMX_PLAT 94
> +#include <../dts/upstream/src/arm64/freescale/imx94-clock.h>
> +#include <../dts/upstream/src/arm64/freescale/imx94-power.h>
> +
> +#define IMX94_CLK_FLEXSPI1 IMX94_CLK_XSPI1
> +#endif
> +
> +#ifdef CONFIG_IMX95
> +#define IMX_PLAT 95
> +#include <../dts/upstream/src/arm64/freescale/imx95-clock.h>
> +#include <../dts/upstream/src/arm64/freescale/imx95-power.h>
> +
> +#define IMX95_PD_M70 IMX95_PD_M7
> +#endif

Again this weird include relative-global path... not good.

I don't know what it should be, sorry. It is fragile and we should do
something better.

> +
> +#define IMX_PLAT_STR__(plat) # plat
> +#define IMX_PLAT_STR_(IMX_PLAT) IMX_PLAT_STR__(IMX_PLAT)
> +#define IMX_PLAT_STR IMX_PLAT_STR_(IMX_PLAT)
> +
> +#define SCMI_CLK__(plat, clk) IMX ## plat ## _CLK_ ## clk
> +#define SCMI_CLK_(plat, clk) SCMI_CLK__(plat, clk)
> +#define SCMI_CLK(clk) SCMI_CLK_(IMX_PLAT, clk)
> +
> +#define SCMI_PD__(plat, pd) IMX ## plat ## _PD_ ## pd
> +#define SCMI_PD_(plat, pd) SCMI_PD__(plat, pd)
> +#define SCMI_PD(pd) SCMI_PD_(IMX_PLAT, pd)
> +
> +#define SCMI_CPU__(plat) MXC_CPU_IMX ## plat
> +#define SCMI_CPU_(plat) SCMI_CPU__(plat)
> +#define SCMI_CPU SCMI_CPU_(IMX_PLAT)
> +
> +#endif
> diff --git a/arch/arm/mach-imx/imx9/scmi/soc.c 
> b/arch/arm/mach-imx/imx9/scmi/soc.c
> index f0b2aad8701..43aecca6f48 100644
> --- a/arch/arm/mach-imx/imx9/scmi/soc.c
> +++ b/arch/arm/mach-imx/imx9/scmi/soc.c
> @@ -21,6 +21,7 @@
>  #include <linux/iopoll.h>
>  #include <scmi_agent.h>
>  #include <scmi_nxp_protocols.h>
> +#include "common.h"
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -176,7 +177,7 @@ u32 get_cpu_rev(void)
>  {
>       u32 rev = (gd->arch.soc_rev >> 24) - 0xa0;
>  
> -     return (MXC_CPU_IMX95 << 12) | (CHIP_REV_1_0 + rev);
> +     return (SCMI_CPU << 12) | (CHIP_REV_1_0 + rev);
>  }
>  
>  #define UNLOCK_WORD 0xD928C520
> @@ -437,12 +438,16 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char 
> *mac)
>  {
>       u32 val[2] = {};
>       int ret, num_of_macs;
> +     u32 bank = 40;
>  
> -     ret = fuse_read(40, 5, &val[0]);
> +     if (is_imx94())
> +             bank = 66;
> +
> +     ret = fuse_read(bank, 5, &val[0]);
>       if (ret)
>               goto err;
>  
> -     ret = fuse_read(40, 6, &val[1]);
> +     ret = fuse_read(bank, 6, &val[1]);
>       if (ret)
>               goto err;
>  
> @@ -458,10 +463,32 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char 
> *mac)
>       mac[3] = (val[0] >> 24) & 0xff;
>       mac[4] = val[1] & 0xff;
>       mac[5] = (val[1] >> 8) & 0xff;
> -     if (dev_id == 1)
> -             mac[5] = mac[5] + 3;
> -     if (dev_id == 2)
> -             mac[5] = mac[5] + 6;
> +
> +     if (is_imx94()) {
> +             /*
> +              * i.MX94 uses the following mac address offset list:
> +              * | No.    | Module      | Mac address user          |
> +              * |--------|-------------|---------------------------|
> +              * | 0 ~ 1  | ethercat    | port0/port1               |
> +              * | 2      | netc switch | internal enetc3 mac/swp0  |
> +              * | 3 ~ 6  |             | enetc3 vf1~3/swp1         |
> +              * | 7      | enetc mac   | enetc0 pf                 |
> +              * | 8      |             | enetc1 pf                 |
> +              * | 9      |             | enetc2 pf                 |
> +              * | 10     | netc switch | swp2                      |
> +              */
> +             if (dev_id == 0)
> +                     mac[5] = mac[5] + 2; /* enetc3 mac/swp0 */
> +             if (dev_id == 1)
> +                     mac[5] = mac[5] + 8; /* enetc1 */
> +             if (dev_id == 2)
> +                     mac[5] = mac[5] + 9; /* enetc2 */
> +     } else {
> +             if (dev_id == 1)
> +                     mac[5] = mac[5] + 3;
> +             if (dev_id == 2)
> +                     mac[5] = mac[5] + 6;
> +     }
>  
>       debug("%s: MAC%d: %pM\n", __func__, dev_id, mac);
>       return;
> @@ -518,7 +545,6 @@ static char *rst_string_imx94[32] = {
>       "por"
>  };
>  
> -
>  int get_reset_reason(bool sys, bool lm)
>  {
>       struct scmi_imx_misc_reset_reason_in in = {
> @@ -612,8 +638,8 @@ int get_reset_reason(bool sys, bool lm)
>  const char *get_imx_type(u32 imxtype)
>  {
>       switch (imxtype) {
> -     case MXC_CPU_IMX95:
> -             return "95";/* iMX95 FULL */
> +     case SCMI_CPU:
> +             return IMX_PLAT_STR;
>       default:
>               return "??";
>       }
> @@ -701,6 +727,10 @@ int arch_cpu_init(void)
>               gpio_reset(GPIO3_BASE_ADDR);
>               gpio_reset(GPIO4_BASE_ADDR);
>               gpio_reset(GPIO5_BASE_ADDR);
> +#ifdef CONFIG_IMX94
> +             gpio_reset(GPIO6_BASE_ADDR);
> +             gpio_reset(GPIO7_BASE_ADDR);
> +#endif
>       }
>  
>       return 0;
> 

Best regards,

-E Shattow

Reply via email to