board: ti: j721s2: Add support to detect daughtercards
Add support to detect daughtercards (GESI Ethernet card) in-order to set the MAC address of the main CPSW2G interface. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com>
This commit is contained in:
parent
bd52f45208
commit
7bf341ae4d
1 changed files with 130 additions and 0 deletions
|
@ -153,6 +153,135 @@ static void setup_serial(void)
|
|||
snprintf(serial_string, sizeof(serial_string), "%016lx", board_serial);
|
||||
env_set("serial#", serial_string);
|
||||
}
|
||||
|
||||
/*
|
||||
* Declaration of daughtercards to probe. Note that when adding more
|
||||
* cards they should be grouped by the 'i2c_addr' field to allow for a
|
||||
* more efficient probing process.
|
||||
*/
|
||||
static const struct {
|
||||
u8 i2c_addr; /* I2C address of card EEPROM */
|
||||
char *card_name; /* EEPROM-programmed card name */
|
||||
char *dtbo_name; /* Device tree overlay to apply */
|
||||
u8 eth_offset; /* ethXaddr MAC address index offset */
|
||||
} ext_cards[] = {
|
||||
{
|
||||
0x52,
|
||||
"J7X-GESI-EXP",
|
||||
"k3-j721s2-gesi-exp-board.dtbo",
|
||||
1, /* Start populating from eth1addr */
|
||||
},
|
||||
};
|
||||
|
||||
#define DAUGHTER_CARD_NO_OF_MAC_ADDR 5
|
||||
static bool daughter_card_detect_flags[ARRAY_SIZE(ext_cards)];
|
||||
|
||||
static int probe_daughtercards(void)
|
||||
{
|
||||
char mac_addr[DAUGHTER_CARD_NO_OF_MAC_ADDR][TI_EEPROM_HDR_ETH_ALEN];
|
||||
bool eeprom_read_success;
|
||||
struct ti_am6_eeprom ep;
|
||||
u8 previous_i2c_addr;
|
||||
u8 mac_addr_cnt;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
/* Mark previous I2C address variable as not populated */
|
||||
previous_i2c_addr = 0xff;
|
||||
|
||||
/* No EEPROM data was read yet */
|
||||
eeprom_read_success = false;
|
||||
|
||||
/* Iterate through list of daughtercards */
|
||||
for (i = 0; i < ARRAY_SIZE(ext_cards); i++) {
|
||||
/* Obtain card-specific I2C address */
|
||||
u8 i2c_addr = ext_cards[i].i2c_addr;
|
||||
|
||||
/* Read card EEPROM if not already read previously */
|
||||
if (i2c_addr != previous_i2c_addr) {
|
||||
/* Store I2C address so we can avoid reading twice */
|
||||
previous_i2c_addr = i2c_addr;
|
||||
|
||||
/* Get and parse the daughter card EEPROM record */
|
||||
ret = ti_i2c_eeprom_am6_get(CONFIG_EEPROM_BUS_ADDRESS,
|
||||
i2c_addr,
|
||||
&ep,
|
||||
(char **)mac_addr,
|
||||
DAUGHTER_CARD_NO_OF_MAC_ADDR,
|
||||
&mac_addr_cnt);
|
||||
if (ret) {
|
||||
debug("%s: No daughtercard EEPROM at 0x%02x found %d\n",
|
||||
__func__, i2c_addr, ret);
|
||||
eeprom_read_success = false;
|
||||
/* Skip to the next daughtercard to probe */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* EEPROM read successful, okay to further process. */
|
||||
eeprom_read_success = true;
|
||||
}
|
||||
|
||||
/* Only continue processing if EEPROM data was read */
|
||||
if (!eeprom_read_success)
|
||||
continue;
|
||||
|
||||
/* Only process the parsed data if we found a match */
|
||||
if (strncmp(ep.name, ext_cards[i].card_name, sizeof(ep.name)))
|
||||
continue;
|
||||
|
||||
printf("Detected: %s rev %s\n", ep.name, ep.version);
|
||||
daughter_card_detect_flags[i] = true;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SPL_BUILD)) {
|
||||
int j;
|
||||
/*
|
||||
* Populate any MAC addresses from daughtercard into the U-Boot
|
||||
* environment, starting with a card-specific offset so we can
|
||||
* have multiple ext_cards contribute to the MAC pool in a well-
|
||||
* defined manner.
|
||||
*/
|
||||
for (j = 0; j < mac_addr_cnt; j++) {
|
||||
if (!is_valid_ethaddr((u8 *)mac_addr[j]))
|
||||
continue;
|
||||
|
||||
eth_env_set_enetaddr_by_index("eth", ext_cards[i].eth_offset + j,
|
||||
(uchar *)mac_addr[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SPL_BUILD)) {
|
||||
char name_overlays[1024] = { 0 };
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ext_cards); i++) {
|
||||
if (!daughter_card_detect_flags[i])
|
||||
continue;
|
||||
|
||||
/* Skip if no overlays are to be added */
|
||||
if (!strlen(ext_cards[i].dtbo_name))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Make sure we are not running out of buffer space by checking
|
||||
* if we can fit the new overlay, a trailing space to be used
|
||||
* as a separator, plus the terminating zero.
|
||||
*/
|
||||
if (strlen(name_overlays) + strlen(ext_cards[i].dtbo_name) + 2 >
|
||||
sizeof(name_overlays))
|
||||
return -ENOMEM;
|
||||
|
||||
/* Append to our list of overlays */
|
||||
strcat(name_overlays, ext_cards[i].dtbo_name);
|
||||
strcat(name_overlays, " ");
|
||||
}
|
||||
|
||||
/* Apply device tree overlay(s) to the U-Boot environment, if any */
|
||||
if (strlen(name_overlays))
|
||||
return env_set("name_overlays", name_overlays);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -182,6 +311,7 @@ int board_late_init(void)
|
|||
if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) {
|
||||
setup_board_eeprom_env();
|
||||
setup_serial();
|
||||
probe_daughtercards();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue