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.delau...@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.chot...@foss.st.com> Thanks Patrice