[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