[U-Boot] [PATCH V3 5/6] board: ge: Move VPD reading to the vpd_reader

Stefano Babic sbabic at denx.de
Sat Dec 8 17:30:09 UTC 2018



On 17/10/18 10:33, Fabien Lahoudere wrote:
> From: Denis Zalevskiy <denis.zalevskiy at ge.com>
> 
> Merge functionality duplicated in bx50v3 and mx53ppd: the logic
> is the same except that process_vpd is called at different phases.
> Also read_vpd could end up in error, so there is no VPD data in this
> case - it shouldn't be processed.
> 
> Signed-off-by: Denis Zalevskiy <denis.zalevskiy at ge.com>
> Signed-off-by: Fabien Lahoudere <fabien.lahoudere at collabora.com>
> ---
>  board/ge/bx50v3/bx50v3.c     | 48 ++++++++++----------------------------------
>  board/ge/common/vpd_reader.c | 37 +++++++++++++++++++++++++++++++---
>  board/ge/common/vpd_reader.h | 16 ++++++++++-----
>  board/ge/mx53ppd/mx53ppd.c   | 38 +++++++----------------------------
>  4 files changed, 63 insertions(+), 76 deletions(-)
> 
> diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
> index ca500f5..78e7ee6 100644
> --- a/board/ge/bx50v3/bx50v3.c
> +++ b/board/ge/bx50v3/bx50v3.c
> @@ -33,8 +33,6 @@
>  #include "../../../drivers/net/e1000.h"
>  DECLARE_GLOBAL_DATA_PTR;
>  
> -struct vpd_cache;
> -
>  static int confidx = 3;  /* Default to b850v3. */
>  static struct vpd_cache vpd;
>  
> @@ -552,6 +550,7 @@ int overwrite_console(void)
>  #define VPD_MAC_ADDRESS_LENGTH 6
>  
>  struct vpd_cache {
> +	bool is_read;
>  	u8 product_id;
>  	u8 has;
>  	unsigned char mac1[VPD_MAC_ADDRESS_LENGTH];
> @@ -561,11 +560,9 @@ struct vpd_cache {
>  /*
>   * Extracts MAC and product information from the VPD.
>   */
> -static int vpd_callback(void *userdata, u8 id, u8 version, u8 type,
> +static int vpd_callback(struct vpd_cache *vpd, u8 id, u8 version, u8 type,
>  			size_t size, u8 const *data)
>  {
> -	struct vpd_cache *vpd = (struct vpd_cache *)userdata;
> -
>  	if (id == VPD_BLOCK_HWID && version == 1 && type != VPD_TYPE_INVALID &&
>  	    size >= 1) {
>  		vpd->product_id = data[0];
> @@ -589,6 +586,11 @@ static void process_vpd(struct vpd_cache *vpd)
>  	int fec_index = -1;
>  	int i210_index = -1;
>  
> +	if (!vpd->is_read) {
> +		printf("VPD wasn't read");
> +		return;
> +	}
> +
>  	switch (vpd->product_id) {
>  	case VPD_PRODUCT_B450:
>  		env_set("confidx", "1");
> @@ -614,35 +616,6 @@ static void process_vpd(struct vpd_cache *vpd)
>  		eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2);
>  }
>  
> -static int read_vpd(void)
> -{
> -	int res;
> -	static const int size = CONFIG_SYS_VPD_EEPROM_SIZE;
> -	uint8_t *data;
> -	unsigned int current_i2c_bus = i2c_get_bus_num();
> -
> -	res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS);
> -	if (res < 0)
> -		return res;
> -
> -	data = (uint8_t *)malloc(size);
> -	if (!data)
> -		return -ENOMEM;
> -
> -	res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0,
> -		       CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size);
> -
> -	if (res == 0) {
> -		memset(&vpd, 0, sizeof(vpd));
> -		vpd_reader(size, data, &vpd, vpd_callback);
> -	}
> -
> -	free(data);
> -
> -	i2c_set_bus_num(current_i2c_bus);
> -	return res;
> -}
> -
>  int board_eth_init(bd_t *bis)
>  {
>  	setup_iomux_enet();
> @@ -705,9 +678,10 @@ int board_init(void)
>  	setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
>  	setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
>  
> -	read_vpd();
> -
> -	set_confidx(&vpd);
> +	if (!read_vpd(&vpd, vpd_callback)) {
> +		vpd.is_read = true;
> +		set_confidx(&vpd);
> +	}
>  
>  	gpio_direction_output(SUS_S3_OUT, 1);
>  	gpio_direction_output(WIFI_EN, 1);
> diff --git a/board/ge/common/vpd_reader.c b/board/ge/common/vpd_reader.c
> index c471583..12410d9 100644
> --- a/board/ge/common/vpd_reader.c
> +++ b/board/ge/common/vpd_reader.c
> @@ -5,6 +5,7 @@
>  
>  #include "vpd_reader.h"
>  
> +#include <i2c.h>
>  #include <linux/bch.h>
>  #include <stdlib.h>
>  
> @@ -105,9 +106,9 @@ static const size_t HEADER_BLOCK_ECC_LEN = 4;
>  
>  static const u8 ECC_BLOCK_ID = 0xFF;
>  
> -int vpd_reader(size_t size, u8 *data, void *userdata,
> -	       int (*fn)(void *userdata, u8 id, u8 version, u8 type,
> -			 size_t size, u8 const *data))
> +static int vpd_reader(size_t size, u8 *data, struct vpd_cache *userdata,
> +		      int (*fn)(struct vpd_cache *, u8 id, u8 version, u8 type,
> +				size_t size, u8 const *data))
>  {
>  	if (size < HEADER_BLOCK_LEN || !data || !fn)
>  		return -EINVAL;
> @@ -194,3 +195,33 @@ int vpd_reader(size_t size, u8 *data, void *userdata,
>  			return ret;
>  	}
>  }
> +
> +int read_vpd(struct vpd_cache *cache,
> +	     int (*process_block)(struct vpd_cache *, u8 id, u8 version,
> +				  u8 type, size_t size, u8 const *data))
> +{
> +	static const size_t size = CONFIG_SYS_VPD_EEPROM_SIZE;
> +
> +	int res;
> +	u8 *data;
> +	unsigned int current_i2c_bus = i2c_get_bus_num();
> +
> +	res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS);
> +	if (res < 0)
> +		return res;
> +
> +	data = malloc(size);
> +	if (!data)
> +		return -ENOMEM;
> +
> +	res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0,
> +		       CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN,
> +		       data, size);
> +	if (res == 0)
> +		res = vpd_reader(size, data, cache, process_block);
> +
> +	free(data);
> +
> +	i2c_set_bus_num(current_i2c_bus);
> +	return res;
> +}
> diff --git a/board/ge/common/vpd_reader.h b/board/ge/common/vpd_reader.h
> index e60acf3..3045b7e 100644
> --- a/board/ge/common/vpd_reader.h
> +++ b/board/ge/common/vpd_reader.h
> @@ -5,12 +5,18 @@
>  
>  #include "common.h"
>  
> +struct vpd_cache;
> +
>  /*
> - * Read VPD from given data, verify content, and call callback
> - * for each vital product data block.
> + * Read VPD from given data, verify content, call callback for each vital
> + * product data block.
> + *
> + * cache: structure used by process block to store VPD information
> + * process_block: callback called for each VPD data block
>   *
>   * Returns Non-zero on error.  Negative numbers encode errno.
>   */
> -int vpd_reader(size_t size, u8 *data, void *userdata,
> -	       int (*fn)(void *userdata, u8 id, u8 version, u8 type,
> -			 size_t size, u8 const *data));
> +int read_vpd(struct vpd_cache *cache,
> +	     int (*process_block)(struct vpd_cache *,
> +				  u8 id, u8 version, u8 type,
> +				  size_t size, u8 const *data));
> diff --git a/board/ge/mx53ppd/mx53ppd.c b/board/ge/mx53ppd/mx53ppd.c
> index 3fa53ff..f0c8abf 100644
> --- a/board/ge/mx53ppd/mx53ppd.c
> +++ b/board/ge/mx53ppd/mx53ppd.c
> @@ -321,36 +321,6 @@ static void process_vpd(struct vpd_cache *vpd)
>  		eth_env_set_enetaddr("ethaddr", vpd->mac1);
>  }
>  
> -static int read_vpd(void)
> -{
> -	struct vpd_cache vpd;
> -	int res;
> -	static const int size = CONFIG_SYS_VPD_EEPROM_SIZE;
> -	u8 *data;
> -	unsigned int current_i2c_bus = i2c_get_bus_num();
> -
> -	res = i2c_set_bus_num(CONFIG_SYS_VPD_EEPROM_I2C_BUS);
> -	if (res < 0)
> -		return res;
> -
> -	data = malloc(size);
> -	if (!data)
> -		return -ENOMEM;
> -
> -	res = i2c_read(CONFIG_SYS_VPD_EEPROM_I2C_ADDR, 0,
> -		       CONFIG_SYS_VPD_EEPROM_I2C_ADDR_LEN, data, size);
> -	if (res == 0) {
> -		memset(&vpd, 0, sizeof(vpd));
> -		vpd_reader(size, data, &vpd, vpd_callback);
> -		process_vpd(&vpd);
> -	}
> -
> -	free(data);
> -
> -	i2c_set_bus_num(current_i2c_bus);
> -	return res;
> -}
> -
>  int board_init(void)
>  {
>  	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
> @@ -383,8 +353,14 @@ int misc_init_r(void)
>  int board_late_init(void)
>  {
>  	int res;
> +	struct vpd_cache vpd;
>  
> -	read_vpd();
> +	memset(&vpd, 0, sizeof(vpd));
> +	res = read_vpd(&vpd, vpd_callback);

I applied your patch, but this generates a warning. Please send a follow
up patch to fix it.

+  res = read_vpd(&vpd, vpd_callback);
+                       ^~~~~~~~~~~~
+In file included from board/ge/mx53ppd/mx53ppd.c:37:0:
+board/ge/mx53ppd/../../ge/common/vpd_reader.h:19:5: note: expected ?int
(*)(struct vpd_cache *, u8,  u8,  u8,  size_t,  const u8 *) {aka int
(*)(struct vpd_cache *, unsigned char,  unsigned char,  unsigned char,
unsigned int,  const unsigned char *)}? but argument is of type ?int
(*)(void *, u8,  u8,  u8,  size_t,  const u8 *) {aka int (*)(void *,
unsigned char,  unsigned char,  unsigned char,  unsigned int,  const
unsigned char *)}?
+ int read_vpd(struct vpd_cache *cache,

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list