[PATCH 1/2] xilinx: Wire uuid reading from FRU

UUID is already recorded when FRU is parsed but it is not copied to local structures and exported to variable that's why simply add it. Data is saved in binary format but there must be conversion to string for exporting it to variable and string should be in uuid format too.
One way how to use it directly is to setup pxeuuid based on it. For example via preboot with "setenv pxeuuid ${board_uuid}"
Signed-off-by: Michal Simek michal.simek@amd.com ---
Happy to hear if there is more elagant way how to generate uuid string. --- board/xilinx/common/board.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c index 5f2afb9def4e..b0c11aaa4256 100644 --- a/board/xilinx/common/board.c +++ b/board/xilinx/common/board.c @@ -23,6 +23,7 @@ #include <soc.h> #include <linux/ctype.h> #include <linux/kernel.h> +#include <uuid.h>
#include "fru.h"
@@ -86,6 +87,7 @@ int zynq_board_read_rom_ethaddr(unsigned char *ethaddr) #define EEPROM_HDR_SERIAL_LEN 20 #define EEPROM_HDR_NO_OF_MAC_ADDR 4 #define EEPROM_HDR_ETH_ALEN ETH_ALEN +#define EEPROM_HDR_UUID_LEN 16
struct xilinx_board_description { u32 header; @@ -94,6 +96,7 @@ struct xilinx_board_description { char revision[EEPROM_HDR_REV_LEN + 1]; char serial[EEPROM_HDR_SERIAL_LEN + 1]; u8 mac_addr[EEPROM_HDR_NO_OF_MAC_ADDR][EEPROM_HDR_ETH_ALEN + 1]; + char uuid[EEPROM_HDR_UUID_LEN + 1]; };
static int highest_id = -1; @@ -237,6 +240,8 @@ static int xilinx_read_eeprom_fru(struct udevice *dev, char *name, /* It is clear that FRU was captured and structures were filled */ strncpy(desc->manufacturer, (char *)fru_data.brd.manufacturer_name, sizeof(desc->manufacturer)); + strncpy(desc->uuid, (char *)fru_data.brd.uuid, + sizeof(desc->uuid)); strncpy(desc->name, (char *)fru_data.brd.product_name, sizeof(desc->name)); for (i = 0; i < sizeof(desc->name); i++) { @@ -452,6 +457,19 @@ int board_late_init_xilinx(void) ret |= env_set_by_index("serial", id, desc->serial);
+ if (desc->uuid[0]) { + char uuid[UUID_STR_LEN + 1]; + char *t = desc->uuid; + + memset(uuid, 0, UUID_STR_LEN + 1); + + sprintf(uuid, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + t[0], t[1], t[2], t[3], t[4], t[5], + t[6], t[7], t[8], t[9], t[10], t[11], + t[12], t[13], t[14], t[15]); + ret |= env_set_by_index("uuid", id, uuid); + } + if (!CONFIG_IS_ENABLED(NET)) continue;

It is recommendation done by checkpatch to all the time have \0 terminated strings.
Signed-off-by: Michal Simek michal.simek@amd.com ---
board/xilinx/common/board.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c index b0c11aaa4256..9b4aded466ab 100644 --- a/board/xilinx/common/board.c +++ b/board/xilinx/common/board.c @@ -238,23 +238,23 @@ static int xilinx_read_eeprom_fru(struct udevice *dev, char *name, }
/* It is clear that FRU was captured and structures were filled */ - strncpy(desc->manufacturer, (char *)fru_data.brd.manufacturer_name, + strlcpy(desc->manufacturer, (char *)fru_data.brd.manufacturer_name, sizeof(desc->manufacturer)); - strncpy(desc->uuid, (char *)fru_data.brd.uuid, + strlcpy(desc->uuid, (char *)fru_data.brd.uuid, sizeof(desc->uuid)); - strncpy(desc->name, (char *)fru_data.brd.product_name, + strlcpy(desc->name, (char *)fru_data.brd.product_name, sizeof(desc->name)); for (i = 0; i < sizeof(desc->name); i++) { if (desc->name[i] == ' ') desc->name[i] = '\0'; } - strncpy(desc->revision, (char *)fru_data.brd.rev, + strlcpy(desc->revision, (char *)fru_data.brd.rev, sizeof(desc->revision)); for (i = 0; i < sizeof(desc->revision); i++) { if (desc->revision[i] == ' ') desc->revision[i] = '\0'; } - strncpy(desc->serial, (char *)fru_data.brd.serial_number, + strlcpy(desc->serial, (char *)fru_data.brd.serial_number, sizeof(desc->serial));
while (id < EEPROM_HDR_NO_OF_MAC_ADDR) {

On 7/21/22 16:19, Michal Simek wrote:
UUID is already recorded when FRU is parsed but it is not copied to local structures and exported to variable that's why simply add it. Data is saved in binary format but there must be conversion to string for exporting it to variable and string should be in uuid format too.
One way how to use it directly is to setup pxeuuid based on it. For example via preboot with "setenv pxeuuid ${board_uuid}"
Signed-off-by: Michal Simek michal.simek@amd.com
Happy to hear if there is more elagant way how to generate uuid string.
board/xilinx/common/board.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c index 5f2afb9def4e..b0c11aaa4256 100644 --- a/board/xilinx/common/board.c +++ b/board/xilinx/common/board.c @@ -23,6 +23,7 @@ #include <soc.h> #include <linux/ctype.h> #include <linux/kernel.h> +#include <uuid.h>
#include "fru.h"
@@ -86,6 +87,7 @@ int zynq_board_read_rom_ethaddr(unsigned char *ethaddr) #define EEPROM_HDR_SERIAL_LEN 20 #define EEPROM_HDR_NO_OF_MAC_ADDR 4 #define EEPROM_HDR_ETH_ALEN ETH_ALEN +#define EEPROM_HDR_UUID_LEN 16
struct xilinx_board_description { u32 header; @@ -94,6 +96,7 @@ struct xilinx_board_description { char revision[EEPROM_HDR_REV_LEN + 1]; char serial[EEPROM_HDR_SERIAL_LEN + 1]; u8 mac_addr[EEPROM_HDR_NO_OF_MAC_ADDR][EEPROM_HDR_ETH_ALEN + 1];
char uuid[EEPROM_HDR_UUID_LEN + 1]; };
static int highest_id = -1;
@@ -237,6 +240,8 @@ static int xilinx_read_eeprom_fru(struct udevice *dev, char *name, /* It is clear that FRU was captured and structures were filled */ strncpy(desc->manufacturer, (char *)fru_data.brd.manufacturer_name, sizeof(desc->manufacturer));
- strncpy(desc->uuid, (char *)fru_data.brd.uuid,
strncpy(desc->name, (char *)fru_data.brd.product_name, sizeof(desc->name)); for (i = 0; i < sizeof(desc->name); i++) {sizeof(desc->uuid));
@@ -452,6 +457,19 @@ int board_late_init_xilinx(void) ret |= env_set_by_index("serial", id, desc->serial);
if (desc->uuid[0]) {
char uuid[UUID_STR_LEN + 1];
char *t = desc->uuid;
memset(uuid, 0, UUID_STR_LEN + 1);
sprintf(uuid, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
t[0], t[1], t[2], t[3], t[4], t[5],
t[6], t[7], t[8], t[9], t[10], t[11],
t[12], t[13], t[14], t[15]);
ret |= env_set_by_index("uuid", id, uuid);
}
if (!CONFIG_IS_ENABLED(NET)) continue;
Applied. M
participants (1)
-
Michal Simek