Hi,

On 8/26/21 11:42 PM, Alexandru Gagniuc wrote:
When OP-TEE is booted as the SPL payload, the stage after OP-TEE is
not guaranteed to be u-boot. Thus the FDT patching in u-boot is not
guaranteed to occur. Add this step to SPL.

The patching by stm32_fdt_setup_mac_addr() is done in SPL, and patches
the target FDT directly. This differs is different from
setup_mac_address(), which sets the "ethaddr" env variable, and does
not work in SPL.

Signed-off-by: Alexandru Gagniuc <mr.nuke...@gmail.com>
---
  arch/arm/mach-stm32mp/cpu.c                   | 22 +++++++++++++++++++
  .../arm/mach-stm32mp/include/mach/sys_proto.h |  3 +++
  arch/arm/mach-stm32mp/spl.c                   |  1 +
  3 files changed, 26 insertions(+)

diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
index 8727de513c..2b8b67bb40 100644
--- a/arch/arm/mach-stm32mp/cpu.c
+++ b/arch/arm/mach-stm32mp/cpu.c
@@ -10,6 +10,7 @@
  #include <cpu_func.h>
  #include <debug_uart.h>
  #include <env.h>
+#include <fdt_support.h>
  #include <init.h>
  #include <log.h>
  #include <lmb.h>
@@ -646,6 +647,27 @@ __weak int setup_mac_address(void)
        return 0;
  }
+int stm32_fdt_setup_mac_addr(void *fdt)
+{
+       int ret;
+       uchar enetaddr[ARP_HLEN];
+
+       ret = stm32_read_otp_mac(enetaddr);
+       if (ret < 0)
+               return ret;
+
+       if (!is_valid_ethaddr(enetaddr)) {
+               printf("invalid MAC address in OTP\n");
+               return -EINVAL;
+       }
+
+       ret = fdt_ethernet_set_macaddr(fdt, 0, enetaddr);
+       if (ret)
+               debug("Failed to set mac address from OTP: %d\n", ret);
+
+       return ret;
+}
+
  static int setup_serial_number(void)
  {
        char serial_string[25];
diff --git a/arch/arm/mach-stm32mp/include/mach/sys_proto.h 
b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
index 4149d3a133..2d24cfee3f 100644
--- a/arch/arm/mach-stm32mp/include/mach/sys_proto.h
+++ b/arch/arm/mach-stm32mp/include/mach/sys_proto.h
@@ -47,7 +47,10 @@ void get_soc_name(char name[SOC_NAME_SIZE]);
  /* return boot mode */
  u32 get_bootmode(void);
+/* Set 'ethaddr' env variable with MAC from OTP (useful for u-boot proper) */
  int setup_mac_address(void);
+/* Patch the first 'ethernet' node of FDT with MAC from OTP (useful for SPL) */
+int stm32_fdt_setup_mac_addr(void *fdt);
/* board power management : configure vddcore according OPP */
  void board_vddcore_init(u32 voltage_mv);
diff --git a/arch/arm/mach-stm32mp/spl.c b/arch/arm/mach-stm32mp/spl.c
index 405eff68a3..d9fdc5926c 100644
--- a/arch/arm/mach-stm32mp/spl.c
+++ b/arch/arm/mach-stm32mp/spl.c
@@ -181,6 +181,7 @@ void stm32_init_tzc_for_optee(void)
void spl_board_prepare_for_optee(void *fdt)
  {
+       stm32_fdt_setup_mac_addr(fdt);
        stm32_init_tzc_for_optee();
  }


I think that all this part is not required for falcon mode:

let the Linux driver fallback to nvmem access to read the MAC address in OTP when the DT is not updated by boot loader

remove also the patch 06/10 and 04/40

PS: it is already working in OpenSTLinux based on the device tree modification for your board

&bsec{
            ethernet_mac_address: mac@e4 {
            reg = <0xe4 0x6>;
};

&ethernet0 {
    nvmem-cells = <&ethernet_mac_address>;
    nvmem-cell-names = "mac-address";
};

PS: this part is not yet upstreamed in Linux

Linux reference = Documentation/devicetree/bindings/net/ethernet-controller.yaml


  nvmem-cells:
    maxItems: 1
    description:
      Reference to an nvmem node for the MAC address

  nvmem-cell-names:
    const: mac-address


Patrick





Reply via email to