On 17/10/18 10:33, Fabien Lahoudere wrote:
> From: Denis Zalevskiy <[email protected]>
> 
> 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 <[email protected]>
> Signed-off-by: Fabien Lahoudere <[email protected]>
> ---
>  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: [email protected]
=====================================================================
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to