Setting MAC address from I2C EEPROM - debug / commands? (Xilinx)

Sean Anderson seanga2 at gmail.com
Wed Nov 23 04:14:31 CET 2022


On 11/22/22 20:23, David Antliff wrote:
> Hi,
> 
> I'm looking to extract the board's MAC address from serial I2C EEPROM at boot time, so
> I'm trying to work out how I can tell if U-Boot is actually able to communicate with this
> EEPROM, outside of manual i2c commands.
> 
> I have set CONFIG_ZYNQ_MAC_IN_EEPROM and CONFIG_ZYNQ_MAC_IN_EEPROM
> however I'm not completely sure that this is working with UltraScale+ Zynq MPSoC
> boards - I'm using a ZCU208. There's no log message on the U-Boot console to say
> that there was an attempt to read the MAC address, and with ethaddr unset, this
> variable is set by U-Boot to the value taken from the device tree rather than EEPROM:
> 
> ethernet at ff0e0000 {
>      ...
>      local-mac-address = [00 0a 35 00 22 01];
>      ...
> 
> I would expect it to be 00 0a 35 07 60 1c based on the contents of the EEPROM.
> 
> I would like to understand how to debug this. I read that the command "eeprom" has been
> deprecated for some time (I don't have it enabled), with some I2C serial EEPROM devices
> now supported by the "Driver Model" - aka DM.
> 
> Thus I did find:
> 
>> dm uclass
> ...
> uclass 39: i2c_eeprom
> 0     eeprom at 54 @ 7dd21420
> ...
> 
> And I'm able to communicate with the device via commands like:
> 
> ZynqMP> i2c md 54 0.2 40 200000
> 0000: 5a 43 55 32 30 38 ff ff ff ff ff ff ff ff ff ff    ZCU208..........
> 0010: ff 41 30 32 38 33 32 32 30 34 31 34 33 33 32 38    .A02832204143328
> 0020: 31 2e 33 00 0a 35 07 60 1c 00 0a 35 07 60 1d 00    1.3..5.`...5.`..
> 0030: 0a 35 07 60 1e 00 0a 35 07 60 1f 41 08 ff ff ff    .5.`...5.`.A....
> 
> The MAC address is 6 bytes starting at offset 0x23 (00 0a 35 07 60 1c).
> 
> My question is - is the 'i2c' command now the accepted and best way to interact with an
> I2C EEPROM? Or is there another command I can enable (other than "eeprom") that will
> provide a generic interface for accessing EEPROMs and prove that U-Boot can "see" this
> device?

I don't think such an API exists.

> The EEPROM device in question is an M24128.
> 
> CONFIG_SYS_I2C_EEPROM_ADDR=0x54
> CONFIG_SYS_I2C_EEPROM_BUS=6
> CONFIG_SYS_EEPROM_SIZE=16384
> CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2
> CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x23
> CONFIG_ZYNQ_MAC_IN_EEPROM=y
> 
> U-Boot 2021.01 (Xilinx fork: git://github.com/Xilinx/u-boot-xlnx.git)
> 
> P.S. if this is better directed to Xilinx or the Xilinx community then I'm happy to do that,
> but in case it's a more generic U-Boot issue I thought it best to ask here first. Please
> don't flame me for using Xilinx, I'm trying to do my best with what I'm given.
> 
> -- David.

This doesn't directly address your question, but have you tried using nvmem-cells?

You enable CONFIG_NVMEM and CONFIG_I2C_EEPROM, and modify your device tree like

i2c {
	eeprom at 54 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "atmel,24c08";
		reg = <0x54>;

		mac_address: mac-address at 23 {
			reg = <0x23 6>;
		};
	};
};

ethernet {
	nvmem-cells = <&mac_address>;
	nvmem-cell-names = "mac-address";
};

You'll need 2022.07 for this I think. This is the same method which
Linux uses. I added this specificly to be able to load MAC addresses
from EEPROMs without needing to hard code stuff into Kconfig.

--Sean


More information about the U-Boot mailing list