
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.me@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>; };
ðernet0 { nvmem-cells = <ðernet_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