[PATCH 07/10] stm32mp1: spl: Configure MAC address when booting OP-TEE

Patrick DELAUNAY patrick.delaunay at foss.st.com
Tue Aug 31 19:10:19 CEST 2021


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 at 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 at 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







More information about the U-Boot mailing list