All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] PHYTEC SOM Detection API v3
@ 2024-05-22  6:18 Daniel Schultz
  2024-05-22  6:18 ` [PATCH 1/6] board: phytec: common: Move eeprom read to new function Daniel Schultz
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

This patch series adds support for the EEPROM v3 API.

V3 is backwards compatible to V2 and therefore, the V2 image still
exists at the beginning. Only the API version changed from 2 to 3.

V3 is a block-based memory layout organized as singled-linked list
with different types of blocks. This is a more flexible approach and
allows us to extend it by more block types in the future.

The V3 data starts with a 8-byte large header which defines the
block count (u8), V3 subversion (u8) and data payload length (u16).
Additionally the header contains a CRC8 checksum a 3 reserved bytes.

Each block starts with a 4-byte large header which defined the
block type (u8), the absolute address of the next block (u16) and a
CRC8 checksum. The content itself is defined via the block type and
we currently have 2 different types:

1) MAC: Contains the Ethernet interface number (u8), MAC address
        (6 x u8) and a CRC8 checksum.

Daniel Schultz (6):
  board: phytec: common: Move eeprom read to new function
  board: phytec: common: Define PHYTEC_API2_DATA_LEN
  board: phytec: common: Move API v2 init to new function
  board: phytec: common: Add API v3
  board: phytec: common: k3: Set MAC
  configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE

 board/phytec/common/Kconfig                   |   9 +
 board/phytec/common/Makefile                  |   2 +-
 board/phytec/common/k3/board.c                |  23 ++
 board/phytec/common/phytec_som_detection.c    | 228 +++++++++++++++---
 board/phytec/common/phytec_som_detection.h    |   9 +
 .../common/phytec_som_detection_blocks.c      | 105 ++++++++
 .../common/phytec_som_detection_blocks.h      |  61 +++++
 configs/phycore_am62x_a53_defconfig           |   1 +
 8 files changed, 408 insertions(+), 30 deletions(-)
 create mode 100644 board/phytec/common/phytec_som_detection_blocks.c
 create mode 100644 board/phytec/common/phytec_som_detection_blocks.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/6] board: phytec: common: Move eeprom read to new function
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
@ 2024-05-22  6:18 ` Daniel Schultz
  2024-05-22  6:18 ` [PATCH 2/6] board: phytec: common: Define PHYTEC_API2_DATA_LEN Daniel Schultz
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

We need to read multiple times from different offsets in API v3.
Move the EEPROM read logic into a dedicated function to make it
usable multiple times.

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
 board/phytec/common/phytec_som_detection.c | 38 ++++++++++++++--------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/board/phytec/common/phytec_som_detection.c b/board/phytec/common/phytec_som_detection.c
index b14bb3dbb7f..a089fe9bc90 100644
--- a/board/phytec/common/phytec_som_detection.c
+++ b/board/phytec/common/phytec_som_detection.c
@@ -47,16 +47,9 @@ int phytec_eeprom_data_setup(struct phytec_eeprom_data *data,
 	return ret;
 }
 
-int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
-			    int bus_num, int addr)
+int phytec_eeprom_read(u8 *data, int bus_num, int addr, int size, int offset)
 {
-	int ret, i;
-	unsigned int crc;
-	u8 *ptr;
-	const unsigned int payload_size = sizeof(struct phytec_eeprom_payload);
-
-	if (!data)
-		data = &eeprom_data;
+	int ret;
 
 #if CONFIG_IS_ENABLED(DM_I2C)
 	struct udevice *dev;
@@ -64,19 +57,36 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 	ret = i2c_get_chip_for_busnum(bus_num, addr, 2, &dev);
 	if (ret) {
 		pr_err("%s: i2c EEPROM not found: %i.\n", __func__, ret);
-		goto err;
+		return ret;
 	}
 
-	ret = dm_i2c_read(dev, 0, (uint8_t *)data, payload_size);
+	ret = dm_i2c_read(dev, offset, (uint8_t *)data, size);
 	if (ret) {
 		pr_err("%s: Unable to read EEPROM data: %i\n", __func__, ret);
-		goto err;
+		return ret;
 	}
 #else
 	i2c_set_bus_num(bus_num);
-	ret = i2c_read(addr, 0, 2, (uint8_t *)data,
-		       sizeof(struct phytec_eeprom_data));
+	ret = i2c_read(addr, offset, 2, (uint8_t *)data, size);
 #endif
+	return ret;
+}
+
+int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
+			    int bus_num, int addr)
+{
+	int ret, i;
+	unsigned int crc;
+	u8 *ptr;
+	const unsigned int payload_size = sizeof(struct phytec_eeprom_payload);
+
+	if (!data)
+		data = &eeprom_data;
+
+	ret = phytec_eeprom_read((u8 *)data, bus_num, addr,
+				 payload_size, 0);
+	if (ret)
+		goto err;
 
 	if (data->payload.api_rev == 0xff) {
 		pr_err("%s: EEPROM is not flashed. Prototype?\n", __func__);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/6] board: phytec: common: Define PHYTEC_API2_DATA_LEN
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
  2024-05-22  6:18 ` [PATCH 1/6] board: phytec: common: Move eeprom read to new function Daniel Schultz
@ 2024-05-22  6:18 ` Daniel Schultz
  2024-05-22  6:18 ` [PATCH 3/6] board: phytec: common: Move API v2 init to new function Daniel Schultz
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

The EEPROM image length for API v2 is fixed to 32 bytes. No need
to use sizeof while this value won't change. This value is
also be required for API v3 to know where the API v3 header starts.

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
 board/phytec/common/phytec_som_detection.c | 9 ++++-----
 board/phytec/common/phytec_som_detection.h | 2 ++
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/board/phytec/common/phytec_som_detection.c b/board/phytec/common/phytec_som_detection.c
index a089fe9bc90..f0e35d8d2ec 100644
--- a/board/phytec/common/phytec_som_detection.c
+++ b/board/phytec/common/phytec_som_detection.c
@@ -78,13 +78,12 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 	int ret, i;
 	unsigned int crc;
 	u8 *ptr;
-	const unsigned int payload_size = sizeof(struct phytec_eeprom_payload);
 
 	if (!data)
 		data = &eeprom_data;
 
 	ret = phytec_eeprom_read((u8 *)data, bus_num, addr,
-				 payload_size, 0);
+				 PHYTEC_API2_DATA_LEN, 0);
 	if (ret)
 		goto err;
 
@@ -95,11 +94,11 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 	}
 
 	ptr = (u8 *)data;
-	for (i = 0; i < payload_size; ++i)
+	for (i = 0; i < PHYTEC_API2_DATA_LEN; ++i)
 		if (ptr[i] != 0x0)
 			break;
 
-	if (i == payload_size) {
+	if (i == PHYTEC_API2_DATA_LEN) {
 		pr_err("%s: EEPROM data is all zero. Erased?\n", __func__);
 		ret = -EINVAL;
 		goto err;
@@ -111,7 +110,7 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 		return 0;
 	}
 
-	crc = crc8(0, (const unsigned char *)&data->payload, payload_size);
+	crc = crc8(0, (const unsigned char *)&data->payload, PHYTEC_API2_DATA_LEN);
 	debug("%s: crc: %x\n", __func__, crc);
 
 	if (crc) {
diff --git a/board/phytec/common/phytec_som_detection.h b/board/phytec/common/phytec_som_detection.h
index 0ad5c14ef4e..1ccf36c8e7a 100644
--- a/board/phytec/common/phytec_som_detection.h
+++ b/board/phytec/common/phytec_som_detection.h
@@ -10,6 +10,8 @@
 #define PHYTEC_MAX_OPTIONS	17
 #define PHYTEC_EEPROM_INVAL	0xff
 
+#define PHYTEC_API2_DATA_LEN	32
+
 #define PHYTEC_GET_OPTION(option) \
 	(((option) > '9') ? (option) - 'A' + 10 : (option) - '0')
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/6] board: phytec: common: Move API v2 init to new function
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
  2024-05-22  6:18 ` [PATCH 1/6] board: phytec: common: Move eeprom read to new function Daniel Schultz
  2024-05-22  6:18 ` [PATCH 2/6] board: phytec: common: Define PHYTEC_API2_DATA_LEN Daniel Schultz
@ 2024-05-22  6:18 ` Daniel Schultz
  2024-05-22  6:18 ` [PATCH 4/6] board: phytec: common: Add API v3 Daniel Schultz
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

Move the entire initialization code for API v2 into a dedicated
function. This rework will allow to easily integrate the API v3
as next step during init.

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
 board/phytec/common/phytec_som_detection.c | 38 +++++++++++++---------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/board/phytec/common/phytec_som_detection.c b/board/phytec/common/phytec_som_detection.c
index f0e35d8d2ec..ab2d5a7b726 100644
--- a/board/phytec/common/phytec_som_detection.c
+++ b/board/phytec/common/phytec_som_detection.c
@@ -72,11 +72,29 @@ int phytec_eeprom_read(u8 *data, int bus_num, int addr, int size, int offset)
 	return ret;
 }
 
+int phytec_eeprom_data_init_v2(struct phytec_eeprom_data *data)
+{
+	unsigned int crc;
+
+	if (!data)
+		return -1;
+
+	crc = crc8(0, (const unsigned char *)&data->payload, PHYTEC_API2_DATA_LEN);
+	debug("%s: crc: %x\n", __func__, crc);
+
+	if (crc) {
+		pr_err("%s: CRC mismatch. EEPROM data is not usable.\n",
+		       __func__);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 			    int bus_num, int addr)
 {
 	int ret, i;
-	unsigned int crc;
 	u8 *ptr;
 
 	if (!data)
@@ -104,20 +122,10 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 		goto err;
 	}
 
-	/* We are done here for early revisions */
-	if (data->payload.api_rev <= PHYTEC_API_REV1) {
-		data->valid = true;
-		return 0;
-	}
-
-	crc = crc8(0, (const unsigned char *)&data->payload, PHYTEC_API2_DATA_LEN);
-	debug("%s: crc: %x\n", __func__, crc);
-
-	if (crc) {
-		pr_err("%s: CRC mismatch. EEPROM data is not usable.\n",
-		       __func__);
-		ret = -EINVAL;
-		goto err;
+	if (data->payload.api_rev >= PHYTEC_API_REV2) {
+		ret = phytec_eeprom_data_init_v2(data);
+		if (ret)
+			goto err;
 	}
 
 	data->valid = true;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/6] board: phytec: common: Add API v3
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
                   ` (2 preceding siblings ...)
  2024-05-22  6:18 ` [PATCH 3/6] board: phytec: common: Move API v2 init to new function Daniel Schultz
@ 2024-05-22  6:18 ` Daniel Schultz
  2024-05-22  6:18 ` [PATCH 5/6] board: phytec: common: k3: Set MAC Daniel Schultz
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

This API is based on a block structure with a 8 Byte large
API v3 header and various of different blocks following. It extends
our current API v2, which is always 32 Byte large, and is located
directly after v2.

Add the MAC block as first block type. It contains the physical
Ehternet interface number, a MAC address and a CRC checksum over the
MAC payload.

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
 board/phytec/common/Kconfig                   |   9 ++
 board/phytec/common/Makefile                  |   2 +-
 board/phytec/common/phytec_som_detection.c    | 153 ++++++++++++++++++
 board/phytec/common/phytec_som_detection.h    |   7 +
 .../common/phytec_som_detection_blocks.c      | 105 ++++++++++++
 .../common/phytec_som_detection_blocks.h      |  61 +++++++
 6 files changed, 336 insertions(+), 1 deletion(-)
 create mode 100644 board/phytec/common/phytec_som_detection_blocks.c
 create mode 100644 board/phytec/common/phytec_som_detection_blocks.h

diff --git a/board/phytec/common/Kconfig b/board/phytec/common/Kconfig
index 1077f0f4b61..668afe2a534 100644
--- a/board/phytec/common/Kconfig
+++ b/board/phytec/common/Kconfig
@@ -4,6 +4,13 @@ config PHYTEC_SOM_DETECTION
 	help
 	   Support of I2C EEPROM based SoM detection.
 
+config PHYTEC_SOM_DETECTION_BLOCKS
+	bool "Extend SoM detection with block support"
+	depends on PHYTEC_SOM_DETECTION
+	help
+	   Extend the I2C EEPROM based SoM detection with API v3. This API
+	   introduces blocks with different payloads.
+
 config PHYTEC_IMX8M_SOM_DETECTION
 	bool "Support SoM detection for i.MX8M PHYTEC platforms"
 	depends on ARCH_IMX8M && PHYTEC_SOM_DETECTION
@@ -16,6 +23,7 @@ config PHYTEC_AM62_SOM_DETECTION
 	bool "Support SoM detection for AM62x PHYTEC platforms"
 	depends on (TARGET_PHYCORE_AM62X_A53 || TARGET_PHYCORE_AM62X_R5) && \
 		   PHYTEC_SOM_DETECTION
+	select PHYTEC_SOM_DETECTION_BLOCKS
 	default y
 	help
 	   Support of I2C EEPROM based SoM detection. Supported
@@ -25,6 +33,7 @@ config PHYTEC_AM64_SOM_DETECTION
 	bool "Support SoM detection for AM64x PHYTEC platforms"
 	depends on (TARGET_PHYCORE_AM64X_A53 || TARGET_PHYCORE_AM64X_R5) && \
 		   PHYTEC_SOM_DETECTION
+	select PHYTEC_SOM_DETECTION_BLOCKS
 	default y
 	help
 	   Support of I2C EEPROM based SoM detection. Supported
diff --git a/board/phytec/common/Makefile b/board/phytec/common/Makefile
index c34fc503059..446c481a6e6 100644
--- a/board/phytec/common/Makefile
+++ b/board/phytec/common/Makefile
@@ -9,6 +9,6 @@ else
 obj-$(CONFIG_ARCH_K3) += k3/
 endif
 
-obj-y += phytec_som_detection.o
+obj-y += phytec_som_detection.o phytec_som_detection_blocks.o
 obj-$(CONFIG_ARCH_K3) += am6_som_detection.o
 obj-$(CONFIG_ARCH_IMX8M) += imx8m_som_detection.o
diff --git a/board/phytec/common/phytec_som_detection.c b/board/phytec/common/phytec_som_detection.c
index ab2d5a7b726..166c3eae565 100644
--- a/board/phytec/common/phytec_som_detection.c
+++ b/board/phytec/common/phytec_som_detection.c
@@ -91,6 +91,134 @@ int phytec_eeprom_data_init_v2(struct phytec_eeprom_data *data)
 	return 0;
 }
 
+#if IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION_BLOCKS)
+
+int phytec_eeprom_data_init_v3_block(struct phytec_eeprom_data *data,
+				     struct phytec_api3_block_header *header,
+				     u8 *payload)
+{
+	struct phytec_api3_element *element = NULL;
+	struct phytec_api3_element *list_iterator;
+
+	if (!header)
+		return -1;
+	if (!payload)
+		return -1;
+
+	debug("%s: block type: %i\n", __func__, header->block_type);
+	switch (header->block_type) {
+	case PHYTEC_API3_BLOCK_MAC:
+		element = phytec_blocks_init_mac(header, payload);
+		break;
+	default:
+		debug("%s: Unknown block type %i\n", __func__,
+		      header->block_type);
+	}
+	if (!element)
+		return -1;
+
+	if (!data->payload.block_head) {
+		data->payload.block_head = element;
+		return 0;
+	}
+
+	list_iterator = data->payload.block_head;
+	while (list_iterator && list_iterator->next)
+		list_iterator = list_iterator->next;
+	list_iterator->next = element;
+
+	return 0;
+}
+
+int phytec_eeprom_data_init_v3(struct phytec_eeprom_data *data,
+			       int bus_num, int addr)
+{
+	int ret, i;
+	struct phytec_api3_header header;
+	unsigned int crc;
+	u8 *payload;
+	int block_addr;
+	struct phytec_api3_block_header *block_header;
+
+	if (!data)
+		return -1;
+
+	ret = phytec_eeprom_read((uint8_t *)&header, bus_num, addr,
+				 PHYTEC_API3_DATA_HEADER_LEN,
+				 PHYTEC_API2_DATA_LEN);
+	if (ret) {
+		pr_err("%s: Failed to read API v3 data header.\n", __func__);
+		goto err;
+	}
+
+	crc = crc8(0, (const unsigned char *)&header,
+		   PHYTEC_API3_DATA_HEADER_LEN);
+	debug("%s: crc: %x\n", __func__, crc);
+	if (crc) {
+		pr_err("%s: CRC mismatch. API3 header is unusable.\n",
+		       __func__);
+		goto err;
+	}
+
+	debug("%s: data length: %i\n", __func__, header.data_length);
+	payload = malloc(header.data_length);
+	if (!payload) {
+		pr_err("%s: Unable to allocate memory\n", __func__);
+		goto err_payload;
+	}
+
+	ret = phytec_eeprom_read(payload, bus_num, addr, header.data_length,
+				 PHYTEC_API3_DATA_HEADER_LEN +
+				 PHYTEC_API2_DATA_LEN);
+	if (ret) {
+		pr_err("%s: Failed to read API v3 data payload.\n", __func__);
+		goto err_payload;
+	}
+
+	block_addr = 0;
+	debug("%s: block count: %i\n", __func__, header.block_count);
+	for (i = 0; i < header.block_count; i++) {
+		debug("%s: block_addr: %i\n", __func__, block_addr);
+		block_header = (struct phytec_api3_block_header *)
+			&payload[block_addr];
+		crc = crc8(0, (const unsigned char *)block_header,
+			   PHYTEC_API3_BLOCK_HEADER_LEN);
+
+		debug("%s: crc: %x\n", __func__, crc);
+		if (crc) {
+			pr_err("%s: CRC mismatch. API3 block header is unusable\n",
+			       __func__);
+			goto err_payload;
+		}
+
+		ret = phytec_eeprom_data_init_v3_block(data, block_header,
+			&payload[block_addr + PHYTEC_API3_BLOCK_HEADER_LEN]);
+		/* Ignore failed block initialization and continue. */
+		if (ret)
+			debug("%s: Unable to create block with index %i.\n",
+			      __func__, i);
+
+		block_addr = block_header->next_block;
+	}
+
+	free(payload);
+	return 0;
+err_payload:
+	free(payload);
+err:
+	return -1;
+}
+
+#else
+
+inline int phytec_eeprom_data_init_v3(struct phytec_eeprom_data *data,
+				      int bus_num, int addr)
+{
+	return 0;
+}
+
+#endif
+
 int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 			    int bus_num, int addr)
 {
@@ -104,6 +232,7 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 				 PHYTEC_API2_DATA_LEN, 0);
 	if (ret)
 		goto err;
+	data->payload.block_head = NULL;
 
 	if (data->payload.api_rev == 0xff) {
 		pr_err("%s: EEPROM is not flashed. Prototype?\n", __func__);
@@ -128,6 +257,13 @@ int phytec_eeprom_data_init(struct phytec_eeprom_data *data,
 			goto err;
 	}
 
+	if (IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION_BLOCKS))
+		if (data->payload.api_rev >= PHYTEC_API_REV3) {
+			ret = phytec_eeprom_data_init_v3(data, bus_num, addr);
+			if (ret)
+				goto err;
+		}
+
 	data->valid = true;
 	return 0;
 err:
@@ -265,6 +401,17 @@ struct extension *phytec_add_extension(const char *name, const char *overlay,
 }
 #endif /* IS_ENABLED(CONFIG_CMD_EXTENSION) */
 
+struct phytec_api3_element *
+	__maybe_unused phytec_get_block_head(struct phytec_eeprom_data *data)
+{
+	if (!data)
+		data = &eeprom_data;
+	if (!data->valid)
+		return NULL;
+
+	return data->payload.block_head;
+}
+
 #else
 
 inline int phytec_eeprom_data_setup(struct phytec_eeprom_data *data,
@@ -305,6 +452,12 @@ u8 __maybe_unused phytec_get_som_type(struct phytec_eeprom_data *data)
 	return PHYTEC_EEPROM_INVAL;
 }
 
+inline struct phytec_api3_element * __maybe_unused
+	phytec_get_block_head(struct phytec_eeprom_data *data)
+{
+	return NULL;
+}
+
 #if IS_ENABLED(CONFIG_CMD_EXTENSION)
 inline struct extension *phytec_add_extension(const char *name,
 					      const char *overlay,
diff --git a/board/phytec/common/phytec_som_detection.h b/board/phytec/common/phytec_som_detection.h
index 1ccf36c8e7a..5e35a13cb21 100644
--- a/board/phytec/common/phytec_som_detection.h
+++ b/board/phytec/common/phytec_som_detection.h
@@ -7,6 +7,8 @@
 #ifndef _PHYTEC_SOM_DETECTION_H
 #define _PHYTEC_SOM_DETECTION_H
 
+#include "phytec_som_detection_blocks.h"
+
 #define PHYTEC_MAX_OPTIONS	17
 #define PHYTEC_EEPROM_INVAL	0xff
 
@@ -19,6 +21,7 @@ enum {
 	PHYTEC_API_REV0 = 0,
 	PHYTEC_API_REV1,
 	PHYTEC_API_REV2,
+	PHYTEC_API_REV3,
 };
 
 enum phytec_som_type_str {
@@ -63,6 +66,7 @@ struct phytec_eeprom_payload {
 		struct phytec_api0_data data_api0;
 		struct phytec_api2_data data_api2;
 	} data;
+	struct phytec_api3_element *block_head;
 } __packed;
 
 struct phytec_eeprom_data {
@@ -88,4 +92,7 @@ struct extension *phytec_add_extension(const char *name, const char *overlay,
 				       const char *other);
 #endif /* IS_ENABLED(CONFIG_CMD_EXTENSION) */
 
+struct phytec_api3_element *
+	__maybe_unused phytec_get_block_head(struct phytec_eeprom_data *data);
+
 #endif /* _PHYTEC_SOM_DETECTION_H */
diff --git a/board/phytec/common/phytec_som_detection_blocks.c b/board/phytec/common/phytec_som_detection_blocks.c
new file mode 100644
index 00000000000..5f3c27ef0c2
--- /dev/null
+++ b/board/phytec/common/phytec_som_detection_blocks.c
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2024 PHYTEC Messtechnik GmbH
+ * Author: Daniel Schultz <d.schultz@phytec.de>
+ */
+
+#include <malloc.h>
+#include <u-boot/crc.h>
+#include <net.h>
+#include <vsprintf.h>
+
+#include "phytec_som_detection_blocks.h"
+
+#if IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION_BLOCKS)
+
+struct phytec_api3_element *
+	phytec_blocks_init_mac(struct phytec_api3_block_header *header,
+			       uint8_t *payload)
+{
+	struct phytec_api3_element *element;
+	struct phytec_api3_block_mac *mac;
+	unsigned int crc;
+	unsigned int len = sizeof(struct phytec_api3_block_mac);
+
+	if (!header)
+		return NULL;
+	if (!payload)
+		return NULL;
+
+	element = (struct phytec_api3_element *)
+			calloc(8, PHYTEC_API3_ELEMENT_HEADER_SIZE + len);
+	if (!element) {
+		pr_err("%s: Unable to allocate memory\n", __func__);
+		return NULL;
+	}
+	element->block_type = header->block_type;
+	memcpy(&element->block.mac, payload, len);
+	mac = &element->block.mac;
+
+	debug("%s: interface: %i\n", __func__, mac->interface);
+	debug("%s: MAC %pM\n", __func__, mac->address);
+
+	crc = crc8(0, (const unsigned char *)mac, len);
+	debug("%s: crc: %x\n", __func__, crc);
+	if (crc) {
+		pr_err("%s: CRC mismatch. API3 block payload is unusable\n",
+		       __func__);
+		return NULL;
+	}
+
+	return element;
+}
+
+int __maybe_unused
+	phytec_blocks_add_mac_to_env(struct phytec_api3_element *element)
+{
+	char enetenv[9] = "ethaddr";
+	char buf[ARP_HLEN_ASCII + 1];
+	struct phytec_api3_block_mac *block = &element->block.mac;
+	int ret;
+
+	if (!is_valid_ethaddr(block->address)) {
+		pr_err("%s: Invalid MAC address in block.\n", __func__);
+		return -1;
+	}
+
+	if (block->interface > 0) {
+		ret = sprintf(enetenv, "eth%iaddr", block->interface);
+		if (ret != 8) {
+			pr_err("%s: Unable to create env string\n", __func__);
+			return -1;
+		}
+	}
+
+	ret = sprintf(buf, "%pM", block->address);
+	if (ret != ARP_HLEN_ASCII) {
+		pr_err("%s: Unable to convert MAC address\n", __func__);
+		return -1;
+	}
+	ret = env_set(enetenv, buf);
+	if (ret) {
+		pr_err("%s: Failed to set MAC address to env.\n", __func__);
+		return -1;
+	}
+
+	debug("%s: Added %s to %s\n", __func__, buf, enetenv);
+	return 0;
+}
+
+#else
+
+inline struct phytec_api3_element *
+	phytec_api3_init_mac_block(struct phytec_api3_block_header *header,
+				   uint8_t *payload)
+{
+	return NULL;
+}
+
+inline int __maybe_unused
+	phytec_blocks_add_mac_to_env(struct phytec_api3_element *element)
+{
+	return -1;
+}
+
+#endif
diff --git a/board/phytec/common/phytec_som_detection_blocks.h b/board/phytec/common/phytec_som_detection_blocks.h
new file mode 100644
index 00000000000..2a5a83c9039
--- /dev/null
+++ b/board/phytec/common/phytec_som_detection_blocks.h
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2024 PHYTEC Messtechnik GmbH
+ * Author: Daniel Schultz <d.schultz@phytec.de>
+ */
+
+#ifndef _PHYTEC_SOM_DETECTION_BLOCKS_H
+#define _PHYTEC_SOM_DETECTION_BLOCKS_H
+
+#define PHYTEC_API3_DATA_HEADER_LEN	8
+#define PHYTEC_API3_BLOCK_HEADER_LEN	4
+#define PHYTEC_API3_PAYLOAD_START					      \
+	(PHYTEC_API2_DATA_LEN + PHYTEC_API3_DATA_HEADER_LEN)
+
+#define PHYTEC_API3_ELEMENT_HEADER_SIZE					      \
+	(sizeof(struct phytec_api3_element *) +				      \
+		sizeof(enum phytec_api3_block_types))
+
+#define PHYTEC_API3_FOREACH_BLOCK(elem, data)				      \
+	for (elem = phytec_get_block_head(data); elem; elem = elem->next)
+
+struct phytec_api3_header {
+	u16 data_length;	/* Total length in Bytes of all blocks */
+	u8 block_count;		/* Number of blocks */
+	u8 sub_version;		/* Block specification version */
+	u8 reserved[3];		/* Reserved */
+	u8 crc8;		/* checksum */
+} __packed;
+
+struct phytec_api3_block_header {
+	u8 block_type;		/* Block payload identifier */
+	u16 next_block;		/* Address of the next block */
+	u8 crc8;		/* checksum */
+} __packed;
+
+enum phytec_api3_block_types {
+	PHYTEC_API3_BLOCK_MAC = 0,
+};
+
+struct phytec_api3_block_mac {
+	u8 interface;		/* Ethernet interface number */
+	u8 address[6];		/* MAC-Address */
+	u8 crc8;		/* checksum */
+} __packed;
+
+struct phytec_api3_element {
+	struct phytec_api3_element *next;
+	enum phytec_api3_block_types block_type;
+	union {
+		struct phytec_api3_block_mac mac;
+	} block;
+} __packed;
+
+struct phytec_api3_element *
+	phytec_blocks_init_mac(struct phytec_api3_block_header *header,
+			       uint8_t *payload);
+
+int __maybe_unused
+phytec_blocks_add_mac_to_env(struct phytec_api3_element *element);
+
+#endif /* _PHYTEC_SOM_DETECTION_BLOCKS_H */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/6] board: phytec: common: k3: Set MAC
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
                   ` (3 preceding siblings ...)
  2024-05-22  6:18 ` [PATCH 4/6] board: phytec: common: Add API v3 Daniel Schultz
@ 2024-05-22  6:18 ` Daniel Schultz
  2024-05-22  8:38   ` [Upstream] " Wadim Egorov
  2024-05-22  6:18 ` [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE Daniel Schultz
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

Read the EEPROM API v3 content and set all available
MAC-Addresses to the environment.

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
 board/phytec/common/k3/board.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/board/phytec/common/k3/board.c b/board/phytec/common/k3/board.c
index 9cb168c36cb..f21e154d4fe 100644
--- a/board/phytec/common/k3/board.c
+++ b/board/phytec/common/k3/board.c
@@ -8,6 +8,8 @@
 #include <spl.h>
 #include <asm/arch/hardware.h>
 
+#include "../am6_som_detection.h"
+
 #if IS_ENABLED(CONFIG_ENV_IS_IN_FAT) || IS_ENABLED(CONFIG_ENV_IS_IN_MMC)
 int mmc_get_env_dev(void)
 {
@@ -68,6 +70,27 @@ int board_late_init(void)
 		break;
 	};
 
+	if (IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION_BLOCKS)) {
+		struct phytec_api3_element *block_element;
+		struct phytec_eeprom_data data;
+		int ret;
+
+		ret = phytec_eeprom_data_setup(&data, 0, EEPROM_ADDR);
+		if (ret || !data.valid)
+			return 0;
+
+		PHYTEC_API3_FOREACH_BLOCK(block_element, &data) {
+			switch (block_element->block_type) {
+			case PHYTEC_API3_BLOCK_MAC:
+				phytec_blocks_add_mac_to_env(block_element);
+				break;
+			default:
+				debug("%s: Unknown block type %i\n", __func__,
+				      block_element->block_type);
+			}
+		}
+	}
+
 	return 0;
 }
 #endif
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
                   ` (4 preceding siblings ...)
  2024-05-22  6:18 ` [PATCH 5/6] board: phytec: common: k3: Set MAC Daniel Schultz
@ 2024-05-22  6:18 ` Daniel Schultz
  2024-05-22  8:30   ` [Upstream] " Wadim Egorov
  2024-05-22  8:28 ` [Upstream] [PATCH 0/6] PHYTEC SOM Detection API v3 Wadim Egorov
  2024-06-07 22:03 ` Tom Rini
  7 siblings, 1 reply; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  6:18 UTC (permalink / raw)
  To: u-boot, upstream; +Cc: Daniel Schultz

Enable CONFIG_ENV_OVERWRITE to overwrite ethaddr in the environment.
This is required because our environment is not located in the
boot partition.

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
 configs/phycore_am62x_a53_defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/configs/phycore_am62x_a53_defconfig b/configs/phycore_am62x_a53_defconfig
index fd36edc29dd..286cd89c5a6 100644
--- a/configs/phycore_am62x_a53_defconfig
+++ b/configs/phycore_am62x_a53_defconfig
@@ -59,6 +59,7 @@ CONFIG_SPL_OF_CONTROL=y
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_SPL_MULTI_DTB_FIT=y
 CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
+CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_MMC_ENV_DEV=1
 CONFIG_NET_RANDOM_ETHADDR=y
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Upstream] [PATCH 0/6] PHYTEC SOM Detection API v3
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
                   ` (5 preceding siblings ...)
  2024-05-22  6:18 ` [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE Daniel Schultz
@ 2024-05-22  8:28 ` Wadim Egorov
  2024-06-07 22:03 ` Tom Rini
  7 siblings, 0 replies; 12+ messages in thread
From: Wadim Egorov @ 2024-05-22  8:28 UTC (permalink / raw)
  To: Daniel Schultz, u-boot, upstream



Am 22.05.24 um 08:18 schrieb Daniel Schultz:
> This patch series adds support for the EEPROM v3 API.
> 
> V3 is backwards compatible to V2 and therefore, the V2 image still
> exists at the beginning. Only the API version changed from 2 to 3.
> 
> V3 is a block-based memory layout organized as singled-linked list
> with different types of blocks. This is a more flexible approach and
> allows us to extend it by more block types in the future.
> 
> The V3 data starts with a 8-byte large header which defines the
> block count (u8), V3 subversion (u8) and data payload length (u16).
> Additionally the header contains a CRC8 checksum a 3 reserved bytes.
> 
> Each block starts with a 4-byte large header which defined the
> block type (u8), the absolute address of the next block (u16) and a
> CRC8 checksum. The content itself is defined via the block type and
> we currently have 2 different types:
> 
> 1) MAC: Contains the Ethernet interface number (u8), MAC address
>          (6 x u8) and a CRC8 checksum.

For this series,

Tested-by: Wadim Egorov <w.egorov@phytec.de>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Upstream] [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE
  2024-05-22  6:18 ` [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE Daniel Schultz
@ 2024-05-22  8:30   ` Wadim Egorov
  2024-05-22  8:46     ` Daniel Schultz
  0 siblings, 1 reply; 12+ messages in thread
From: Wadim Egorov @ 2024-05-22  8:30 UTC (permalink / raw)
  To: Daniel Schultz, u-boot, upstream

Hi Daniel,

Am 22.05.24 um 08:18 schrieb Daniel Schultz:
> Enable CONFIG_ENV_OVERWRITE to overwrite ethaddr in the environment.
> This is required because our environment is not located in the
> boot partition.
> 
> Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
> ---
>   configs/phycore_am62x_a53_defconfig | 1 +
What about the change for the phycore_am64x?


>   1 file changed, 1 insertion(+)
> 
> diff --git a/configs/phycore_am62x_a53_defconfig b/configs/phycore_am62x_a53_defconfig
> index fd36edc29dd..286cd89c5a6 100644
> --- a/configs/phycore_am62x_a53_defconfig
> +++ b/configs/phycore_am62x_a53_defconfig
> @@ -59,6 +59,7 @@ CONFIG_SPL_OF_CONTROL=y
>   CONFIG_MULTI_DTB_FIT=y
>   CONFIG_SPL_MULTI_DTB_FIT=y
>   CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
> +CONFIG_ENV_OVERWRITE=y
>   CONFIG_ENV_IS_IN_MMC=y
>   CONFIG_SYS_MMC_ENV_DEV=1
>   CONFIG_NET_RANDOM_ETHADDR=y

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Upstream] [PATCH 5/6] board: phytec: common: k3: Set MAC
  2024-05-22  6:18 ` [PATCH 5/6] board: phytec: common: k3: Set MAC Daniel Schultz
@ 2024-05-22  8:38   ` Wadim Egorov
  0 siblings, 0 replies; 12+ messages in thread
From: Wadim Egorov @ 2024-05-22  8:38 UTC (permalink / raw)
  To: Daniel Schultz, u-boot, upstream



Am 22.05.24 um 08:18 schrieb Daniel Schultz:
> Read the EEPROM API v3 content and set all available
> MAC-Addresses to the environment.
> 
> Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
> ---
>   board/phytec/common/k3/board.c | 23 +++++++++++++++++++++++
>   1 file changed, 23 insertions(+)
> 
> diff --git a/board/phytec/common/k3/board.c b/board/phytec/common/k3/board.c
> index 9cb168c36cb..f21e154d4fe 100644
> --- a/board/phytec/common/k3/board.c
> +++ b/board/phytec/common/k3/board.c
> @@ -8,6 +8,8 @@
>   #include <spl.h>
>   #include <asm/arch/hardware.h>
>   
> +#include "../am6_som_detection.h"
> +
>   #if IS_ENABLED(CONFIG_ENV_IS_IN_FAT) || IS_ENABLED(CONFIG_ENV_IS_IN_MMC)
>   int mmc_get_env_dev(void)
>   {
> @@ -68,6 +70,27 @@ int board_late_init(void)
>   		break;
>   	};
>   
> +	if (IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION_BLOCKS)) {
> +		struct phytec_api3_element *block_element;
> +		struct phytec_eeprom_data data;
> +		int ret;
> +
> +		ret = phytec_eeprom_data_setup(&data, 0, EEPROM_ADDR);
> +		if (ret || !data.valid)
> +			return 0;

Don't you want to return an error or at least print a warning?

Apart from that,

Reviewed-by: Wadim Egorov <w.egorov@phytec.de>

> +
> +		PHYTEC_API3_FOREACH_BLOCK(block_element, &data) {
> +			switch (block_element->block_type) {
> +			case PHYTEC_API3_BLOCK_MAC:
> +				phytec_blocks_add_mac_to_env(block_element);
> +				break;
> +			default:
> +				debug("%s: Unknown block type %i\n", __func__,
> +				      block_element->block_type);
> +			}
> +		}
> +	}
> +
>   	return 0;
>   }
>   #endif

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Upstream] [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE
  2024-05-22  8:30   ` [Upstream] " Wadim Egorov
@ 2024-05-22  8:46     ` Daniel Schultz
  0 siblings, 0 replies; 12+ messages in thread
From: Daniel Schultz @ 2024-05-22  8:46 UTC (permalink / raw)
  To: Wadim Egorov, u-boot, upstream

Hi,

On 22.05.24 10:30, Wadim Egorov wrote:
> Hi Daniel,
>
> Am 22.05.24 um 08:18 schrieb Daniel Schultz:
>> Enable CONFIG_ENV_OVERWRITE to overwrite ethaddr in the environment.
>> This is required because our environment is not located in the
>> boot partition.
>>
>> Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
>> ---
>>   configs/phycore_am62x_a53_defconfig | 1 +
> What about the change for the phycore_am64x?

Will enable phyCORE-AM64x later with additional changes to enable SOM 
detection.

Regards,
Daniel

>
>
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/configs/phycore_am62x_a53_defconfig 
>> b/configs/phycore_am62x_a53_defconfig
>> index fd36edc29dd..286cd89c5a6 100644
>> --- a/configs/phycore_am62x_a53_defconfig
>> +++ b/configs/phycore_am62x_a53_defconfig
>> @@ -59,6 +59,7 @@ CONFIG_SPL_OF_CONTROL=y
>>   CONFIG_MULTI_DTB_FIT=y
>>   CONFIG_SPL_MULTI_DTB_FIT=y
>>   CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
>> +CONFIG_ENV_OVERWRITE=y
>>   CONFIG_ENV_IS_IN_MMC=y
>>   CONFIG_SYS_MMC_ENV_DEV=1
>>   CONFIG_NET_RANDOM_ETHADDR=y

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/6] PHYTEC SOM Detection API v3
  2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
                   ` (6 preceding siblings ...)
  2024-05-22  8:28 ` [Upstream] [PATCH 0/6] PHYTEC SOM Detection API v3 Wadim Egorov
@ 2024-06-07 22:03 ` Tom Rini
  7 siblings, 0 replies; 12+ messages in thread
From: Tom Rini @ 2024-06-07 22:03 UTC (permalink / raw)
  To: u-boot, upstream, Daniel Schultz

On Tue, 21 May 2024 23:18:21 -0700, Daniel Schultz wrote:

> This patch series adds support for the EEPROM v3 API.
> 
> V3 is backwards compatible to V2 and therefore, the V2 image still
> exists at the beginning. Only the API version changed from 2 to 3.
> 
> V3 is a block-based memory layout organized as singled-linked list
> with different types of blocks. This is a more flexible approach and
> allows us to extend it by more block types in the future.
> 
> [...]

Applied to u-boot/next, thanks!

-- 
Tom



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-06-07 22:04 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-22  6:18 [PATCH 0/6] PHYTEC SOM Detection API v3 Daniel Schultz
2024-05-22  6:18 ` [PATCH 1/6] board: phytec: common: Move eeprom read to new function Daniel Schultz
2024-05-22  6:18 ` [PATCH 2/6] board: phytec: common: Define PHYTEC_API2_DATA_LEN Daniel Schultz
2024-05-22  6:18 ` [PATCH 3/6] board: phytec: common: Move API v2 init to new function Daniel Schultz
2024-05-22  6:18 ` [PATCH 4/6] board: phytec: common: Add API v3 Daniel Schultz
2024-05-22  6:18 ` [PATCH 5/6] board: phytec: common: k3: Set MAC Daniel Schultz
2024-05-22  8:38   ` [Upstream] " Wadim Egorov
2024-05-22  6:18 ` [PATCH 6/6] configs: phycore_am62x_a53_defconfig: Enable CONFIG_ENV_OVERWRITE Daniel Schultz
2024-05-22  8:30   ` [Upstream] " Wadim Egorov
2024-05-22  8:46     ` Daniel Schultz
2024-05-22  8:28 ` [Upstream] [PATCH 0/6] PHYTEC SOM Detection API v3 Wadim Egorov
2024-06-07 22:03 ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.