xilinx: Add option to select SC id instead of DUT id for SC support
authorMichal Simek <michal.simek@amd.com>
Wed, 23 Nov 2022 11:48:44 +0000 (12:48 +0100)
committerMichal Simek <michal.simek@amd.com>
Mon, 5 Dec 2022 07:55:54 +0000 (08:55 +0100)
Reading MAC address from on board EEPROM requires different type for System
Controller (SC).

Signed-off-by: Michal Simek <michal.simek@amd.com>
Link: https://lore.kernel.org/r/90bb7cc5463568a690b979f18c8d42556986b46d.1669204122.git.michal.simek@amd.com
board/xilinx/Kconfig
board/xilinx/common/fru.h
board/xilinx/common/fru_ops.c

index 746a2332ad5f758c0ea0b3f24ef818f7e88df51e..7b31d7eaedd5650cecfc69f1b7fd4b59c54d20b1 100644 (file)
@@ -82,3 +82,12 @@ config CMD_FRU
          information present in the device. The FRU Information is used
          to primarily to provide "inventory" information about the boards
          that the FRU Information Device is located on.
+
+config FRU_SC
+       bool "FRU system controller decoding"
+       help
+         Xilinx System Controller (SC) FRU format is describing boards from two
+         angles. One from DUT and then from SC. DUT is default option for
+         the main CPU. SC behaves more or less as slave and have different ID.
+         If you build U-Boot for SC you should enable this option to get proper
+         MAC address.
index 59f6b722cf12033a27530f8201ae089748eea179..586c41b66ef78dff994818efba6249a1de978e0b 100644 (file)
@@ -90,6 +90,7 @@ struct fru_table {
 #define FRU_MULTIREC_MAC_OFFSET                4
 #define FRU_LAST_REC                   BIT(7)
 #define FRU_DUT_MACID                  0x31
+#define FRU_SC_MACID                   0x11
 
 /* This should be minimum of fields */
 #define FRU_BOARD_AREA_TOTAL_FIELDS    5
index 49846ae3d660c213926b3ce2660be6e9b9c87cb6..c4f009affc5e84335f3290a3b4e0f67e7431e0c6 100644 (file)
@@ -239,8 +239,12 @@ static int fru_parse_multirec(unsigned long addr)
 
                if (mrc.rec_type == FRU_MULTIREC_TYPE_OEM) {
                        struct fru_multirec_mac *mac = (void *)addr + hdr_len;
+                       u32 type = FRU_DUT_MACID;
 
-                       if (mac->ver == FRU_DUT_MACID) {
+                       if (CONFIG_IS_ENABLED(FRU_SC))
+                               type = FRU_SC_MACID;
+
+                       if (mac->ver == type) {
                                mac_len = mrc.len - FRU_MULTIREC_MAC_OFFSET;
                                memcpy(&fru_data.mac.macid, mac->macid, mac_len);
                        }