From: Denis Zalevskiy <denis.zalevs...@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.zalevs...@ge.com>
Signed-off-by: Sebastian Reichel <sebastian.reic...@collabora.co.uk>
---
 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   | 44 +++++++--------------------------
 4 files changed, 65 insertions(+), 80 deletions(-)

diff --git a/board/ge/bx50v3/bx50v3.c b/board/ge/bx50v3/bx50v3.c
index c703aca7cab3..917baaea7129 100644
--- a/board/ge/bx50v3/bx50v3.c
+++ b/board/ge/bx50v3/bx50v3.c
@@ -34,8 +34,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;
 
@@ -553,6 +551,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];
@@ -562,11 +561,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];
@@ -590,6 +587,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");
@@ -615,35 +617,6 @@ static void process_vpd(struct vpd_cache *vpd)
                eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2);
 }
 
-static int read_vpd()
-{
-       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();
@@ -706,9 +679,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 7367427993b3..60f81342f9bc 100644
--- a/board/ge/common/vpd_reader.c
+++ b/board/ge/common/vpd_reader.c
@@ -6,6 +6,7 @@
 
 #include "vpd_reader.h"
 
+#include <i2c.h>
 #include <linux/bch.h>
 #include <stdlib.h>
 
@@ -106,9 +107,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;
@@ -195,3 +196,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 4abba8f5de72..f5e90dbf6629 100644
--- a/board/ge/common/vpd_reader.h
+++ b/board/ge/common/vpd_reader.h
@@ -6,12 +6,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 47f6e9649cbe..e196bc118a76 100644
--- a/board/ge/mx53ppd/mx53ppd.c
+++ b/board/ge/mx53ppd/mx53ppd.c
@@ -291,11 +291,9 @@ struct vpd_cache {
 /*
  * Extracts MAC and product information from the VPD.
  */
-static int vpd_callback(void *userdata, u8 id, u8 version, u8 type, size_t 
size,
-                       u8 const *data)
+static int vpd_callback(struct vpd_cache *vpd, u8 id, u8 version, u8 type,
+                                               size_t size, const u8 *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];
@@ -322,36 +320,6 @@ static void process_vpd(struct vpd_cache *vpd)
                eth_env_set_enetaddr("ethaddr", vpd->mac1);
 }
 
-static int read_vpd()
-{
-       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;
@@ -384,8 +352,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);
+       if (!res)
+               process_vpd(&vpd);
+       else
+               printf("Can't read VPD");
 
        res = clock_1GHz();
        if (res != 0)
-- 
2.18.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to