board: ge: Move VPD reading to the vpd_reader
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@ge.com> Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.com>
This commit is contained in:
parent
4c55208350
commit
4dcbccf794
@ -33,8 +33,6 @@
|
|||||||
#include "../../../drivers/net/e1000.h"
|
#include "../../../drivers/net/e1000.h"
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
struct vpd_cache;
|
|
||||||
|
|
||||||
static int confidx = 3; /* Default to b850v3. */
|
static int confidx = 3; /* Default to b850v3. */
|
||||||
static struct vpd_cache vpd;
|
static struct vpd_cache vpd;
|
||||||
|
|
||||||
@ -560,6 +558,7 @@ int overwrite_console(void)
|
|||||||
#define VPD_MAC_ADDRESS_LENGTH 6
|
#define VPD_MAC_ADDRESS_LENGTH 6
|
||||||
|
|
||||||
struct vpd_cache {
|
struct vpd_cache {
|
||||||
|
bool is_read;
|
||||||
u8 product_id;
|
u8 product_id;
|
||||||
u8 has;
|
u8 has;
|
||||||
unsigned char mac1[VPD_MAC_ADDRESS_LENGTH];
|
unsigned char mac1[VPD_MAC_ADDRESS_LENGTH];
|
||||||
@ -569,11 +568,9 @@ struct vpd_cache {
|
|||||||
/*
|
/*
|
||||||
* Extracts MAC and product information from the VPD.
|
* 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)
|
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 &&
|
if (id == VPD_BLOCK_HWID && version == 1 && type != VPD_TYPE_INVALID &&
|
||||||
size >= 1) {
|
size >= 1) {
|
||||||
vpd->product_id = data[0];
|
vpd->product_id = data[0];
|
||||||
@ -597,6 +594,11 @@ static void process_vpd(struct vpd_cache *vpd)
|
|||||||
int fec_index = -1;
|
int fec_index = -1;
|
||||||
int i210_index = -1;
|
int i210_index = -1;
|
||||||
|
|
||||||
|
if (!vpd->is_read) {
|
||||||
|
printf("VPD wasn't read");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (vpd->product_id) {
|
switch (vpd->product_id) {
|
||||||
case VPD_PRODUCT_B450:
|
case VPD_PRODUCT_B450:
|
||||||
env_set("confidx", "1");
|
env_set("confidx", "1");
|
||||||
@ -622,35 +624,6 @@ static void process_vpd(struct vpd_cache *vpd)
|
|||||||
eth_env_set_enetaddr_by_index("eth", i210_index, vpd->mac2);
|
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)
|
int board_eth_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
setup_iomux_enet();
|
setup_iomux_enet();
|
||||||
@ -709,9 +682,10 @@ int board_init(void)
|
|||||||
setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
|
setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
|
||||||
setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
|
setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
|
||||||
|
|
||||||
read_vpd();
|
if (!read_vpd(&vpd, vpd_callback)) {
|
||||||
|
vpd.is_read = true;
|
||||||
set_confidx(&vpd);
|
set_confidx(&vpd);
|
||||||
|
}
|
||||||
|
|
||||||
gpio_direction_output(SUS_S3_OUT, 1);
|
gpio_direction_output(SUS_S3_OUT, 1);
|
||||||
gpio_direction_output(WIFI_EN, 1);
|
gpio_direction_output(WIFI_EN, 1);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "vpd_reader.h"
|
#include "vpd_reader.h"
|
||||||
|
|
||||||
|
#include <i2c.h>
|
||||||
#include <linux/bch.h>
|
#include <linux/bch.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@ -105,9 +106,9 @@ static const size_t HEADER_BLOCK_ECC_LEN = 4;
|
|||||||
|
|
||||||
static const u8 ECC_BLOCK_ID = 0xFF;
|
static const u8 ECC_BLOCK_ID = 0xFF;
|
||||||
|
|
||||||
int vpd_reader(size_t size, u8 *data, void *userdata,
|
static int vpd_reader(size_t size, u8 *data, struct vpd_cache *userdata,
|
||||||
int (*fn)(void *userdata, u8 id, u8 version, u8 type,
|
int (*fn)(struct vpd_cache *, u8 id, u8 version, u8 type,
|
||||||
size_t size, u8 const *data))
|
size_t size, u8 const *data))
|
||||||
{
|
{
|
||||||
if (size < HEADER_BLOCK_LEN || !data || !fn)
|
if (size < HEADER_BLOCK_LEN || !data || !fn)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -194,3 +195,33 @@ int vpd_reader(size_t size, u8 *data, void *userdata,
|
|||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
@ -5,12 +5,18 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
struct vpd_cache;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read VPD from given data, verify content, and call callback
|
* Read VPD from given data, verify content, call callback for each vital
|
||||||
* for each vital product data block.
|
* 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.
|
* Returns Non-zero on error. Negative numbers encode errno.
|
||||||
*/
|
*/
|
||||||
int vpd_reader(size_t size, u8 *data, void *userdata,
|
int read_vpd(struct vpd_cache *cache,
|
||||||
int (*fn)(void *userdata, u8 id, u8 version, u8 type,
|
int (*process_block)(struct vpd_cache *,
|
||||||
size_t size, u8 const *data));
|
u8 id, u8 version, u8 type,
|
||||||
|
size_t size, u8 const *data));
|
||||||
|
@ -321,36 +321,6 @@ static void process_vpd(struct vpd_cache *vpd)
|
|||||||
eth_env_set_enetaddr("ethaddr", vpd->mac1);
|
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)
|
int board_init(void)
|
||||||
{
|
{
|
||||||
gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
|
gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
|
||||||
@ -383,8 +353,14 @@ int misc_init_r(void)
|
|||||||
int board_late_init(void)
|
int board_late_init(void)
|
||||||
{
|
{
|
||||||
int res;
|
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();
|
res = clock_1GHz();
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user