[PATCH 09/16] arm: stm32mp: support 2 MAC address for STM32MP13
Patrice CHOTARD
patrice.chotard at foss.st.com
Fri May 20 08:55:14 CEST 2022
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 at 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 at foss.st.com>
Thanks
Patrice
More information about the U-Boot
mailing list