[BISECTED] BeagleBone Black doesn't boot after a58147c2dbbf

Nishanth Menon nm at ti.com
Fri Aug 19 11:30:16 CEST 2022


On 11:28-20220818, Matwey V. Kornilov wrote:
> I've played a little and now I believe that the issue is that EEPROM read addr
> pointer is somehow corrupted due to 1-byte address write. The EEPROM is
> definitely have two-byte read address accoring the datasheet.
> I've failed to unravel exact rule what is happening when only one address byte
> is set, but was able to read random places of EEPROM.
> 
> 
> However, the following diff makes the board bootable.
> 
> 
> diff --git a/board/ti/common/board_detect.c b/board/ti/common/board_detect.c
> index ed34991377..26edddccc6 100644
> --- a/board/ti/common/board_detect.c
> +++ b/board/ti/common/board_detect.c
> @@ -86,7 +86,6 @@ __weak void gpi2c_init(void)
>  static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
>                                             u32 header, u32 size, uint8_t *ep)
>  {
> -       u32 hdr_read = 0xdeadbeef;
>         int rc;
> 
>  #if CONFIG_IS_ENABLED(DM_I2C)
> @@ -113,10 +112,10 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
>          * We must allow for fall through to check the data if 2 byte
>          * addressing works
>          */
> -       (void)dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
> +       rc = dm_i2c_read(dev, 0, ep, size);
> 
>         /* Corrupted data??? */
> -       if (hdr_read != header) {
> +       if (rc || (*((u32*)ep) != header)) {
>                 /*
>                  * read the eeprom header using i2c again, but use only a
>                  * 2 byte address (some newer boards need this..)
> @@ -125,16 +124,13 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
>                 if (rc)
>                         return rc;
> 
> -               rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
> +               rc = dm_i2c_read(dev, 0, ep, size);
>                 if (rc)
>                         return rc;
>         }
> -       if (hdr_read != header)
> +       if (*((u32*)ep) != header)
>                 return -1;
> 
> -       rc = dm_i2c_read(dev, 0, ep, size);
> -       if (rc)
> -               return rc;
>  #else
>         u32 byte;

This does work. I tested a few variations of boards to check this
concept out.. but anyways.. on beaglebone black (element 14 boards):

NOTE: This will improve detection times for 1 byte eeprom based boot,
since there is no retry..

However for boards with 2 byte addressing eeproms:

master branch: https://pasteboard.co/n3P8yhSq6pem.png
Time from first attempt to read eeprom to actual trigger of final eeprom
read attempt: ~4ms

With this patch: https://pasteboard.co/IVQzHwMuhc4p.png
Time from first attempt to read eeprom to actual trigger of final eeprom
read attempt: ~18ms

IMHO, 14ms penalty is'nt a bad deal for dealing with variations of
eeproms we are seeing in the wild.

You can find the data (analog+digital capture) here:
https://github.com/nmenon/data-captures/tree/main/i2c-eeprom-1byte-captures
Tool used to capture (and view): https://www.saleae.com/downloads/

Tom, Robert, folks: what do you folks think?


-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D


More information about the U-Boot mailing list