[PATCH v5 1/3] sunxi: board: extract creating a unique sid into a helper function

André Przywara andre.przywara at arm.com
Thu Jan 7 23:51:46 CET 2021


On 03/01/2021 18:36, Jernej Skrabec wrote:
> From: Andre Heider <a.heider at gmail.com>
> 
> Refactor setup_environment() so we can use the created sid for a
> Bluetooth address too.
> 
> Signed-off-by: Andre Heider <a.heider at gmail.com>
> Acked-by: Maxime Ripard <mripard at kernel.org>
> [rebased]
> Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>

Confirmed to be indeed just moving this code out and reversing the check.

Reviewed-by: Andre Przywara <andre.przywara at arm.com>

Cheers,
Andre

> ---
>  board/sunxi/board.c | 121 ++++++++++++++++++++++++--------------------
>  1 file changed, 66 insertions(+), 55 deletions(-)
> 
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 708a27ed78e9..4a29e351141b 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -789,6 +789,38 @@ static void parse_spl_header(const uint32_t spl_addr)
>  	env_set_hex("fel_scriptaddr", spl->fel_script_address);
>  }
>  
> +static bool get_unique_sid(unsigned int *sid)
> +{
> +	if (sunxi_get_sid(sid) != 0)
> +		return false;
> +
> +	if (!sid[0])
> +		return false;
> +
> +	/*
> +	 * The single words 1 - 3 of the SID have quite a few bits
> +	 * which are the same on many models, so we take a crc32
> +	 * of all 3 words, to get a more unique value.
> +	 *
> +	 * Note we only do this on newer SoCs as we cannot change
> +	 * the algorithm on older SoCs since those have been using
> +	 * fixed mac-addresses based on only using word 3 for a
> +	 * long time and changing a fixed mac-address with an
> +	 * u-boot update is not good.
> +	 */
> +#if !defined(CONFIG_MACH_SUN4I) && !defined(CONFIG_MACH_SUN5I) && \
> +    !defined(CONFIG_MACH_SUN6I) && !defined(CONFIG_MACH_SUN7I) && \
> +    !defined(CONFIG_MACH_SUN8I_A23) && !defined(CONFIG_MACH_SUN8I_A33)
> +	sid[3] = crc32(0, (unsigned char *)&sid[1], 12);
> +#endif
> +
> +	/* Ensure the NIC specific bytes of the mac are not all 0 */
> +	if ((sid[3] & 0xffffff) == 0)
> +		sid[3] |= 0x800000;
> +
> +	return true;
> +}
> +
>  /*
>   * Note this function gets called multiple times.
>   * It must not make any changes to env variables which already exist.
> @@ -799,61 +831,40 @@ static void setup_environment(const void *fdt)
>  	unsigned int sid[4];
>  	uint8_t mac_addr[6];
>  	char ethaddr[16];
> -	int i, ret;
> -
> -	ret = sunxi_get_sid(sid);
> -	if (ret == 0 && sid[0] != 0) {
> -		/*
> -		 * The single words 1 - 3 of the SID have quite a few bits
> -		 * which are the same on many models, so we take a crc32
> -		 * of all 3 words, to get a more unique value.
> -		 *
> -		 * Note we only do this on newer SoCs as we cannot change
> -		 * the algorithm on older SoCs since those have been using
> -		 * fixed mac-addresses based on only using word 3 for a
> -		 * long time and changing a fixed mac-address with an
> -		 * u-boot update is not good.
> -		 */
> -#if !defined(CONFIG_MACH_SUN4I) && !defined(CONFIG_MACH_SUN5I) && \
> -    !defined(CONFIG_MACH_SUN6I) && !defined(CONFIG_MACH_SUN7I) && \
> -    !defined(CONFIG_MACH_SUN8I_A23) && !defined(CONFIG_MACH_SUN8I_A33)
> -		sid[3] = crc32(0, (unsigned char *)&sid[1], 12);
> -#endif
> -
> -		/* Ensure the NIC specific bytes of the mac are not all 0 */
> -		if ((sid[3] & 0xffffff) == 0)
> -			sid[3] |= 0x800000;
> -
> -		for (i = 0; i < 4; i++) {
> -			sprintf(ethaddr, "ethernet%d", i);
> -			if (!fdt_get_alias(fdt, ethaddr))
> -				continue;
> -
> -			if (i == 0)
> -				strcpy(ethaddr, "ethaddr");
> -			else
> -				sprintf(ethaddr, "eth%daddr", i);
> -
> -			if (env_get(ethaddr))
> -				continue;
> -
> -			/* Non OUI / registered MAC address */
> -			mac_addr[0] = (i << 4) | 0x02;
> -			mac_addr[1] = (sid[0] >>  0) & 0xff;
> -			mac_addr[2] = (sid[3] >> 24) & 0xff;
> -			mac_addr[3] = (sid[3] >> 16) & 0xff;
> -			mac_addr[4] = (sid[3] >>  8) & 0xff;
> -			mac_addr[5] = (sid[3] >>  0) & 0xff;
> -
> -			eth_env_set_enetaddr(ethaddr, mac_addr);
> -		}
> -
> -		if (!env_get("serial#")) {
> -			snprintf(serial_string, sizeof(serial_string),
> -				"%08x%08x", sid[0], sid[3]);
> -
> -			env_set("serial#", serial_string);
> -		}
> +	int i;
> +
> +	if (!get_unique_sid(sid))
> +		return;
> +
> +	for (i = 0; i < 4; i++) {
> +		sprintf(ethaddr, "ethernet%d", i);
> +		if (!fdt_get_alias(fdt, ethaddr))
> +			continue;
> +
> +		if (i == 0)
> +			strcpy(ethaddr, "ethaddr");
> +		else
> +			sprintf(ethaddr, "eth%daddr", i);
> +
> +		if (env_get(ethaddr))
> +			continue;
> +
> +		/* Non OUI / registered MAC address */
> +		mac_addr[0] = (i << 4) | 0x02;
> +		mac_addr[1] = (sid[0] >>  0) & 0xff;
> +		mac_addr[2] = (sid[3] >> 24) & 0xff;
> +		mac_addr[3] = (sid[3] >> 16) & 0xff;
> +		mac_addr[4] = (sid[3] >>  8) & 0xff;
> +		mac_addr[5] = (sid[3] >>  0) & 0xff;
> +
> +		eth_env_set_enetaddr(ethaddr, mac_addr);
> +	}
> +
> +	if (!env_get("serial#")) {
> +		snprintf(serial_string, sizeof(serial_string),
> +			"%08x%08x", sid[0], sid[3]);
> +
> +		env_set("serial#", serial_string);
>  	}
>  }
>  
> 



More information about the U-Boot mailing list