* [PATCH 1/2] board: phytec: common: Add product information to FTD
@ 2024-11-08 18:19 Daniel Schultz
2024-11-08 18:19 ` [PATCH 2/2] board: phytec: common: k3: Expose product infos to Linux Daniel Schultz
2024-11-11 8:35 ` [PATCH 1/2] board: phytec: common: Add product information to FTD Wadim Egorov
0 siblings, 2 replies; 5+ messages in thread
From: Daniel Schultz @ 2024-11-08 18:19 UTC (permalink / raw)
To: w.egorov, trini, u-boot; +Cc: d-gole, upstream, Daniel Schultz
ft_board_setup inside the board code allows to alter
device-tree during the boot process.
Introduce a new function for the PHYTEC SOM detection
to read the product name and part number from the EEPROM
content and include both into the device-tree as
* phytec,som-part-number
* phytec,som-product-name
This function can be called from the board code when those
values should be exposed to Linux.
Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
board/phytec/common/phytec_som_detection.c | 204 ++++++++++++++++-----
board/phytec/common/phytec_som_detection.h | 7 +
2 files changed, 168 insertions(+), 43 deletions(-)
diff --git a/board/phytec/common/phytec_som_detection.c b/board/phytec/common/phytec_som_detection.c
index 166c3eae565..ea439be5163 100644
--- a/board/phytec/common/phytec_som_detection.c
+++ b/board/phytec/common/phytec_som_detection.c
@@ -271,11 +271,126 @@ err:
return ret;
}
+static int phytec_get_product_name(struct phytec_eeprom_data *data,
+ char *product)
+{
+ struct phytec_api2_data *api2;
+ unsigned int ksp_no, som_type;
+ int len;
+
+ if (!data)
+ data = &eeprom_data;
+
+ if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
+ return -EINVAL;
+
+ api2 = &data->payload.data.data_api2;
+
+ if (api2->som_type > 1 && api2->som_type <= 3) {
+ ksp_no = (api2->ksp_no << 8) | api2->som_no;
+ len = snprintf(product, PHYTEC_PRODUCT_NAME_LEN, "%s-%04u",
+ phytec_som_type_str[api2->som_type], ksp_no);
+ if (len != 8)
+ return -1;
+ return 0;
+ }
+
+ switch (api2->som_type) {
+ case 0:
+ som_type = api2->som_type;
+ break;
+ case 4:
+ som_type = 0;
+ break;
+ case 5:
+ som_type = 0;
+ break;
+ case 6:
+ som_type = 1;
+ break;
+ case 7:
+ som_type = 1;
+ break;
+ default:
+ pr_err("%s: Invalid SOM type: %i", __func__, api2->som_type);
+ return -EINVAL;
+ };
+
+ len = snprintf(product, PHYTEC_PRODUCT_NAME_LEN, "%s-%03u",
+ phytec_som_type_str[som_type], api2->som_no);
+ if (len != 7)
+ return -1;
+ return 0;
+}
+
+static int phytec_get_part_number(struct phytec_eeprom_data *data,
+ char *part)
+{
+ char product_name[PHYTEC_PRODUCT_NAME_LEN] = {'\0'};
+ struct phytec_api2_data *api2;
+ unsigned int ksp_type;
+ int res, len;
+
+ if (!data)
+ data = &eeprom_data;
+
+ if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
+ return -EINVAL;
+
+ api2 = &data->payload.data.data_api2;
+
+ res = phytec_get_product_name(data, product_name);
+ if (res)
+ return res;
+
+ if (api2->som_type <= 1) {
+ len = snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s-%s.%s",
+ product_name, api2->opt, api2->bom_rev);
+ if (len < 11)
+ return -1;
+ return 0;
+ }
+ if (api2->som_type <= 3) {
+ snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s.%s", product_name,
+ api2->bom_rev);
+ if (len != 11)
+ return -1;
+ return 0;
+ }
+
+ switch (api2->som_type) {
+ case 4:
+ ksp_type = 3;
+ break;
+ case 5:
+ ksp_type = 2;
+ break;
+ case 6:
+ ksp_type = 3;
+ break;
+ case 7:
+ ksp_type = 2;
+ break;
+ default:
+ pr_err("%s: Invalid SOM type: %i", __func__, api2->som_type);
+ return -EINVAL;
+ };
+
+ len = snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s-%s%02u.%s",
+ product_name, phytec_som_type_str[ksp_type],
+ api2->ksp_no, api2->bom_rev);
+ if (len < 16)
+ return -1;
+
+ return 0;
+}
+
void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data *data)
{
+ char part_number[PHYTEC_PART_NUMBER_LEN] = {'\0'};
struct phytec_api2_data *api2;
char pcb_sub_rev;
- unsigned int ksp_no, sub_som_type1, sub_som_type2;
+ int res;
if (!data)
data = &eeprom_data;
@@ -289,50 +404,14 @@ void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data *data)
pcb_sub_rev = api2->pcb_sub_opt_rev & 0x0f;
pcb_sub_rev = pcb_sub_rev ? ((pcb_sub_rev - 1) + 'a') : ' ';
- /* print standard product string */
- if (api2->som_type <= 1) {
- printf("SoM: %s-%03u-%s.%s PCB rev: %u%c\n",
- phytec_som_type_str[api2->som_type], api2->som_no,
- api2->opt, api2->bom_rev, api2->pcb_rev, pcb_sub_rev);
+ res = phytec_get_part_number(data, part_number);
+ if (res)
return;
- }
- /* print KSP/KSM string */
- if (api2->som_type <= 3) {
- ksp_no = (api2->ksp_no << 8) | api2->som_no;
- printf("SoM: %s-%u ",
- phytec_som_type_str[api2->som_type], ksp_no);
- /* print standard product based KSP/KSM strings */
- } else {
- switch (api2->som_type) {
- case 4:
- sub_som_type1 = 0;
- sub_som_type2 = 3;
- break;
- case 5:
- sub_som_type1 = 0;
- sub_som_type2 = 2;
- break;
- case 6:
- sub_som_type1 = 1;
- sub_som_type2 = 3;
- break;
- case 7:
- sub_som_type1 = 1;
- sub_som_type2 = 2;
- break;
- default:
- pr_err("%s: Invalid SoM type: %i", __func__, api2->som_type);
- return;
- };
-
- printf("SoM: %s-%03u-%s-%03u ",
- phytec_som_type_str[sub_som_type1],
- api2->som_no, phytec_som_type_str[sub_som_type2],
- api2->ksp_no);
- }
- printf("Option: %s BOM rev: %s PCB rev: %u%c\n", api2->opt,
- api2->bom_rev, api2->pcb_rev, pcb_sub_rev);
+ printf("SOM: %s\n", part_number);
+ printf("PCB Rev.: %u%c\n", api2->pcb_rev, pcb_sub_rev);
+ if (api2->som_type > 1)
+ printf("Options: %s\n", api2->opt);
}
char * __maybe_unused phytec_get_opt(struct phytec_eeprom_data *data)
@@ -379,6 +458,38 @@ u8 __maybe_unused phytec_get_som_type(struct phytec_eeprom_data *data)
return data->payload.data.data_api2.som_type;
}
+#if IS_ENABLED(CONFIG_OF_LIBFDT)
+int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob,
+ struct bd_info *bd)
+{
+ char product_name[PHYTEC_PRODUCT_NAME_LEN] = {'\0'};
+ char part_number[PHYTEC_PART_NUMBER_LEN] = {'\0'};
+ int res;
+
+ if (!data)
+ data = &eeprom_data;
+
+ if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
+ return -EINVAL;
+
+ res = phytec_get_product_name(data, product_name);
+ if (res)
+ return res;
+
+ fdt_setprop(blob, 0, "phytec,som-product-name", product_name,
+ strlen(product_name) + 1);
+
+ res = phytec_get_part_number(data, part_number);
+ if (res)
+ return res;
+
+ fdt_setprop(blob, 0, "phytec,som-part-number", part_number,
+ strlen(part_number) + 1);
+
+ return 0;
+}
+#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
+
#if IS_ENABLED(CONFIG_CMD_EXTENSION)
struct extension *phytec_add_extension(const char *name, const char *overlay,
const char *other)
@@ -458,6 +569,13 @@ inline struct phytec_api3_element * __maybe_unused
return NULL;
}
+#if IS_ENABLED(CONFIG_OF_LIBFDT)
+inline int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob,
+ struct bd_info *bd)
+{
+ return 0;
+}
+#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
#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 5e35a13cb21..db232cdec48 100644
--- a/board/phytec/common/phytec_som_detection.h
+++ b/board/phytec/common/phytec_som_detection.h
@@ -8,6 +8,7 @@
#define _PHYTEC_SOM_DETECTION_H
#include "phytec_som_detection_blocks.h"
+#include <fdtdec.h>
#define PHYTEC_MAX_OPTIONS 17
#define PHYTEC_EEPROM_INVAL 0xff
@@ -17,6 +18,9 @@
#define PHYTEC_GET_OPTION(option) \
(((option) > '9') ? (option) - 'A' + 10 : (option) - '0')
+#define PHYTEC_PRODUCT_NAME_LEN 8 + 1
+#define PHYTEC_PART_NUMBER_LEN PHYTEC_PRODUCT_NAME_LEN + 14 + 1
+
enum {
PHYTEC_API_REV0 = 0,
PHYTEC_API_REV1,
@@ -86,6 +90,9 @@ void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data *data);
char * __maybe_unused phytec_get_opt(struct phytec_eeprom_data *data);
u8 __maybe_unused phytec_get_rev(struct phytec_eeprom_data *data);
u8 __maybe_unused phytec_get_som_type(struct phytec_eeprom_data *data);
+#if IS_ENABLED(CONFIG_OF_LIBFDT)
+int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob, struct bd_info *bd);
+#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
#if IS_ENABLED(CONFIG_CMD_EXTENSION)
struct extension *phytec_add_extension(const char *name, const char *overlay,
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/2] board: phytec: common: k3: Expose product infos to Linux
2024-11-08 18:19 [PATCH 1/2] board: phytec: common: Add product information to FTD Daniel Schultz
@ 2024-11-08 18:19 ` Daniel Schultz
2024-11-11 8:20 ` Wadim Egorov
2024-11-11 8:35 ` [PATCH 1/2] board: phytec: common: Add product information to FTD Wadim Egorov
1 sibling, 1 reply; 5+ messages in thread
From: Daniel Schultz @ 2024-11-08 18:19 UTC (permalink / raw)
To: w.egorov, trini, u-boot; +Cc: d-gole, upstream, Daniel Schultz
Call 'phytec_ft_board_fixup' in the common K3 board code
to expose the product name and part number to Linux.
Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
---
board/phytec/common/k3/board.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/board/phytec/common/k3/board.c b/board/phytec/common/k3/board.c
index 3d7e090ccaa..14a10f34e53 100644
--- a/board/phytec/common/k3/board.c
+++ b/board/phytec/common/k3/board.c
@@ -99,8 +99,22 @@ int board_late_init(void)
#if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP)
int ft_board_setup(void *blob, struct bd_info *bd)
{
+ struct phytec_eeprom_data data;
+ int ret;
+
fdt_copy_fixed_partitions(blob);
+ ret = phytec_eeprom_data_setup(&data, 0, EEPROM_ADDR);
+ if (ret || !data.valid)
+ return 0;
+
+ ret = phytec_ft_board_fixup(&data, blob, bd);
+ if (ret) {
+ pr_err("%s: Failed to add PHYTEC information to fdt.\n",
+ __func__);
+ return 0;
+ }
+
return 0;
}
#endif
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH 2/2] board: phytec: common: k3: Expose product infos to Linux
2024-11-08 18:19 ` [PATCH 2/2] board: phytec: common: k3: Expose product infos to Linux Daniel Schultz
@ 2024-11-11 8:20 ` Wadim Egorov
0 siblings, 0 replies; 5+ messages in thread
From: Wadim Egorov @ 2024-11-11 8:20 UTC (permalink / raw)
To: Daniel Schultz, trini, u-boot; +Cc: d-gole, upstream
Am 08.11.24 um 19:19 schrieb Daniel Schultz:
> Call 'phytec_ft_board_fixup' in the common K3 board code
> to expose the product name and part number to Linux.
>
> Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
> ---
> board/phytec/common/k3/board.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/board/phytec/common/k3/board.c b/board/phytec/common/k3/board.c
> index 3d7e090ccaa..14a10f34e53 100644
> --- a/board/phytec/common/k3/board.c
> +++ b/board/phytec/common/k3/board.c
> @@ -99,8 +99,22 @@ int board_late_init(void)
> #if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP)
> int ft_board_setup(void *blob, struct bd_info *bd)
> {
> + struct phytec_eeprom_data data;
> + int ret;
> +
> fdt_copy_fixed_partitions(blob);
>
> + ret = phytec_eeprom_data_setup(&data, 0, EEPROM_ADDR);
> + if (ret || !data.valid)
> + return 0;
> +
> + ret = phytec_ft_board_fixup(&data, blob, bd);
> + if (ret) {
> + pr_err("%s: Failed to add PHYTEC information to fdt.\n",
> + __func__);
> + return 0;
This return is not needed. Other than that, the patch looks good to me.
Reviewed-by: Wadim Egorov <w.egorov@phytec.de>
> + }
> +
> return 0;
> }
> #endif
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] board: phytec: common: Add product information to FTD
2024-11-08 18:19 [PATCH 1/2] board: phytec: common: Add product information to FTD Daniel Schultz
2024-11-08 18:19 ` [PATCH 2/2] board: phytec: common: k3: Expose product infos to Linux Daniel Schultz
@ 2024-11-11 8:35 ` Wadim Egorov
2025-01-15 10:36 ` Daniel Schultz
1 sibling, 1 reply; 5+ messages in thread
From: Wadim Egorov @ 2024-11-11 8:35 UTC (permalink / raw)
To: Daniel Schultz, trini, u-boot; +Cc: d-gole, upstream
Am 08.11.24 um 19:19 schrieb Daniel Schultz:
> ft_board_setup inside the board code allows to alter
> device-tree during the boot process.
>
> Introduce a new function for the PHYTEC SOM detection
> to read the product name and part number from the EEPROM
> content and include both into the device-tree as
> * phytec,som-part-number
> * phytec,som-product-name
>
> This function can be called from the board code when those
> values should be exposed to Linux.
>
> Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
> ---
> board/phytec/common/phytec_som_detection.c | 204 ++++++++++++++++-----
> board/phytec/common/phytec_som_detection.h | 7 +
> 2 files changed, 168 insertions(+), 43 deletions(-)
>
> diff --git a/board/phytec/common/phytec_som_detection.c b/board/phytec/common/phytec_som_detection.c
> index 166c3eae565..ea439be5163 100644
> --- a/board/phytec/common/phytec_som_detection.c
> +++ b/board/phytec/common/phytec_som_detection.c
> @@ -271,11 +271,126 @@ err:
> return ret;
> }
>
> +static int phytec_get_product_name(struct phytec_eeprom_data *data,
> + char *product)
> +{
> + struct phytec_api2_data *api2;
> + unsigned int ksp_no, som_type;
> + int len;
> +
> + if (!data)
> + data = &eeprom_data;
> +
> + if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
> + return -EINVAL;
> +
> + api2 = &data->payload.data.data_api2;
> +
> + if (api2->som_type > 1 && api2->som_type <= 3) {
> + ksp_no = (api2->ksp_no << 8) | api2->som_no;
> + len = snprintf(product, PHYTEC_PRODUCT_NAME_LEN, "%s-%04u",
> + phytec_som_type_str[api2->som_type], ksp_no);
> + if (len != 8)
> + return -1;
> + return 0;
> + }
> +
> + switch (api2->som_type) {
> + case 0:
> + som_type = api2->som_type;
> + break;
> + case 4:
> + som_type = 0;
> + break;
> + case 5:
> + som_type = 0;
> + break;
> + case 6:
> + som_type = 1;
> + break;
> + case 7:
> + som_type = 1;
> + break;
> + default:
> + pr_err("%s: Invalid SOM type: %i", __func__, api2->som_type);
> + return -EINVAL;
> + };
> +
> + len = snprintf(product, PHYTEC_PRODUCT_NAME_LEN, "%s-%03u",
> + phytec_som_type_str[som_type], api2->som_no);
> + if (len != 7)
> + return -1;
> + return 0;
> +}
> +
> +static int phytec_get_part_number(struct phytec_eeprom_data *data,
> + char *part)
> +{
> + char product_name[PHYTEC_PRODUCT_NAME_LEN] = {'\0'};
> + struct phytec_api2_data *api2;
> + unsigned int ksp_type;
> + int res, len;
> +
> + if (!data)
> + data = &eeprom_data;
> +
> + if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
> + return -EINVAL;
> +
> + api2 = &data->payload.data.data_api2;
> +
> + res = phytec_get_product_name(data, product_name);
> + if (res)
> + return res;
> +
> + if (api2->som_type <= 1) {
> + len = snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s-%s.%s",
> + product_name, api2->opt, api2->bom_rev);
> + if (len < 11)
> + return -1;
> + return 0;
> + }
> + if (api2->som_type <= 3) {
> + snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s.%s", product_name,
> + api2->bom_rev);
> + if (len != 11)
> + return -1;
> + return 0;
> + }
> +
> + switch (api2->som_type) {
> + case 4:
> + ksp_type = 3;
> + break;
> + case 5:
> + ksp_type = 2;
> + break;
> + case 6:
> + ksp_type = 3;
> + break;
> + case 7:
> + ksp_type = 2;
> + break;
> + default:
> + pr_err("%s: Invalid SOM type: %i", __func__, api2->som_type);
> + return -EINVAL;
> + };
> +
> + len = snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s-%s%02u.%s",
> + product_name, phytec_som_type_str[ksp_type],
> + api2->ksp_no, api2->bom_rev);
> + if (len < 16)
> + return -1;
> +
> + return 0;
> +}
> +
> void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data *data)
> {
> + char part_number[PHYTEC_PART_NUMBER_LEN] = {'\0'};
> struct phytec_api2_data *api2;
> char pcb_sub_rev;
> - unsigned int ksp_no, sub_som_type1, sub_som_type2;
> + int res;
>
> if (!data)
> data = &eeprom_data;
> @@ -289,50 +404,14 @@ void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data *data)
> pcb_sub_rev = api2->pcb_sub_opt_rev & 0x0f;
> pcb_sub_rev = pcb_sub_rev ? ((pcb_sub_rev - 1) + 'a') : ' ';
>
> - /* print standard product string */
> - if (api2->som_type <= 1) {
> - printf("SoM: %s-%03u-%s.%s PCB rev: %u%c\n",
> - phytec_som_type_str[api2->som_type], api2->som_no,
> - api2->opt, api2->bom_rev, api2->pcb_rev, pcb_sub_rev);
> + res = phytec_get_part_number(data, part_number);
> + if (res)
> return;
> - }
> - /* print KSP/KSM string */
> - if (api2->som_type <= 3) {
> - ksp_no = (api2->ksp_no << 8) | api2->som_no;
> - printf("SoM: %s-%u ",
> - phytec_som_type_str[api2->som_type], ksp_no);
> - /* print standard product based KSP/KSM strings */
> - } else {
> - switch (api2->som_type) {
> - case 4:
> - sub_som_type1 = 0;
> - sub_som_type2 = 3;
> - break;
> - case 5:
> - sub_som_type1 = 0;
> - sub_som_type2 = 2;
> - break;
> - case 6:
> - sub_som_type1 = 1;
> - sub_som_type2 = 3;
> - break;
> - case 7:
> - sub_som_type1 = 1;
> - sub_som_type2 = 2;
> - break;
> - default:
> - pr_err("%s: Invalid SoM type: %i", __func__, api2->som_type);
> - return;
> - };
> -
> - printf("SoM: %s-%03u-%s-%03u ",
> - phytec_som_type_str[sub_som_type1],
> - api2->som_no, phytec_som_type_str[sub_som_type2],
> - api2->ksp_no);
> - }
>
> - printf("Option: %s BOM rev: %s PCB rev: %u%c\n", api2->opt,
> - api2->bom_rev, api2->pcb_rev, pcb_sub_rev);
> + printf("SOM: %s\n", part_number);
> + printf("PCB Rev.: %u%c\n", api2->pcb_rev, pcb_sub_rev);
> + if (api2->som_type > 1)
> + printf("Options: %s\n", api2->opt);
> }
>
> char * __maybe_unused phytec_get_opt(struct phytec_eeprom_data *data)
> @@ -379,6 +458,38 @@ u8 __maybe_unused phytec_get_som_type(struct phytec_eeprom_data *data)
> return data->payload.data.data_api2.som_type;
> }
>
> +#if IS_ENABLED(CONFIG_OF_LIBFDT)
> +int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob,
> + struct bd_info *bd)
You are not using bd parameter. Please drop it.
> +{
> + char product_name[PHYTEC_PRODUCT_NAME_LEN] = {'\0'};
> + char part_number[PHYTEC_PART_NUMBER_LEN] = {'\0'};
> + int res;
> +
> + if (!data)
> + data = &eeprom_data;
> +
> + if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
> + return -EINVAL;
The checks above are already made in phytec_get_part_number() and
phytec_get_part_number().
> +
> + res = phytec_get_product_name(data, product_name);
> + if (res)
> + return res;
> +
> + fdt_setprop(blob, 0, "phytec,som-product-name", product_name,
> + strlen(product_name) + 1);
> +
> + res = phytec_get_part_number(data, part_number);
> + if (res)
> + return res;
> +
> + fdt_setprop(blob, 0, "phytec,som-part-number", part_number,
> + strlen(part_number) + 1);
> +
> + return 0;
> +}
> +#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
> +
> #if IS_ENABLED(CONFIG_CMD_EXTENSION)
> struct extension *phytec_add_extension(const char *name, const char *overlay,
> const char *other)
> @@ -458,6 +569,13 @@ inline struct phytec_api3_element * __maybe_unused
> return NULL;
> }
>
> +#if IS_ENABLED(CONFIG_OF_LIBFDT)
> +inline int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob,
> + struct bd_info *bd)
> +{
> + return 0;
> +}
> +#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
> #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 5e35a13cb21..db232cdec48 100644
> --- a/board/phytec/common/phytec_som_detection.h
> +++ b/board/phytec/common/phytec_som_detection.h
> @@ -8,6 +8,7 @@
> #define _PHYTEC_SOM_DETECTION_H
>
> #include "phytec_som_detection_blocks.h"
> +#include <fdtdec.h>
>
> #define PHYTEC_MAX_OPTIONS 17
> #define PHYTEC_EEPROM_INVAL 0xff
> @@ -17,6 +18,9 @@
> #define PHYTEC_GET_OPTION(option) \
> (((option) > '9') ? (option) - 'A' + 10 : (option) - '0')
>
> +#define PHYTEC_PRODUCT_NAME_LEN 8 + 1
> +#define PHYTEC_PART_NUMBER_LEN PHYTEC_PRODUCT_NAME_LEN + 14 + 1
> +
> enum {
> PHYTEC_API_REV0 = 0,
> PHYTEC_API_REV1,
> @@ -86,6 +90,9 @@ void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data *data);
> char * __maybe_unused phytec_get_opt(struct phytec_eeprom_data *data);
> u8 __maybe_unused phytec_get_rev(struct phytec_eeprom_data *data);
> u8 __maybe_unused phytec_get_som_type(struct phytec_eeprom_data *data);
> +#if IS_ENABLED(CONFIG_OF_LIBFDT)
> +int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob, struct bd_info *bd);
> +#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
>
> #if IS_ENABLED(CONFIG_CMD_EXTENSION)
> struct extension *phytec_add_extension(const char *name, const char *overlay,
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH 1/2] board: phytec: common: Add product information to FTD
2024-11-11 8:35 ` [PATCH 1/2] board: phytec: common: Add product information to FTD Wadim Egorov
@ 2025-01-15 10:36 ` Daniel Schultz
0 siblings, 0 replies; 5+ messages in thread
From: Daniel Schultz @ 2025-01-15 10:36 UTC (permalink / raw)
To: Wadim Egorov, trini@konsulko.com, u-boot@lists.denx.de
Cc: d-gole@ti.com, upstream@lists.phytec.de
Hi Wadim,
On 11.11.24 09:35, Wadim Egorov wrote:
>
>
> Am 08.11.24 um 19:19 schrieb Daniel Schultz:
>> ft_board_setup inside the board code allows to alter
>> device-tree during the boot process.
>>
>> Introduce a new function for the PHYTEC SOM detection
>> to read the product name and part number from the EEPROM
>> content and include both into the device-tree as
>> * phytec,som-part-number
>> * phytec,som-product-name
>>
>> This function can be called from the board code when those
>> values should be exposed to Linux.
>>
>> Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
>> ---
>> board/phytec/common/phytec_som_detection.c | 204 ++++++++++++++++-----
>> board/phytec/common/phytec_som_detection.h | 7 +
>> 2 files changed, 168 insertions(+), 43 deletions(-)
>>
>> diff --git a/board/phytec/common/phytec_som_detection.c
>> b/board/phytec/common/phytec_som_detection.c
>> index 166c3eae565..ea439be5163 100644
>> --- a/board/phytec/common/phytec_som_detection.c
>> +++ b/board/phytec/common/phytec_som_detection.c
>> @@ -271,11 +271,126 @@ err:
>> return ret;
>> }
>> +static int phytec_get_product_name(struct phytec_eeprom_data *data,
>> + char *product)
>> +{
>> + struct phytec_api2_data *api2;
>> + unsigned int ksp_no, som_type;
>> + int len;
>> +
>> + if (!data)
>> + data = &eeprom_data;
>> +
>> + if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
>> + return -EINVAL;
>> +
>> + api2 = &data->payload.data.data_api2;
>> +
>> + if (api2->som_type > 1 && api2->som_type <= 3) {
>> + ksp_no = (api2->ksp_no << 8) | api2->som_no;
>> + len = snprintf(product, PHYTEC_PRODUCT_NAME_LEN, "%s-%04u",
>> + phytec_som_type_str[api2->som_type], ksp_no);
>> + if (len != 8)
>> + return -1;
>> + return 0;
>> + }
>> +
>> + switch (api2->som_type) {
>> + case 0:
>> + som_type = api2->som_type;
>> + break;
>> + case 4:
>> + som_type = 0;
>> + break;
>> + case 5:
>> + som_type = 0;
>> + break;
>> + case 6:
>> + som_type = 1;
>> + break;
>> + case 7:
>> + som_type = 1;
>> + break;
>> + default:
>> + pr_err("%s: Invalid SOM type: %i", __func__, api2->som_type);
>> + return -EINVAL;
>> + };
>> +
>> + len = snprintf(product, PHYTEC_PRODUCT_NAME_LEN, "%s-%03u",
>> + phytec_som_type_str[som_type], api2->som_no);
>> + if (len != 7)
>> + return -1;
>> + return 0;
>> +}
>> +
>> +static int phytec_get_part_number(struct phytec_eeprom_data *data,
>> + char *part)
>> +{
>> + char product_name[PHYTEC_PRODUCT_NAME_LEN] = {'\0'};
>> + struct phytec_api2_data *api2;
>> + unsigned int ksp_type;
>> + int res, len;
>> +
>> + if (!data)
>> + data = &eeprom_data;
>> +
>> + if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
>> + return -EINVAL;
>> +
>> + api2 = &data->payload.data.data_api2;
>> +
>> + res = phytec_get_product_name(data, product_name);
>> + if (res)
>> + return res;
>> +
>> + if (api2->som_type <= 1) {
>> + len = snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s-%s.%s",
>> + product_name, api2->opt, api2->bom_rev);
>> + if (len < 11)
>> + return -1;
>> + return 0;
>> + }
>> + if (api2->som_type <= 3) {
>> + snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s.%s", product_name,
>> + api2->bom_rev);
>> + if (len != 11)
>> + return -1;
>> + return 0;
>> + }
>> +
>> + switch (api2->som_type) {
>> + case 4:
>> + ksp_type = 3;
>> + break;
>> + case 5:
>> + ksp_type = 2;
>> + break;
>> + case 6:
>> + ksp_type = 3;
>> + break;
>> + case 7:
>> + ksp_type = 2;
>> + break;
>> + default:
>> + pr_err("%s: Invalid SOM type: %i", __func__, api2->som_type);
>> + return -EINVAL;
>> + };
>> +
>> + len = snprintf(part, PHYTEC_PART_NUMBER_LEN, "%s-%s%02u.%s",
>> + product_name, phytec_som_type_str[ksp_type],
>> + api2->ksp_no, api2->bom_rev);
>> + if (len < 16)
>> + return -1;
>> +
>> + return 0;
>> +}
>> +
>> void __maybe_unused phytec_print_som_info(struct phytec_eeprom_data
>> *data)
>> {
>> + char part_number[PHYTEC_PART_NUMBER_LEN] = {'\0'};
>> struct phytec_api2_data *api2;
>> char pcb_sub_rev;
>> - unsigned int ksp_no, sub_som_type1, sub_som_type2;
>> + int res;
>> if (!data)
>> data = &eeprom_data;
>> @@ -289,50 +404,14 @@ void __maybe_unused
>> phytec_print_som_info(struct phytec_eeprom_data *data)
>> pcb_sub_rev = api2->pcb_sub_opt_rev & 0x0f;
>> pcb_sub_rev = pcb_sub_rev ? ((pcb_sub_rev - 1) + 'a') : ' ';
>> - /* print standard product string */
>> - if (api2->som_type <= 1) {
>> - printf("SoM: %s-%03u-%s.%s PCB rev: %u%c\n",
>> - phytec_som_type_str[api2->som_type], api2->som_no,
>> - api2->opt, api2->bom_rev, api2->pcb_rev, pcb_sub_rev);
>> + res = phytec_get_part_number(data, part_number);
>> + if (res)
>> return;
>> - }
>> - /* print KSP/KSM string */
>> - if (api2->som_type <= 3) {
>> - ksp_no = (api2->ksp_no << 8) | api2->som_no;
>> - printf("SoM: %s-%u ",
>> - phytec_som_type_str[api2->som_type], ksp_no);
>> - /* print standard product based KSP/KSM strings */
>> - } else {
>> - switch (api2->som_type) {
>> - case 4:
>> - sub_som_type1 = 0;
>> - sub_som_type2 = 3;
>> - break;
>> - case 5:
>> - sub_som_type1 = 0;
>> - sub_som_type2 = 2;
>> - break;
>> - case 6:
>> - sub_som_type1 = 1;
>> - sub_som_type2 = 3;
>> - break;
>> - case 7:
>> - sub_som_type1 = 1;
>> - sub_som_type2 = 2;
>> - break;
>> - default:
>> - pr_err("%s: Invalid SoM type: %i", __func__,
>> api2->som_type);
>> - return;
>> - };
>> -
>> - printf("SoM: %s-%03u-%s-%03u ",
>> - phytec_som_type_str[sub_som_type1],
>> - api2->som_no, phytec_som_type_str[sub_som_type2],
>> - api2->ksp_no);
>> - }
>> - printf("Option: %s BOM rev: %s PCB rev: %u%c\n", api2->opt,
>> - api2->bom_rev, api2->pcb_rev, pcb_sub_rev);
>> + printf("SOM: %s\n", part_number);
>> + printf("PCB Rev.: %u%c\n", api2->pcb_rev, pcb_sub_rev);
>> + if (api2->som_type > 1)
>> + printf("Options: %s\n", api2->opt);
>> }
>> char * __maybe_unused phytec_get_opt(struct phytec_eeprom_data
>> *data)
>> @@ -379,6 +458,38 @@ u8 __maybe_unused phytec_get_som_type(struct
>> phytec_eeprom_data *data)
>> return data->payload.data.data_api2.som_type;
>> }
>> +#if IS_ENABLED(CONFIG_OF_LIBFDT)
>> +int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void *blob,
>> + struct bd_info *bd)
>
> You are not using bd parameter. Please drop it.
>
>
>> +{
>> + char product_name[PHYTEC_PRODUCT_NAME_LEN] = {'\0'};
>> + char part_number[PHYTEC_PART_NUMBER_LEN] = {'\0'};
>> + int res;
>> +
>> + if (!data)
>> + data = &eeprom_data;
>> +
>> + if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
>> + return -EINVAL;
>
> The checks above are already made in phytec_get_part_number() and
> phytec_get_part_number().
This function gets called from outside and should always check whether
these data are valid.
- Daniel
>
>
>
>> +
>> + res = phytec_get_product_name(data, product_name);
>> + if (res)
>> + return res;
>> +
>> + fdt_setprop(blob, 0, "phytec,som-product-name", product_name,
>> + strlen(product_name) + 1);
>> +
>> + res = phytec_get_part_number(data, part_number);
>> + if (res)
>> + return res;
>> +
>> + fdt_setprop(blob, 0, "phytec,som-part-number", part_number,
>> + strlen(part_number) + 1);
>> +
>> + return 0;
>> +}
>> +#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
>> +
>> #if IS_ENABLED(CONFIG_CMD_EXTENSION)
>> struct extension *phytec_add_extension(const char *name, const char
>> *overlay,
>> const char *other)
>> @@ -458,6 +569,13 @@ inline struct phytec_api3_element * __maybe_unused
>> return NULL;
>> }
>> +#if IS_ENABLED(CONFIG_OF_LIBFDT)
>> +inline int phytec_ft_board_fixup(struct phytec_eeprom_data *data,
>> void *blob,
>> + struct bd_info *bd)
>> +{
>> + return 0;
>> +}
>> +#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
>> #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 5e35a13cb21..db232cdec48 100644
>> --- a/board/phytec/common/phytec_som_detection.h
>> +++ b/board/phytec/common/phytec_som_detection.h
>> @@ -8,6 +8,7 @@
>> #define _PHYTEC_SOM_DETECTION_H
>> #include "phytec_som_detection_blocks.h"
>> +#include <fdtdec.h>
>> #define PHYTEC_MAX_OPTIONS 17
>> #define PHYTEC_EEPROM_INVAL 0xff
>> @@ -17,6 +18,9 @@
>> #define PHYTEC_GET_OPTION(option) \
>> (((option) > '9') ? (option) - 'A' + 10 : (option) - '0')
>> +#define PHYTEC_PRODUCT_NAME_LEN 8 + 1
>> +#define PHYTEC_PART_NUMBER_LEN PHYTEC_PRODUCT_NAME_LEN + 14 + 1
>> +
>> enum {
>> PHYTEC_API_REV0 = 0,
>> PHYTEC_API_REV1,
>> @@ -86,6 +90,9 @@ void __maybe_unused phytec_print_som_info(struct
>> phytec_eeprom_data *data);
>> char * __maybe_unused phytec_get_opt(struct phytec_eeprom_data *data);
>> u8 __maybe_unused phytec_get_rev(struct phytec_eeprom_data *data);
>> u8 __maybe_unused phytec_get_som_type(struct phytec_eeprom_data
>> *data);
>> +#if IS_ENABLED(CONFIG_OF_LIBFDT)
>> +int phytec_ft_board_fixup(struct phytec_eeprom_data *data, void
>> *blob, struct bd_info *bd);
>> +#endif /* IS_ENABLED(CONFIG_OF_LIBFDT) */
>> #if IS_ENABLED(CONFIG_CMD_EXTENSION)
>> struct extension *phytec_add_extension(const char *name, const char
>> *overlay,
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-01-15 10:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-08 18:19 [PATCH 1/2] board: phytec: common: Add product information to FTD Daniel Schultz
2024-11-08 18:19 ` [PATCH 2/2] board: phytec: common: k3: Expose product infos to Linux Daniel Schultz
2024-11-11 8:20 ` Wadim Egorov
2024-11-11 8:35 ` [PATCH 1/2] board: phytec: common: Add product information to FTD Wadim Egorov
2025-01-15 10:36 ` Daniel Schultz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox