[U-Boot] [PATCH 01/31] ti: common: board_detect: Allow settings board detection variables manually

Felipe Balbi felipe.balbi at linux.intel.com
Thu Mar 2 19:10:32 UTC 2017


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.

-- 
balbi


More information about the U-Boot mailing list