diff mbox series

[09/16] arm: stm32mp: support 2 MAC address for STM32MP13

Message ID 20220506160540.9.I202fcb973ba156e8df0d37ac7befbca1916e72af@changeid
State Superseded
Delegated to: Patrice Chotard
Headers show
Series stm32mp: add STM32MP13x support | expand

Commit Message

Patrick Delaunay May 6, 2022, 2:06 p.m. UTC
Add support of several MAC address in OTP (3 32bits OTP word for
2 MAC address) for SOCs in  STM32MP13x family: STM32MP133 and STM32MP135.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cpu.c                   | 41 ++++++++++++-------
 .../arm/mach-stm32mp/include/mach/sys_proto.h |  1 +
 arch/arm/mach-stm32mp/stm32mp13x.c            | 20 +++++++++
 arch/arm/mach-stm32mp/stm32mp15x.c            |  5 +++
 4 files changed, 52 insertions(+), 15 deletions(-)

Comments

Patrice CHOTARD May 20, 2022, 6:55 a.m. UTC | #1
Hi Patrick

On 5/6/22 16:06, Patrick Delaunay wrote:
> Add support of several MAC address in OTP (3 32bits OTP word for
> 2 MAC address) for SOCs in  STM32MP13x family: STM32MP133 and STM32MP135.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cpu.c                   | 41 ++++++++++++-------
>  .../arm/mach-stm32mp/include/mach/sys_proto.h |  1 +
>  arch/arm/mach-stm32mp/stm32mp13x.c            | 20 +++++++++
>  arch/arm/mach-stm32mp/stm32mp15x.c            |  5 +++
>  4 files changed, 52 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
> index 240960ada4..855fc755fe 100644
> --- a/arch/arm/mach-stm32mp/cpu.c
> +++ b/arch/arm/mach-stm32mp/cpu.c
> @@ -290,16 +290,18 @@ __weak int setup_mac_address(void)
>  {
>  	int ret;
>  	int i;
> -	u32 otp[2];
> +	u32 otp[3];
>  	uchar enetaddr[6];
>  	struct udevice *dev;
> +	int nb_eth, nb_otp, index;
>  
>  	if (!IS_ENABLED(CONFIG_NET))
>  		return 0;
>  
> -	/* MAC already in environment */
> -	if (eth_env_get_enetaddr("ethaddr", enetaddr))
> -		return 0;
> +	nb_eth = get_eth_nb();
> +
> +	/* 6 bytes for each MAC addr and 4 bytes for each OTP */
> +	nb_otp = DIV_ROUND_UP(6 * nb_eth, 4);
>  
>  	ret = uclass_get_device_by_driver(UCLASS_MISC,
>  					  DM_DRIVER_GET(stm32mp_bsec),
> @@ -307,22 +309,31 @@ __weak int setup_mac_address(void)
>  	if (ret)
>  		return ret;
>  
> -	ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_MAC),
> -			otp, sizeof(otp));
> +	ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_MAC), otp, 4 * nb_otp);
>  	if (ret < 0)
>  		return ret;
>  
> -	for (i = 0; i < 6; i++)
> -		enetaddr[i] = ((uint8_t *)&otp)[i];
> +	for (index = 0; index < nb_eth; index++) {
> +		/* MAC already in environment */
> +		if (eth_env_get_enetaddr_by_index("eth", index, enetaddr))
> +			continue;
> +
> +		for (i = 0; i < 6; i++)
> +			enetaddr[i] = ((uint8_t *)&otp)[i + 6 * index];
>  
> -	if (!is_valid_ethaddr(enetaddr)) {
> -		log_err("invalid MAC address in OTP %pM\n", enetaddr);
> -		return -EINVAL;
> +		if (!is_valid_ethaddr(enetaddr)) {
> +			log_err("invalid MAC address %d in OTP %pM\n",
> +				index, enetaddr);
> +			return -EINVAL;
> +		}
> +		log_debug("OTP MAC address %d = %pM\n", index, enetaddr);
> +		ret = eth_env_set_enetaddr_by_index("eth", index, enetaddr);
> +		if (ret) {
> +			log_err("Failed to set mac address %pM from OTP: %d\n",
> +				enetaddr, ret);
> +			return ret;
> +		}
>  	}
> -	log_debug("OTP MAC address = %pM\n", enetaddr);
> -	ret = eth_env_set_enetaddr("ethaddr", enetaddr);
> -	if (ret)
> -		log_err("Failed to set mac address %pM from OTP: %d\n", enetaddr, ret);
>  
>  	return 0;
>  }
> diff --git a/arch/arm/mach-stm32mp/include/mach/sys_proto.h b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
> index 829b3feebf..4b564e86dc 100644
> --- a/arch/arm/mach-stm32mp/include/mach/sys_proto.h
> +++ b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
> @@ -64,6 +64,7 @@ void get_soc_name(char name[SOC_NAME_SIZE]);
>  /* return boot mode */
>  u32 get_bootmode(void);
>  
> +int get_eth_nb(void);
>  int setup_mac_address(void);
>  
>  /* board power management : configure vddcore according OPP */
> diff --git a/arch/arm/mach-stm32mp/stm32mp13x.c b/arch/arm/mach-stm32mp/stm32mp13x.c
> index 38961310dc..8a56f381ce 100644
> --- a/arch/arm/mach-stm32mp/stm32mp13x.c
> +++ b/arch/arm/mach-stm32mp/stm32mp13x.c
> @@ -51,6 +51,26 @@ u32 get_cpu_type(void)
>  	return (get_cpu_dev() << 16) | get_cpu_rpn();
>  }
>  
> +int get_eth_nb(void)
> +{
> +	int nb_eth = 2;
> +
> +	switch (get_cpu_type()) {
> +	case CPU_STM32MP131Dxx:
> +		fallthrough;
> +	case CPU_STM32MP131Cxx:
> +		fallthrough;
> +	case CPU_STM32MP131Axx:
> +		nb_eth = 1;
> +		break;
> +	default:
> +		nb_eth = 2;
> +		break;
> +	}
> +
> +	return nb_eth;
> +}
> +
>  void get_soc_name(char name[SOC_NAME_SIZE])
>  {
>  	char *cpu_s, *cpu_r;
> diff --git a/arch/arm/mach-stm32mp/stm32mp15x.c b/arch/arm/mach-stm32mp/stm32mp15x.c
> index 800fad2f43..a093e6163e 100644
> --- a/arch/arm/mach-stm32mp/stm32mp15x.c
> +++ b/arch/arm/mach-stm32mp/stm32mp15x.c
> @@ -247,6 +247,11 @@ u32 get_cpu_type(void)
>  	return (get_cpu_dev() << 16) | get_cpu_rpn();
>  }
>  
> +int get_eth_nb(void)
> +{
> +	return 1;
> +}
> +
>  /* Get Package options from OTP */
>  u32 get_cpu_package(void)
>  {

Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Thanks
Patrice
Patrick Delaunay June 17, 2022, 8:57 a.m. UTC | #2
Hi,

On 5/6/22 16:06, Patrick Delaunay wrote:
> Add support of several MAC address in OTP (3 32bits OTP word for
> 2 MAC address) for SOCs in  STM32MP13x family: STM32MP133 and STM32MP135.
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
>
>   arch/arm/mach-stm32mp/cpu.c                   | 41 ++++++++++++-------
>   .../arm/mach-stm32mp/include/mach/sys_proto.h |  1 +
>   arch/arm/mach-stm32mp/stm32mp13x.c            | 20 +++++++++
>   arch/arm/mach-stm32mp/stm32mp15x.c            |  5 +++
>   4 files changed, 52 insertions(+), 15 deletions(-)

Applied to u-boot-stm/next, thanks!

Regards
Patrick
diff mbox series

Patch

diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
index 240960ada4..855fc755fe 100644
--- a/arch/arm/mach-stm32mp/cpu.c
+++ b/arch/arm/mach-stm32mp/cpu.c
@@ -290,16 +290,18 @@  __weak int setup_mac_address(void)
 {
 	int ret;
 	int i;
-	u32 otp[2];
+	u32 otp[3];
 	uchar enetaddr[6];
 	struct udevice *dev;
+	int nb_eth, nb_otp, index;
 
 	if (!IS_ENABLED(CONFIG_NET))
 		return 0;
 
-	/* MAC already in environment */
-	if (eth_env_get_enetaddr("ethaddr", enetaddr))
-		return 0;
+	nb_eth = get_eth_nb();
+
+	/* 6 bytes for each MAC addr and 4 bytes for each OTP */
+	nb_otp = DIV_ROUND_UP(6 * nb_eth, 4);
 
 	ret = uclass_get_device_by_driver(UCLASS_MISC,
 					  DM_DRIVER_GET(stm32mp_bsec),
@@ -307,22 +309,31 @@  __weak int setup_mac_address(void)
 	if (ret)
 		return ret;
 
-	ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_MAC),
-			otp, sizeof(otp));
+	ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_MAC), otp, 4 * nb_otp);
 	if (ret < 0)
 		return ret;
 
-	for (i = 0; i < 6; i++)
-		enetaddr[i] = ((uint8_t *)&otp)[i];
+	for (index = 0; index < nb_eth; index++) {
+		/* MAC already in environment */
+		if (eth_env_get_enetaddr_by_index("eth", index, enetaddr))
+			continue;
+
+		for (i = 0; i < 6; i++)
+			enetaddr[i] = ((uint8_t *)&otp)[i + 6 * index];
 
-	if (!is_valid_ethaddr(enetaddr)) {
-		log_err("invalid MAC address in OTP %pM\n", enetaddr);
-		return -EINVAL;
+		if (!is_valid_ethaddr(enetaddr)) {
+			log_err("invalid MAC address %d in OTP %pM\n",
+				index, enetaddr);
+			return -EINVAL;
+		}
+		log_debug("OTP MAC address %d = %pM\n", index, enetaddr);
+		ret = eth_env_set_enetaddr_by_index("eth", index, enetaddr);
+		if (ret) {
+			log_err("Failed to set mac address %pM from OTP: %d\n",
+				enetaddr, ret);
+			return ret;
+		}
 	}
-	log_debug("OTP MAC address = %pM\n", enetaddr);
-	ret = eth_env_set_enetaddr("ethaddr", enetaddr);
-	if (ret)
-		log_err("Failed to set mac address %pM from OTP: %d\n", enetaddr, ret);
 
 	return 0;
 }
diff --git a/arch/arm/mach-stm32mp/include/mach/sys_proto.h b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
index 829b3feebf..4b564e86dc 100644
--- a/arch/arm/mach-stm32mp/include/mach/sys_proto.h
+++ b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
@@ -64,6 +64,7 @@  void get_soc_name(char name[SOC_NAME_SIZE]);
 /* return boot mode */
 u32 get_bootmode(void);
 
+int get_eth_nb(void);
 int setup_mac_address(void);
 
 /* board power management : configure vddcore according OPP */
diff --git a/arch/arm/mach-stm32mp/stm32mp13x.c b/arch/arm/mach-stm32mp/stm32mp13x.c
index 38961310dc..8a56f381ce 100644
--- a/arch/arm/mach-stm32mp/stm32mp13x.c
+++ b/arch/arm/mach-stm32mp/stm32mp13x.c
@@ -51,6 +51,26 @@  u32 get_cpu_type(void)
 	return (get_cpu_dev() << 16) | get_cpu_rpn();
 }
 
+int get_eth_nb(void)
+{
+	int nb_eth = 2;
+
+	switch (get_cpu_type()) {
+	case CPU_STM32MP131Dxx:
+		fallthrough;
+	case CPU_STM32MP131Cxx:
+		fallthrough;
+	case CPU_STM32MP131Axx:
+		nb_eth = 1;
+		break;
+	default:
+		nb_eth = 2;
+		break;
+	}
+
+	return nb_eth;
+}
+
 void get_soc_name(char name[SOC_NAME_SIZE])
 {
 	char *cpu_s, *cpu_r;
diff --git a/arch/arm/mach-stm32mp/stm32mp15x.c b/arch/arm/mach-stm32mp/stm32mp15x.c
index 800fad2f43..a093e6163e 100644
--- a/arch/arm/mach-stm32mp/stm32mp15x.c
+++ b/arch/arm/mach-stm32mp/stm32mp15x.c
@@ -247,6 +247,11 @@  u32 get_cpu_type(void)
 	return (get_cpu_dev() << 16) | get_cpu_rpn();
 }
 
+int get_eth_nb(void)
+{
+	return 1;
+}
+
 /* Get Package options from OTP */
 u32 get_cpu_package(void)
 {