
On 11/23/22 Sean Anderson wrote:
On 11/22/22 20:23, David Antliff wrote:
> 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@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@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).
[snip]
> 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)
[snip]
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@54 { #address-cells = <1>; #size-cells = <1>; compatible = "atmel,24c08"; reg = <0x54>; mac_address: mac-address@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.
Hi Sean,
Apologies for bringing this thread back to life more than 6 months later, but I'm not quite getting this to work.
I have finally had the opportunity to upgrade to U-Boot 2023.1, and the first thing I noticed was that the old way of retrieving the MAC address from the EEPROM fails, as is expected as I understand that support was removed sometime after 2021.
So I took up your suggestion, enabled CONFIG_NVMEM & CONFIG_I2C_EEPROM, and with some trial and error I have got as far as added the following to my device tree:
axi { i2c@ff030000 { i2c-mux@74 { i2c@0 { eeprom@54 { mac_address: mac-address@23 { reg = <0x23 6>; }; }; }; }; };
ethernet@ff0e0000 { nvmem-cells = <&mac_address>; nvmem-cell-names = "mac-address"; }; };
(This is part of a user .dtsi so it's added by Yocto to the existing DT provided by the vendor's board definition).
The tree builds OK and I can view the correct nodes from U-Boot / fdt command.
From a little debugging, I see that the call in eth-uclass.c around line 515 returns a null pointer:
p = dev_read_u8_array_ptr(dev, "mac-address", ARP_HLEN);
And this results in U-Boot assigning the FF:FF:FF:FF:FF:FF address instead.
Yet, if I boot Linux, this device now appears in sysfs as /sys/bus/nvmem/devices/6-00544/nvmem, and I can read/write to it, so something is working. Linux ends up with the wrong MAC though (76:1b:db:1f:78:12, and I'm not sure where that comes from).
I think I have the right Ethernet device, as U-Boot reports:
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr 12, interface rgmii-id
Do you have any thoughts as to why U-Boot is not picking up the MAC address from the EEPROM, in this case, please?
The full sections of the relevant parts of the DT now look like this:
axi {
/* .... */
i2c@ff030000 { power-domains = <0x11 0x26>; pinctrl-names = "default\0gpio"; #address-cells = <0x01>; pinctrl-0 = <0x1a>; interrupts = <0x00 0x12 0x04>; clocks = <0x04 0x3e>; #size-cells = <0x00>; interrupt-parent = <0x05>; clock-frequency = <0x61a80>; compatible = "cdns,i2c-r1p14"; pinctrl-1 = <0x1b>; status = "okay"; reg = <0x00 0xff030000 0x00 0x1000>; phandle = <0x6c>; scl-gpios = <0x19 0x10 0x00>; sda-gpios = <0x19 0x11 0x00>;
i2c-mux@74 { #address-cells = <0x01>; i2c-mux-idle-disconnect; #size-cells = <0x00>; compatible = "nxp,pca9548"; reg = <0x74>;
i2c@0 { #address-cells = <0x01>; #size-cells = <0x00>; reg = <0x00>; phandle = <0x6d>;
eeprom@54 { compatible = "atmel,24c128"; reg = <0x54>; phandle = <0x36>;
mac-address@23 { reg = <0x23 0x06>; phandle = <0x15>; }; }; };
/* ... */
ethernet@ff0e0000 { power-domains = <0x11 0x20>; iommus = <0x12 0x877>; #address-cells = <0x01>; phy-mode = "rgmii-id"; nvmem-cells = <0x15>; clock-names = "pclk\0hclk\0tx_clk\0rx_clk\0tsu_clk"; local-mac-address = [76 1b db 1f 78 12]; resets = <0x13 0x20>; interrupts = <0x00 0x3f 0x04 0x00 0x3f 0x04>; clocks = <0x04 0x1f 0x04 0x6b 0x04 0x30 0x04 0x34 0x04 0x2c>; #size-cells = <0x00>; interrupt-parent = <0x05>; compatible = "xlnx,zynqmp-gem\0cdns,gem"; status = "okay"; nvmem-cell-names = "mac-address"; reg = <0x00 0xff0e0000 0x00 0x1000>; phandle = <0x67>; phy-handle = <0x14>; reset-names = "gem3_rst"; xlnx,ptp-enet-clock = <0x00>;
mdio { #address-cells = <0x01>; #size-cells = <0x00>; phandle = <0x68>;
ethernet-phy@c { ti,dp83867-rxctrl-strap-quirk; ti,tx-internal-delay = <0x0a>; #phy-cells = <0x01>; reset-gpios = <0x16 0x06 0x01>; compatible = "ethernet-phy-id2000.a231"; ti,fifo-depth = <0x01>; ti,rx-internal-delay = <0x08>; reg = <0x0c>; phandle = <0x14>; }; }; };
The full tree is here: https://pastebin.com/WQKBxK7x
I feel like I'm close, but must be missing something.
-- David.