[PATCH] board: ti: common: board_detect: Fix EEPROM read quirk
Nishanth Menon
nm at ti.com
Wed Aug 24 07:09:21 CEST 2022
On 19:05-20220823, Matwey V. Kornilov wrote:
> There are three different kinds of EEPROM possibly present on boards.
> 1. 1byte address. For those we should avoid 2byte address in order
> not to rewrite the data. Second byte of the address can potentially
> be interpreted as the data to write.
> 2. 2byte address with defined behaviour. When we try to use 1byte
> address they just return "FF FF FF FF ... FF"
> 3. 2byte address with undefined behaviour (for instance, 24LC32AI).
> When we try to use 1byte address, then their internal read
> pointer is changed to some value. Subsequential reads may be
> broken.
>
> To gracefully handle both case #1 and case #3 we read all required
> data from EEPROM at once (about 80 bytes). So either all the data is
> valid or we fallback to 2byte address.
I would suggest to add a note that this was measured as adding extra
time in startup time.
With that:
Acked-by: Nishanth Menon <nm at ti.com>
>
> Cc: Nishanth Menon <nm at ti.com>
> Fixes: a58147c2dbbf ("board: ti: common: board_detect: Do 1byte address checks first.")
> Reference: https://lore.kernel.org/all/CAJs94Ebdd4foOjhGFu9Bop0v=B1US9neDLxfhgcY23ukgLzFOQ@mail.gmail.com/
> Signed-off-by: Matwey V. Kornilov <matwey.kornilov at gmail.com>
> ---
> board/ti/common/board_detect.c | 26 ++++++++------------------
> 1 file changed, 8 insertions(+), 18 deletions(-)
>
> diff --git a/board/ti/common/board_detect.c b/board/ti/common/board_detect.c
> index ed34991377..fdf83fcfb0 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);
> + (void)dm_i2c_read(dev, 0, ep, size);
>
> /* Corrupted data??? */
> - if (hdr_read != header) {
> + if (*((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,12 @@ 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;
>
> @@ -154,26 +149,21 @@ 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)i2c_read(dev_addr, 0x0, byte, (uint8_t *)&hdr_read, 4);
> + (void)i2c_read(dev_addr, 0x0, byte, ep, size);
>
> /* Corrupted data??? */
> - if (hdr_read != header) {
> + if (*((u32 *)ep) != header) {
> /*
> * read the eeprom header using i2c again, but use only a
> * 2 byte address (some newer boards need this..)
> */
> byte = 2;
> - rc = i2c_read(dev_addr, 0x0, byte, (uint8_t *)&hdr_read,
> - 4);
> + rc = i2c_read(dev_addr, 0x0, byte, ep, size);
> if (rc)
> return rc;
> }
> - if (hdr_read != header)
> + if (*((u32 *)ep) != header)
> return -1;
> -
> - rc = i2c_read(dev_addr, 0x0, byte, ep, size);
> - if (rc)
> - return rc;
> #endif
> return 0;
> }
> --
> 2.26.2
>
--
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D
More information about the U-Boot
mailing list