board: ti: j721s2: Add support to detect daughtercards
commit 7bf341ae4dfb3f126323cd906efe37e46851c9fa upstream. 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
95163bb988
commit
48bafded47
|
|
@ -171,6 +171,135 @@ static void setup_serial(void)
|
||||||
snprintf(serial_string, sizeof(serial_string), "%016lx", board_serial);
|
snprintf(serial_string, sizeof(serial_string), "%016lx", board_serial);
|
||||||
env_set("serial#", serial_string);
|
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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -200,6 +329,7 @@ int board_late_init(void)
|
||||||
if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) {
|
if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) {
|
||||||
setup_board_eeprom_env();
|
setup_board_eeprom_env();
|
||||||
setup_serial();
|
setup_serial();
|
||||||
|
probe_daughtercards();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue