From: Yau Wai Gan <yau.wai....@intel.com>

Board ID is defined in JTAG User Code register. This function retrieves the
Board ID and perform validation on it.

Signed-off-by: Yau Wai Gan <yau.wai....@intel.com>
Signed-off-by: Jit Loon Lim <jit.loon....@intel.com>
---
 arch/arm/mach-socfpga/board.c                 | 39 +++++++++++++++++++
 .../mach-socfpga/include/mach/mailbox_s10.h   |  1 +
 2 files changed, 40 insertions(+)

diff --git a/arch/arm/mach-socfpga/board.c b/arch/arm/mach-socfpga/board.c
index 914a44970d..11abf864f5 100644
--- a/arch/arm/mach-socfpga/board.c
+++ b/arch/arm/mach-socfpga/board.c
@@ -7,9 +7,11 @@
 
 #include <common.h>
 #include <asm/arch/clock_manager.h>
+#include <asm/arch/mailbox_s10.h>
 #include <asm/arch/misc.h>
 #include <asm/arch/reset_manager.h>
 #include <asm/arch/secure_vab.h>
+#include <asm/arch/smc_api.h>
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <errno.h>
@@ -23,6 +25,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define DEFAULT_JTAG_USERCODE 0xFFFFFFFF
+
 void s_init(void) {
 #ifndef CONFIG_ARM64
        /*
@@ -92,6 +96,41 @@ int g_dnl_board_usb_cable_connected(void)
 }
 #endif
 
+u8 socfpga_get_board_id(void)
+{
+       u8 board_id = 0;
+       u32 jtag_usercode;
+       int err;
+
+#if !IS_ENABLED(CONFIG_SPL_BUILD) && IS_ENABLED(CONFIG_SPL_ATF)
+       err = smc_get_usercode(&jtag_usercode);
+#else
+       u32 resp_len = 1;
+
+       err = mbox_send_cmd(MBOX_ID_UBOOT, MBOX_GET_USERCODE, MBOX_CMD_DIRECT, 
0,
+                           NULL, 0, &resp_len, &jtag_usercode);
+#endif
+
+       if (err) {
+               puts("Fail to read JTAG Usercode. Default Board ID to 0\n");
+               return board_id;
+       }
+
+       debug("Valid JTAG Usercode: %u\n", jtag_usercode);
+
+       if (jtag_usercode == DEFAULT_JTAG_USERCODE) {
+               debug("JTAG Usercode is not set. Default Board ID to 0\n");
+       } else if (jtag_usercode >= 0 && jtag_usercode <= 255) {
+               board_id = jtag_usercode;
+               debug("Valid JTAG Usercode. Set Board ID to %u\n", board_id);
+       } else {
+               puts("Board ID is not in range 0 to 255\n");
+       }
+
+       return board_id;
+}
+
+
 #ifdef CONFIG_SPL_BUILD
 __weak int board_fit_config_name_match(const char *name)
 {
diff --git a/arch/arm/mach-socfpga/include/mach/mailbox_s10.h 
b/arch/arm/mach-socfpga/include/mach/mailbox_s10.h
index fbaf11597e..2cc7c89044 100644
--- a/arch/arm/mach-socfpga/include/mach/mailbox_s10.h
+++ b/arch/arm/mach-socfpga/include/mach/mailbox_s10.h
@@ -119,6 +119,7 @@ enum ALT_SDM_MBOX_RESP_CODE {
 #define MBOX_RECONFIG_DATA     8
 #define MBOX_RECONFIG_STATUS   9
 #define MBOX_VAB_SRC_CERT              11
+#define MBOX_GET_USERCODE              19
 #define MBOX_QSPI_OPEN         50
 #define MBOX_QSPI_CLOSE                51
 #define MBOX_QSPI_DIRECT       59
-- 
2.26.2

Reply via email to