diff mbox series

[U-Boot,V5,14/31] imx: refactor imx_get_mac_from_fuse

Message ID 20180110052048.4425-15-peng.fan@nxp.com
State Awaiting Upstream
Delegated to: Stefano Babic
Headers show
Series imx: add i.MX8M support and i.MX8MQ EVK | expand

Commit Message

Peng Fan Jan. 10, 2018, 5:20 a.m. UTC
Move imx_get_mac_from_fuse to a new mac.c for i.MX6/7.
Since fuse regs structure are different for i.MX6/7, use mac
address offset in code and define a new local struture
imx_mac_fuse.

Also sort the config order.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
---
 arch/arm/mach-imx/Makefile  |  3 ++-
 arch/arm/mach-imx/mac.c     | 61 +++++++++++++++++++++++++++++++++++++++++++++
 arch/arm/mach-imx/mx6/soc.c | 34 -------------------------
 arch/arm/mach-imx/mx7/soc.c | 32 ------------------------
 4 files changed, 63 insertions(+), 67 deletions(-)
 create mode 100644 arch/arm/mach-imx/mac.c

Comments

Stefano Babic Jan. 21, 2018, 4:31 p.m. UTC | #1
On 10/01/2018 06:20, Peng Fan wrote:
> Move imx_get_mac_from_fuse to a new mac.c for i.MX6/7.
> Since fuse regs structure are different for i.MX6/7, use mac
> address offset in code and define a new local struture
> imx_mac_fuse.
> 
> Also sort the config order.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Fabio Estevam <fabio.estevam@nxp.com>
> ---
>  arch/arm/mach-imx/Makefile  |  3 ++-
>  arch/arm/mach-imx/mac.c     | 61 +++++++++++++++++++++++++++++++++++++++++++++
>  arch/arm/mach-imx/mx6/soc.c | 34 -------------------------
>  arch/arm/mach-imx/mx7/soc.c | 32 ------------------------
>  4 files changed, 63 insertions(+), 67 deletions(-)
>  create mode 100644 arch/arm/mach-imx/mac.c
> 
> diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
> index 63db0e15c4..714b858e73 100644
> --- a/arch/arm/mach-imx/Makefile
> +++ b/arch/arm/mach-imx/Makefile
> @@ -25,12 +25,13 @@ obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o
>  endif
>  ifeq ($(SOC),$(filter $(SOC),mx6 mx7))
>  obj-y 	+= cache.o init.o
> -obj-$(CONFIG_SATA) += sata.o
> +obj-$(CONFIG_FEC_MXC) += mac.o
>  obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
>  obj-$(CONFIG_IMX_RDC) += rdc-sema.o
>  ifneq ($(CONFIG_SPL_BUILD),y)
>  obj-$(CONFIG_IMX_BOOTAUX) += imx_bootaux.o
>  endif
> +obj-$(CONFIG_SATA) += sata.o
>  obj-$(CONFIG_SECURE_BOOT)    += hab.o
>  obj-$(CONFIG_SYSCOUNTER_TIMER) += syscounter.o
>  endif
> diff --git a/arch/arm/mach-imx/mac.c b/arch/arm/mach-imx/mac.c
> new file mode 100644
> index 0000000000..dd7fd92d31
> --- /dev/null
> +++ b/arch/arm/mach-imx/mac.c
> @@ -0,0 +1,61 @@
> +/*
> + * Copyright 2017 NXP
> + *
> + * Peng Fan <peng.fan@nxp.com>
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/arch/imx-regs.h>
> +#include <asm/io.h>
> +#include <asm/arch/sys_proto.h>
> +#include <errno.h>
> +
> +struct imx_mac_fuse {
> +	u32 mac_addr0;
> +	u32 rsvd0[3];
> +	u32 mac_addr1;
> +	u32 rsvd1[3];
> +	u32 mac_addr2;
> +	u32 rsvd2[7];
> +};
> +
> +#define MAC_FUSE_MX6_OFFSET	0x620
> +#define MAC_FUSE_MX7_OFFSET	0x640
> +
> +void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
> +{
> +	struct imx_mac_fuse *fuse;
> +	u32 offset;
> +	bool has_second_mac;
> +
> +	offset = is_mx6() ? MAC_FUSE_MX6_OFFSET : MAC_FUSE_MX7_OFFSET;
> +	fuse = (struct imx_mac_fuse *)(ulong)(OCOTP_BASE_ADDR + offset);
> +	has_second_mac = is_mx7() || is_mx6sx() || is_mx6ul() || is_mx6ull();
> +
> +	if (has_second_mac && dev_id == 1) {
> +		u32 value = readl(&fuse->mac_addr2);
> +
> +		mac[0] = value >> 24;
> +		mac[1] = value >> 16;
> +		mac[2] = value >> 8;
> +		mac[3] = value;
> +
> +		value = readl(&fuse->mac_addr1);
> +		mac[4] = value >> 24;
> +		mac[5] = value >> 16;
> +
> +	} else {
> +		u32 value = readl(&fuse->mac_addr1);
> +
> +		mac[0] = value >> 8;
> +		mac[1] = value;
> +
> +		value = readl(&fuse->mac_addr0);
> +		mac[2] = value >> 24;
> +		mac[3] = value >> 16;
> +		mac[4] = value >> 8;
> +		mac[5] = value;
> +	}
> +}
> diff --git a/arch/arm/mach-imx/mx6/soc.c b/arch/arm/mach-imx/mx6/soc.c
> index 43cb58106b..b3bee58f10 100644
> --- a/arch/arm/mach-imx/mx6/soc.c
> +++ b/arch/arm/mach-imx/mx6/soc.c
> @@ -518,40 +518,6 @@ int board_postclk_init(void)
>  	return 0;
>  }
>  
> -#if defined(CONFIG_FEC_MXC)
> -void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
> -{
> -	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
> -	struct fuse_bank *bank = &ocotp->bank[4];
> -	struct fuse_bank4_regs *fuse =
> -			(struct fuse_bank4_regs *)bank->fuse_regs;
> -
> -	if ((is_mx6sx() || is_mx6ul() || is_mx6ull()) && dev_id == 1) {
> -		u32 value = readl(&fuse->mac_addr2);
> -		mac[0] = value >> 24 ;
> -		mac[1] = value >> 16 ;
> -		mac[2] = value >> 8 ;
> -		mac[3] = value ;
> -
> -		value = readl(&fuse->mac_addr1);
> -		mac[4] = value >> 24 ;
> -		mac[5] = value >> 16 ;
> -		
> -	} else {
> -		u32 value = readl(&fuse->mac_addr1);
> -		mac[0] = (value >> 8);
> -		mac[1] = value ;
> -
> -		value = readl(&fuse->mac_addr0);
> -		mac[2] = value >> 24 ;
> -		mac[3] = value >> 16 ;
> -		mac[4] = value >> 8 ;
> -		mac[5] = value ;
> -	}
> -
> -}
> -#endif
> -
>  #ifndef CONFIG_SPL_BUILD
>  /*
>   * cfg_val will be used for
> diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
> index 032dfcf2ce..10dec8bdf4 100644
> --- a/arch/arm/mach-imx/mx7/soc.c
> +++ b/arch/arm/mach-imx/mx7/soc.c
> @@ -208,38 +208,6 @@ void get_board_serial(struct tag_serialnr *serialnr)
>  }
>  #endif
>  
> -#if defined(CONFIG_FEC_MXC)
> -void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
> -{
> -	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
> -	struct fuse_bank *bank = &ocotp->bank[9];
> -	struct fuse_bank9_regs *fuse =
> -		(struct fuse_bank9_regs *)bank->fuse_regs;
> -
> -	if (0 == dev_id) {
> -		u32 value = readl(&fuse->mac_addr1);
> -		mac[0] = (value >> 8);
> -		mac[1] = value;
> -
> -		value = readl(&fuse->mac_addr0);
> -		mac[2] = value >> 24;
> -		mac[3] = value >> 16;
> -		mac[4] = value >> 8;
> -		mac[5] = value;
> -	} else {
> -		u32 value = readl(&fuse->mac_addr2);
> -		mac[0] = value >> 24;
> -		mac[1] = value >> 16;
> -		mac[2] = value >> 8;
> -		mac[3] = value;
> -
> -		value = readl(&fuse->mac_addr1);
> -		mac[4] = value >> 24;
> -		mac[5] = value >> 16;
> -	}
> -}
> -#endif
> -
>  #ifdef CONFIG_IMX_BOOTAUX
>  int arch_auxiliary_core_up(u32 core_id, u32 boot_private_data)
>  {
> 

Reviewed-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano Babic
diff mbox series

Patch

diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 63db0e15c4..714b858e73 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -25,12 +25,13 @@  obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o
 endif
 ifeq ($(SOC),$(filter $(SOC),mx6 mx7))
 obj-y 	+= cache.o init.o
-obj-$(CONFIG_SATA) += sata.o
+obj-$(CONFIG_FEC_MXC) += mac.o
 obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
 obj-$(CONFIG_IMX_RDC) += rdc-sema.o
 ifneq ($(CONFIG_SPL_BUILD),y)
 obj-$(CONFIG_IMX_BOOTAUX) += imx_bootaux.o
 endif
+obj-$(CONFIG_SATA) += sata.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
 obj-$(CONFIG_SYSCOUNTER_TIMER) += syscounter.o
 endif
diff --git a/arch/arm/mach-imx/mac.c b/arch/arm/mach-imx/mac.c
new file mode 100644
index 0000000000..dd7fd92d31
--- /dev/null
+++ b/arch/arm/mach-imx/mac.c
@@ -0,0 +1,61 @@ 
+/*
+ * Copyright 2017 NXP
+ *
+ * Peng Fan <peng.fan@nxp.com>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <errno.h>
+
+struct imx_mac_fuse {
+	u32 mac_addr0;
+	u32 rsvd0[3];
+	u32 mac_addr1;
+	u32 rsvd1[3];
+	u32 mac_addr2;
+	u32 rsvd2[7];
+};
+
+#define MAC_FUSE_MX6_OFFSET	0x620
+#define MAC_FUSE_MX7_OFFSET	0x640
+
+void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
+{
+	struct imx_mac_fuse *fuse;
+	u32 offset;
+	bool has_second_mac;
+
+	offset = is_mx6() ? MAC_FUSE_MX6_OFFSET : MAC_FUSE_MX7_OFFSET;
+	fuse = (struct imx_mac_fuse *)(ulong)(OCOTP_BASE_ADDR + offset);
+	has_second_mac = is_mx7() || is_mx6sx() || is_mx6ul() || is_mx6ull();
+
+	if (has_second_mac && dev_id == 1) {
+		u32 value = readl(&fuse->mac_addr2);
+
+		mac[0] = value >> 24;
+		mac[1] = value >> 16;
+		mac[2] = value >> 8;
+		mac[3] = value;
+
+		value = readl(&fuse->mac_addr1);
+		mac[4] = value >> 24;
+		mac[5] = value >> 16;
+
+	} else {
+		u32 value = readl(&fuse->mac_addr1);
+
+		mac[0] = value >> 8;
+		mac[1] = value;
+
+		value = readl(&fuse->mac_addr0);
+		mac[2] = value >> 24;
+		mac[3] = value >> 16;
+		mac[4] = value >> 8;
+		mac[5] = value;
+	}
+}
diff --git a/arch/arm/mach-imx/mx6/soc.c b/arch/arm/mach-imx/mx6/soc.c
index 43cb58106b..b3bee58f10 100644
--- a/arch/arm/mach-imx/mx6/soc.c
+++ b/arch/arm/mach-imx/mx6/soc.c
@@ -518,40 +518,6 @@  int board_postclk_init(void)
 	return 0;
 }
 
-#if defined(CONFIG_FEC_MXC)
-void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
-{
-	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
-	struct fuse_bank *bank = &ocotp->bank[4];
-	struct fuse_bank4_regs *fuse =
-			(struct fuse_bank4_regs *)bank->fuse_regs;
-
-	if ((is_mx6sx() || is_mx6ul() || is_mx6ull()) && dev_id == 1) {
-		u32 value = readl(&fuse->mac_addr2);
-		mac[0] = value >> 24 ;
-		mac[1] = value >> 16 ;
-		mac[2] = value >> 8 ;
-		mac[3] = value ;
-
-		value = readl(&fuse->mac_addr1);
-		mac[4] = value >> 24 ;
-		mac[5] = value >> 16 ;
-		
-	} else {
-		u32 value = readl(&fuse->mac_addr1);
-		mac[0] = (value >> 8);
-		mac[1] = value ;
-
-		value = readl(&fuse->mac_addr0);
-		mac[2] = value >> 24 ;
-		mac[3] = value >> 16 ;
-		mac[4] = value >> 8 ;
-		mac[5] = value ;
-	}
-
-}
-#endif
-
 #ifndef CONFIG_SPL_BUILD
 /*
  * cfg_val will be used for
diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
index 032dfcf2ce..10dec8bdf4 100644
--- a/arch/arm/mach-imx/mx7/soc.c
+++ b/arch/arm/mach-imx/mx7/soc.c
@@ -208,38 +208,6 @@  void get_board_serial(struct tag_serialnr *serialnr)
 }
 #endif
 
-#if defined(CONFIG_FEC_MXC)
-void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
-{
-	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
-	struct fuse_bank *bank = &ocotp->bank[9];
-	struct fuse_bank9_regs *fuse =
-		(struct fuse_bank9_regs *)bank->fuse_regs;
-
-	if (0 == dev_id) {
-		u32 value = readl(&fuse->mac_addr1);
-		mac[0] = (value >> 8);
-		mac[1] = value;
-
-		value = readl(&fuse->mac_addr0);
-		mac[2] = value >> 24;
-		mac[3] = value >> 16;
-		mac[4] = value >> 8;
-		mac[5] = value;
-	} else {
-		u32 value = readl(&fuse->mac_addr2);
-		mac[0] = value >> 24;
-		mac[1] = value >> 16;
-		mac[2] = value >> 8;
-		mac[3] = value;
-
-		value = readl(&fuse->mac_addr1);
-		mac[4] = value >> 24;
-		mac[5] = value >> 16;
-	}
-}
-#endif
-
 #ifdef CONFIG_IMX_BOOTAUX
 int arch_auxiliary_core_up(u32 core_id, u32 boot_private_data)
 {