]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: stm32mp: support 2 MAC address for STM32MP13
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Fri, 20 May 2022 16:24:47 +0000 (18:24 +0200)
committerPatrick Delaunay <patrick.delaunay@foss.st.com>
Fri, 17 Jun 2022 07:58:21 +0000 (09:58 +0200)
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>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
arch/arm/mach-stm32mp/cpu.c
arch/arm/mach-stm32mp/include/mach/sys_proto.h
arch/arm/mach-stm32mp/stm32mp13x.c
arch/arm/mach-stm32mp/stm32mp15x.c

index 240960ada49a57cc2abf5b9dfbdb5ec4550b2c5c..855fc755fe08862d46cbb6d277c958c716d31f07 100644 (file)
@@ -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;
 }
index 829b3feebf72f7479e84107bac05c857c96a0c1e..4b564e86dc52c12541481a68fcbd5c0362df85f8 100644 (file)
@@ -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 */
index d5e3a787c2506dbd814dd462a48e47889e237960..bd3f24c349ad53540532e3afcf92147a6c86b43b 100644 (file)
@@ -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;
index 800fad2f436275b01f2db936e16e88ba82676668..a093e6163e605cd243972a4a0c54a425d94ba9d1 100644 (file)
@@ -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)
 {