Skip to content

Commit a68308f

Browse files
author
Sharath Kumar Dasari
committed
linux-image_update: Changes to work on both SOM/SC boards
1.Improved SOM/SC board validation string check in robust manner(CR:1179407) 2.ipmi-fru usage for SC boards Signed-off-by: Sharath Kumar Dasari <[email protected]>
1 parent 79d6690 commit a68308f

File tree

1 file changed

+108
-35
lines changed

1 file changed

+108
-35
lines changed

image_update.c

+108-35
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
// SPDX-License-Identifier: MIT
2-
/*
3-
* Xilinx Zynq MPSoC Firmware layer
4-
*
5-
* Copyright (C) 2021 Xilinx, Inc.
6-
*
7-
* Vikram Sreenivasa Batchali <bvikram@xilinx.com>
8-
*/
1+
/******************************************************************************
2+
* Copyright (c) 2021 - 2022 Xilinx, Inc. All rights reserved.
3+
* Copyright (c) 2022 - 2024, Advanced Micro Devices, Inc. All Rights Reserved.
4+
* SPDX-License-Identifier: MIT
5+
*
6+
* Vikram Sreenivasa Batchali <[email protected]>
7+
* Sharath Kumar Dasari <sharathk@amd.com>
8+
******************************************************************************/
99

1010
#include <fcntl.h>
1111
#include <mtd/mtd-user.h>
@@ -22,12 +22,30 @@
2222
#define XST_FAILURE (0x1)
2323

2424
/* Macros */
25-
#define SYS_CHECKSUM_OFFSET (0x3U)
25+
#define SYS_CHECKSUM_OFFSET (0x3U)
2626
#define XBIU_IDEN_STR_OFFSET (0x24U)
27-
#define XBIU_IDEN_STR_LEN (0x4U)
27+
#define XBIU_IDEN_STR_LEN (0x4U)
2828
#define XBIU_QSPI_MFG_INFO_SIZE (0x100U)
2929
#define XBIU_IMG_REVISON_OFFSET (0x70U)
3030
#define XBIU_IMG_REVISON_SIZE (0x24U)
31+
#define XBIU_NUM_BRDS (0x6U)
32+
#define XBIU_NUM_BRD_REVS (0x4U)
33+
#define XBIU_BRD_NAM_STR_LEN (0x8U)
34+
#define XBIU_BRD_REV_STR_LEN (0x4U)
35+
36+
struct board_list {
37+
char* brd_name; /* Name of the board */
38+
char* brd_rev[XBIU_NUM_BRD_REVS]; /* Board Revision */
39+
};
40+
41+
struct board_list brds[XBIU_NUM_BRDS] = {
42+
{"VPK120", "B01", "B02", "", ""},
43+
{"VPK180", "A01", "B01", "B02", ""},
44+
{"VHK158", "A01", "B01", "B02", ""},
45+
{"VEK280", "A01", "B01", "B02", "B03"},
46+
{"SMK-K26", "A", "B", "1", "2"},
47+
{"SMK-K24", "A", "B", "1", ""}
48+
};
3149

3250
/* The below enums denote persistent registers in Qspi Flash */
3351
struct sys_persistent_state {
@@ -240,13 +258,15 @@ int main(int argc, char *argv[])
240258
return XST_SUCCESS;
241259
}
242260

243-
244-
/* Validate board string to ensure the app does not run on
245-
* unsupported boards
246-
*/
247-
ret = validate_board_string();
248-
if (ret != XST_SUCCESS)
249-
return XST_FAILURE;
261+
if(update_flag == 1){
262+
printf("BootFw Image update started\n");
263+
/* Validate board string to ensure the app does not run on
264+
* unsupported boards
265+
*/
266+
ret = validate_board_string();
267+
if (ret != XST_SUCCESS)
268+
return XST_FAILURE;
269+
}
250270

251271
ret = verify_current_running_image("/dev/mtd2");
252272
if (ret != XST_SUCCESS) {
@@ -641,34 +661,87 @@ static int validate_board_string(void)
641661
{
642662
int ret = XST_FAILURE;
643663
FILE *fru;
644-
char revision[10U] = {0U};
645-
const char *cmd = "ipmi-fru \
646-
--fru-file=/sys/bus/i2c/devices/1-0050/eeprom \
647-
--interpret-oem-data | \
648-
awk -F\": \" \
649-
'/^ *FRU Board Custom*/ { print ($2); exit }'";
650-
651-
fru = popen(cmd, "r");
664+
char brd_nm[XBIU_BRD_NAM_STR_LEN];
665+
char brd_rv[XBIU_BRD_REV_STR_LEN];
666+
char *cmd_nm;
667+
char *cmd_rv;
668+
struct stat st;
669+
int i,j;
670+
671+
/*Check if the board is SOM or SC*/
672+
if(stat("/sys/bus/i2c/devices/1-0050/eeprom",&st) == 0)
673+
{
674+
cmd_nm = "ipmi-fru \
675+
--fru-file=/sys/bus/i2c/devices/1-0050/eeprom \
676+
--interpret-oem-data | \
677+
awk -F\": \" \
678+
'/^ *FRU Board Product Name*/ { print ($2); exit }'";
679+
cmd_rv = "ipmi-fru \
680+
--fru-file=/sys/bus/i2c/devices/1-0050/eeprom \
681+
--interpret-oem-data | \
682+
awk -F\": \" \
683+
'/^ *FRU Board Custom*/ { print ($2); exit }'";
684+
}else{
685+
cmd_nm = "ipmi-fru \
686+
--fru-file=/sys/bus/i2c/devices/1-0054/eeprom \
687+
--interpret-oem-data | \
688+
awk -F\": \" \
689+
'/^ *FRU Board Product Name*/ { print ($2); exit }'";
690+
cmd_rv = "ipmi-fru \
691+
--fru-file=/sys/bus/i2c/devices/1-0054/eeprom \
692+
--interpret-oem-data | \
693+
awk -F\": \" \
694+
'/^ *FRU Board Custom*/ { print ($2); exit }'";
695+
}
696+
697+
fru = popen(cmd_nm, "r");
652698
if (!fru) {
653-
printf("Unable to read Board revision from EEprom\n");
699+
printf("Board name read faild from eeprom\n");
654700
return ret;
655701
}
656-
ret = fscanf(fru, "%9s", revision);
702+
703+
ret = fscanf(fru, "%7s", brd_nm);
657704
if (ret < 1) {
658-
printf("Unable to read Board revision from EEprom\n");
705+
printf("Board name fscanf read failed\n");
659706
return ret;
660707
}
661-
if ((strcmp(revision, "A") == 0) || (strcmp(revision, "B") == 0) ||
662-
(strcmp(revision, "Y") == 0) || (strcmp(revision, "Z") == 0) ||
663-
(strcmp(revision, "1") == 0) || (strcmp(revision, "2") == 0)) {
664-
ret = XST_SUCCESS;
665-
} else {
666-
printf("Unable to read Board revision from EEprom via ");
667-
printf("fru-print utility\n");
708+
709+
pclose(fru);
710+
711+
fru = popen(cmd_rv, "r");
712+
if (!fru) {
713+
printf("Board revision read faild from eeprom\n");
714+
return ret;
715+
}
716+
717+
ret = fscanf(fru, "%4s", brd_rv);
718+
if (ret < 1) {
719+
printf("Board revision fscanf read failed\n");
720+
return ret;
668721
}
669722
pclose(fru);
670723

724+
for(i=0; i<XBIU_NUM_BRDS; i++){
725+
if(strcmp(brd_nm, brds[i].brd_name) == 0){
726+
for(j=0; j<XBIU_NUM_BRD_REVS; j++){
727+
if(strcmp(brd_rv, brds[i].brd_rev[j]) == 0){
728+
printf("Board detected: %s, Rev: %s\n",brd_nm, brd_rv);
729+
ret = XST_SUCCESS;
730+
goto END;
731+
}
732+
}
733+
break;
734+
}
735+
}
736+
737+
if(XBIU_NUM_BRDS == i)
738+
printf("Board not found: %s\n", brd_nm);
739+
else
740+
printf("Board found: %s but board revision not found: %s\n",brd_nm, brd_rv);
741+
742+
END:
671743
return ret;
744+
672745
}
673746

674747
/*****************************************************************************/

0 commit comments

Comments
 (0)