[U-Boot] [PATCH 01/31] ti: common: board_detect: Allow settings board detection variables manually
Franklin S Cooper Jr
fcooper at ti.com
Thu Mar 2 19:52:26 UTC 2017
On 03/02/2017 01:10 PM, Felipe Balbi wrote:
>
> Hi,
>
> Franklin S Cooper Jr <fcooper at ti.com> writes:
>> From: Nishanth Menon <nm at ti.com>
>>
>> In some situations the EEPROM used for board detection may not be
>> programmed or simply programmed incorrectly. Therefore, it may be
>> necessary to "simulate" reading the contents of the EEPROM to set
>> appropriate variables used in the board detection code.
>>
>> This may also be helpful in certain boot modes where doing i2c reads
>> may be costly and the config supports running only a specific board.
>>
>> Signed-off-by: Nishanth Menon <nm at ti.com>
>> Signed-off-by: Tero Kristo <t-kristo at ti.com>
>> Signed-off-by: Keerthy <j-keerthy at ti.com>
>> Signed-off-by: Franklin S Cooper Jr. <fcooper at ti.com>
>> ---
>> board/ti/common/board_detect.c | 24 ++++++++++++++++++++++++
>> board/ti/common/board_detect.h | 17 +++++++++++++++++
>> 2 files changed, 41 insertions(+)
>>
>> diff --git a/board/ti/common/board_detect.c b/board/ti/common/board_detect.c
>> index a5dba94..5aaf884 100644
>> --- a/board/ti/common/board_detect.c
>> +++ b/board/ti/common/board_detect.c
>> @@ -116,6 +116,30 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
>> return 0;
>> }
>>
>> +int __maybe_unused ti_i2c_eeprom_am_set(const char *name, const char *rev)
>> +{
>> + struct ti_common_eeprom *ep;
>> +
>> + if (!name || !rev)
>> + return -1;
>> +
>> + ep = TI_EEPROM_DATA;
>> + if (ep->header == TI_EEPROM_HEADER_MAGIC)
>> + goto already_set;
>> +
>> + /* Set to 0 all fields */
>> + memset(ep, 0, sizeof(*ep));
>> + strncpy(ep->name, name, TI_EEPROM_HDR_NAME_LEN);
>> + strncpy(ep->version, rev, TI_EEPROM_HDR_REV_LEN);
>> + /* Some dummy serial number to identify the platform */
>> + strncpy(ep->serial, "0000", TI_EEPROM_HDR_SERIAL_LEN);
>> + /* Mark it with a valid header */
>> + ep->header = TI_EEPROM_HEADER_MAGIC;
>> +
>> +already_set:
>> + return 0;
>> +}
>> +
>> int __maybe_unused ti_i2c_eeprom_am_get(int bus_addr, int dev_addr)
>> {
>> int rc;
>> diff --git a/board/ti/common/board_detect.h b/board/ti/common/board_detect.h
>> index 343fcb4..eeeacd3 100644
>> --- a/board/ti/common/board_detect.h
>> +++ b/board/ti/common/board_detect.h
>> @@ -193,4 +193,21 @@ u64 board_ti_get_emif2_size(void);
>> */
>> void set_board_info_env(char *name);
>>
>> +/**
>> + * ti_i2c_eeprom_am_set() - Setup the eeprom data with predefined values
>> + * @name: Name of the board
>> + * @rev: Revision of the board
>> + *
>> + * In some cases such as in RTC-only mode, we are able to skip reading eeprom
>> + * and wasting i2c based initialization time by using predefined flags for
>> + * detecting what platform we are booting on. For those platforms, provide
>> + * a handy function to pre-program information.
>
> there's a micro-optimization for some cases here. You can try to read
> i2c only on first time and save the result to environment. Something
> like:
>
> if (!getenv("serial#")) {
> read_serial_from_eeprom(&serial);
> setenv("serial#", serial);
> saveenv();
> }
>
> Of course, this assumes i2c is available and eeprom is properly
> programmed. For bogus eeprom data, well, can't do much.
Atleast for the purposes I'm using it for I have to deal with non
programmed eeprom. The other usecase I've seen was wanting to avoid
touching the EEPROM at all.
>
More information about the U-Boot
mailing list