[PATCH 2/3] ARM: board: meson: update efuse MAC reading code
neil.armstrong at linaro.org
neil.armstrong at linaro.org
Mon Mar 18 01:48:43 PDT 2024
Hi,
On 16/03/2024 14:54, Christian Hewitt wrote:
> Current code used for reading the factory programmed MAC from efuse on
> p200 boards does not appear to work resulting in a random MAC being
> generated. Update the p200 board data reusing the function from the VIM3
> source.
I'm pretty sure this code works on the Odroid-C2, but hardkernel had a custom
way to store the mac address so perhaps you should move this code to an odroid-c2
board file first ?
Or try both methods ? if first method doesn't give a valid mac address
try the ASCII format.
Neil
>
> Signed-off-by: Christian Hewitt <christianshewitt at gmail.com>
> ---
> board/amlogic/p200/p200.c | 35 +++++++++++++++++++++--------------
> 1 file changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/board/amlogic/p200/p200.c b/board/amlogic/p200/p200.c
> index 7c432f9d281..fb07eefa532 100644
> --- a/board/amlogic/p200/p200.c
> +++ b/board/amlogic/p200/p200.c
> @@ -14,29 +14,36 @@
> #include <asm/arch/eth.h>
> #include <asm/arch/mem.h>
>
> -#define EFUSE_SN_OFFSET 20
> -#define EFUSE_SN_SIZE 16
> -#define EFUSE_MAC_OFFSET 52
> -#define EFUSE_MAC_SIZE 6
> +#define EFUSE_MAC_OFFSET 0
> +#define EFUSE_MAC_SIZE 12
> +#define MAC_ADDR_LEN 6
>
> int misc_init_r(void)
> {
> - u8 mac_addr[EFUSE_MAC_SIZE];
> - char serial[EFUSE_SN_SIZE];
> + u8 mac_addr[MAC_ADDR_LEN];
> + char efuse_mac_addr[EFUSE_MAC_SIZE], tmp[3];
> ssize_t len;
>
> if (!eth_env_get_enetaddr("ethaddr", mac_addr)) {
> len = meson_sm_read_efuse(EFUSE_MAC_OFFSET,
> - mac_addr, EFUSE_MAC_SIZE);
> - if (len == EFUSE_MAC_SIZE && is_valid_ethaddr(mac_addr))
> + efuse_mac_addr, EFUSE_MAC_SIZE);
> + if (len != EFUSE_MAC_SIZE)
> + return 0;
> +
> + /* MAC is stored in ASCII format, 1bytes = 2characters */
> + for (int i = 0; i < 6; i++) {
> + tmp[0] = efuse_mac_addr[i * 2];
> + tmp[1] = efuse_mac_addr[i * 2 + 1];
> + tmp[2] = '\0';
> + mac_addr[i] = simple_strtoul(tmp, NULL, 16);
> + }
> +
> + if (is_valid_ethaddr(mac_addr))
> eth_env_set_enetaddr("ethaddr", mac_addr);
> - }
> + else
> + meson_generate_serial_ethaddr();
>
> - if (!env_get("serial#")) {
> - len = meson_sm_read_efuse(EFUSE_SN_OFFSET, serial,
> - EFUSE_SN_SIZE);
> - if (len == EFUSE_SN_SIZE)
> - env_set("serial#", serial);
> + eth_env_get_enetaddr("ethaddr", mac_addr);
> }
>
> return 0;
More information about the linux-amlogic
mailing list