From: Josep Orga Date: Thu, 7 Sep 2023 12:20:22 +0000 (+0200) Subject: imx8mp-somdevices: Read MAC from EEPROM and save it in ethaddr environment variable. X-Git-Tag: rel_imx_5.10.35_2.0.0-somdevices.2~10 X-Git-Url: https://git.somdevices.com/?a=commitdiff_plain;h=1d80903f5a1d63a33047ed1ec54c781886498984;p=u-boot.git imx8mp-somdevices: Read MAC from EEPROM and save it in ethaddr environment variable. Signed-off-by: Josep Orga --- diff --git a/arch/arm/dts/imx8mp-somdevices.dts b/arch/arm/dts/imx8mp-somdevices.dts index b2545f2c61..bebf28ad94 100644 --- a/arch/arm/dts/imx8mp-somdevices.dts +++ b/arch/arm/dts/imx8mp-somdevices.dts @@ -227,6 +227,11 @@ }; }; }; + + eeprom@50 { + compatible = "microchip,24c02"; + reg = <0x50>; + }; }; &i2c2 { diff --git a/board/somdevices/imx8mp_somdevices/imx8mp_somdevices.c b/board/somdevices/imx8mp_somdevices/imx8mp_somdevices.c index fb5826a8c0..dd9aff6659 100644 --- a/board/somdevices/imx8mp_somdevices/imx8mp_somdevices.c +++ b/board/somdevices/imx8mp_somdevices/imx8mp_somdevices.c @@ -34,6 +34,10 @@ DECLARE_GLOBAL_DATA_PTR; #define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1) #define WDOG_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE) +#define EEPROM_BUS_NUM 0 +#define EEPROM_ADDR 0x50 +#define EEPROM_ADDR_LEN 1 +#define EEPROM_OFFSET 0xFA static iomux_v3_cfg_t const uart_pads[] = { MX8MP_PAD_UART2_RXD__UART2_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL), @@ -52,6 +56,67 @@ static void setup_gpmi_nand(void) } #endif +int set_mac_eeprom(void) +{ + struct udevice *dev; + u8 buf[6]; + int ret; + /* If ethaddr variable is not set in environment */ + char ethaddr[18]; + char *ethaddr_env; + + /* Configure EEPROM: 7bit address 0x50 */ + ret = i2c_get_chip_for_busnum(EEPROM_BUS_NUM, EEPROM_ADDR, EEPROM_ADDR_LEN, &dev); + if (ret) { + printf("Cannot find EEPROM for MAC: %d\n", ret); + return 0; + } + /* Reading from EEPROM */ + if (dm_i2c_read(dev, EEPROM_OFFSET, (u8 *)&buf, sizeof(buf)) < 0) { + printf("i2c EEPROM for MAC read failed\n"); + return 0; + } + sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", + buf[0], + buf[1], + buf[2], + buf[3], + buf[4], + buf[5]); + ethaddr_env = env_get("ethaddr"); + if (!ethaddr_env) { + printf("Setting MAC from EEPROM\n"); + /* Set ethaddr variable for ethernet */ + env_set("ethaddr", ethaddr); + sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", + 0x00, + 0xaa, + buf[2], + buf[3], + buf[4], + buf[5]); + /* Set eth1addr variable for second ethernet */ + env_set("eth1addr", ethaddr); + env_save(); + } else { + if (strcmp(ethaddr_env, ethaddr)) { + /* Set ethaddr variable for ethernet */ + env_set("ethaddr", ethaddr); + sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", + 0x00, + 0xaa, + buf[2], + buf[3], + buf[4], + buf[5]); + /* Set eth1addr variable for second ethernet */ + env_set("eth1addr", ethaddr); + env_save(); + } + } + return 0; +} + int board_early_init_f(void) { struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR; @@ -486,7 +551,7 @@ int board_late_init(void) env_set("board_name", "SOMDEVICES"); env_set("board_rev", "iMX8MP"); #endif - + set_mac_eeprom(); return 0; }