[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