From 46684bb0369879413015c93c61998ff2986e0617 Mon Sep 17 00:00:00 2001 From: "Guillaume La Roque (TI.com)" Date: Mon, 3 Nov 2025 19:40:02 +0100 Subject: [PATCH] board: ti: common: Add generic AM6x board detection functions Add two new generic functions for AM6x family boards to simplify board-specific implementations: - do_board_detect_am6(): Generic board detection function that reads the on-board EEPROM. It first attempts to read at the configured address, and if that fails, tries the alternate address (CONFIG_EEPROM_CHIP_ADDRESS + 1). This provides a common implementation that can be used across different AM6x boards. - setup_serial_am6(): Sets up the serial number environment variable from the EEPROM data. The serial number is converted from hexadecimal string format to a 16-character hexadecimal representation and stored in the "serial#" environment variable. Both functions are protected by CONFIG_IS_ENABLED(TI_I2C_BOARD_DETECT) and are designed to be used by AM62x, AM64x, AM65x, and other AM6x family boards. Reviewed-by: Mattijs Korpershoek Signed-off-by: Guillaume La Roque (TI.com) --- board/ti/common/board_detect.c | 43 ++++++++++++++++++++++++++++++++++ board/ti/common/board_detect.h | 22 +++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/board/ti/common/board_detect.c b/board/ti/common/board_detect.c index a43cc075b92..d49e26fa453 100644 --- a/board/ti/common/board_detect.c +++ b/board/ti/common/board_detect.c @@ -824,3 +824,46 @@ bool __maybe_unused board_ti_was_eeprom_read(void) else return false; } + +#if CONFIG_IS_ENABLED(TI_I2C_BOARD_DETECT) +int do_board_detect_am6(void) +{ + int ret; + + ret = ti_i2c_eeprom_am6_get_base(CONFIG_EEPROM_BUS_ADDRESS, + CONFIG_EEPROM_CHIP_ADDRESS); + if (ret) { + printf("EEPROM not available at 0x%02x, trying to read at 0x%02x\n", + CONFIG_EEPROM_CHIP_ADDRESS, + CONFIG_EEPROM_CHIP_ADDRESS + 1); + ret = ti_i2c_eeprom_am6_get_base(CONFIG_EEPROM_BUS_ADDRESS, + CONFIG_EEPROM_CHIP_ADDRESS + + 1); + if (ret) + pr_err("Reading on-board EEPROM at 0x%02x failed %d\n", + CONFIG_EEPROM_CHIP_ADDRESS + 1, ret); + } + + return ret; +} + +void setup_serial_am6(void) +{ + struct ti_am6_eeprom *ep = TI_AM6_EEPROM_DATA; + unsigned long board_serial; + char *endp; + char serial_string[17] = { 0 }; + + if (env_get("serial#")) + return; + + board_serial = simple_strtoul(ep->serial, &endp, 16); + if (*endp != '\0') { + pr_err("Error: Can't set serial# to %s\n", ep->serial); + return; + } + + snprintf(serial_string, sizeof(serial_string), "%016lx", board_serial); + env_set("serial#", serial_string); +} +#endif diff --git a/board/ti/common/board_detect.h b/board/ti/common/board_detect.h index b057f3b2269..26ada2a449c 100644 --- a/board/ti/common/board_detect.h +++ b/board/ti/common/board_detect.h @@ -313,6 +313,28 @@ int __maybe_unused ti_i2c_eeprom_am6_get(int bus_addr, int dev_addr, */ int __maybe_unused ti_i2c_eeprom_am6_get_base(int bus_addr, int dev_addr); +/** + * do_board_detect_am6() - Detect AM6x board and read EEPROM data + * + * This is a generic board detection function for AM6x family boards. + * It attempts to read the on-board EEPROM at the configured address, + * and if that fails, tries the alternate address (CONFIG_EEPROM_CHIP_ADDRESS + 1). + * + * Return: 0 on success or corresponding error on failure. + */ +int do_board_detect_am6(void); + +/** + * setup_serial_am6() - Setup serial number environment variable for AM6x boards + * + * This function reads the serial number from the AM6x EEPROM data and + * sets the "serial#" environment variable. The serial number is converted + * from hexadecimal string format to a 16-character hexadecimal representation. + * + * EEPROM should be already read before calling this function. + */ +void setup_serial_am6(void); + #ifdef CONFIG_TI_I2C_BOARD_DETECT /** * board_ti_is() - Board detection logic for TI EVMs -- 2.47.3