|
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 | +******************************************************************************/ |
9 | 9 |
|
10 | 10 | #include <fcntl.h>
|
11 | 11 | #include <mtd/mtd-user.h>
|
|
22 | 22 | #define XST_FAILURE (0x1)
|
23 | 23 |
|
24 | 24 | /* Macros */
|
25 |
| -#define SYS_CHECKSUM_OFFSET (0x3U) |
| 25 | +#define SYS_CHECKSUM_OFFSET (0x3U) |
26 | 26 | #define XBIU_IDEN_STR_OFFSET (0x24U)
|
27 |
| -#define XBIU_IDEN_STR_LEN (0x4U) |
| 27 | +#define XBIU_IDEN_STR_LEN (0x4U) |
28 | 28 | #define XBIU_QSPI_MFG_INFO_SIZE (0x100U)
|
29 | 29 | #define XBIU_IMG_REVISON_OFFSET (0x70U)
|
30 | 30 | #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 | +}; |
31 | 49 |
|
32 | 50 | /* The below enums denote persistent registers in Qspi Flash */
|
33 | 51 | struct sys_persistent_state {
|
@@ -240,13 +258,15 @@ int main(int argc, char *argv[])
|
240 | 258 | return XST_SUCCESS;
|
241 | 259 | }
|
242 | 260 |
|
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 | + } |
250 | 270 |
|
251 | 271 | ret = verify_current_running_image("/dev/mtd2");
|
252 | 272 | if (ret != XST_SUCCESS) {
|
@@ -641,34 +661,87 @@ static int validate_board_string(void)
|
641 | 661 | {
|
642 | 662 | int ret = XST_FAILURE;
|
643 | 663 | 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"); |
652 | 698 | if (!fru) {
|
653 |
| - printf("Unable to read Board revision from EEprom\n"); |
| 699 | + printf("Board name read faild from eeprom\n"); |
654 | 700 | return ret;
|
655 | 701 | }
|
656 |
| - ret = fscanf(fru, "%9s", revision); |
| 702 | + |
| 703 | + ret = fscanf(fru, "%7s", brd_nm); |
657 | 704 | if (ret < 1) {
|
658 |
| - printf("Unable to read Board revision from EEprom\n"); |
| 705 | + printf("Board name fscanf read failed\n"); |
659 | 706 | return ret;
|
660 | 707 | }
|
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; |
668 | 721 | }
|
669 | 722 | pclose(fru);
|
670 | 723 |
|
| 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: |
671 | 743 | return ret;
|
| 744 | + |
672 | 745 | }
|
673 | 746 |
|
674 | 747 | /*****************************************************************************/
|
|
0 commit comments