Diamond Mesa support both HPS handoff data and DDR handoff data.
HPS handoff data support re-use Straix10 and Agilex code. DDR
handoff data is newly introduced in Diamond Mesa.

Signed-off-by: Siew Chin Lim <elly.siew.chin....@intel.com>
---
 arch/arm/mach-socfpga/include/mach/handoff_soc64.h | 19 ++++++++++
 arch/arm/mach-socfpga/wrap_handoff_soc64.c         | 40 ++++++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/arch/arm/mach-socfpga/include/mach/handoff_soc64.h 
b/arch/arm/mach-socfpga/include/mach/handoff_soc64.h
index 68e0278384..c38b232065 100644
--- a/arch/arm/mach-socfpga/include/mach/handoff_soc64.h
+++ b/arch/arm/mach-socfpga/include/mach/handoff_soc64.h
@@ -23,8 +23,27 @@
 #define SOC64_HANDOFF_OFFSET_DATA              0x10
 #define SOC64_HANDOFF_SIZE                     4096
 
+#if defined(CONFIG_TARGET_SOCFPGA_STRATIX10) || \
+       defined(CONFIG_TARGET_SOCFPGA_AGILEX)
 #define SOC64_HANDOFF_BASE                     0xFFE3F000
 #define SOC64_HANDOFF_MISC                     (SOC64_HANDOFF_BASE + 0x610)
+#elif defined(CONFIG_TARGET_SOCFPGA_DM)
+#define SOC64_HANDOFF_BASE                     0xFFE5F000
+#define SOC64_HANDOFF_MISC                     (SOC64_HANDOFF_BASE + 0x630)
+
+/* DDR handoff */
+#define SOC64_HANDOFF_DDR_BASE                 0xFFE5C000
+
+#define SOC64_HANDOFF_DDR_MAGIC                        0x48524444
+#define SOC64_HANDOFF_DDR_UMCTL2_MAGIC         0x4C54434D
+#define SOC64_HANDOFF_DDR_MEMRESET_BASE                (SOC64_HANDOFF_DDR_BASE 
+ 0xC)
+#define SOC64_HANDOFF_DDR_UMCTL2_SECTION       (SOC64_HANDOFF_DDR_BASE + 0x10)
+#define SOC64_HANDOFF_DDR_UMCTL2_BASE          (SOC64_HANDOFF_DDR_BASE + 0x1C)
+#define SOC64_HANDOFF_DDR_PHY_MAGIC            0x43594850
+#define SOC64_HANDOFF_DDR_PHY_INIT_ENGINE_MAGIC        0x45594850
+#define SOC64_HANDOFF_DDR_PHY_BASE_OFFSET      0x8
+#endif
+
 #define SOC64_HANDOFF_MUX                      (SOC64_HANDOFF_BASE + 0x10)
 #define SOC64_HANDOFF_IOCTL                    (SOC64_HANDOFF_BASE + 0x1A0)
 #define SOC64_HANDOFF_FPGA                     (SOC64_HANDOFF_BASE + 0x330)
diff --git a/arch/arm/mach-socfpga/wrap_handoff_soc64.c 
b/arch/arm/mach-socfpga/wrap_handoff_soc64.c
index 672bdd5230..aea384897e 100644
--- a/arch/arm/mach-socfpga/wrap_handoff_soc64.c
+++ b/arch/arm/mach-socfpga/wrap_handoff_soc64.c
@@ -67,6 +67,46 @@ int socfpga_handoff_read(void *handoff_address, void *table, 
u32 table_len,
                        debug("at addr  0x%p\n", (u32 *)handoff_address);
                        return -EPERM;
                }
+       } else {
+#ifdef CONFIG_TARGET_SOCFPGA_DM
+               temp = readl(handoff_address);
+               if (temp == SOC64_HANDOFF_DDR_UMCTL2_MAGIC) {
+                       debug("%s: umctl2 handoff data =\n{\n",
+                             __func__);
+               } else if (temp == SOC64_HANDOFF_DDR_PHY_MAGIC) {
+                       debug("%s: PHY handoff data =\n{\n",
+                             __func__);
+               } else if (temp == SOC64_HANDOFF_DDR_PHY_INIT_ENGINE_MAGIC) {
+                       debug("%s: PHY engine handoff data =\n{\n",
+                             __func__);
+               }
+
+               debug("handoff table address = 0x%p table length = 0x%x\n",
+                     table_x32, table_len);
+
+               if (temp == SOC64_HANDOFF_DDR_UMCTL2_MAGIC ||
+                   temp == SOC64_HANDOFF_DDR_PHY_MAGIC ||
+                   temp == SOC64_HANDOFF_DDR_PHY_INIT_ENGINE_MAGIC) {
+                       /* Using handoff from Quartus tools if exists */
+                       for (i = 0; i < table_len; i++) {
+                               *table_x32 = readl(handoff_address +
+                                               SOC64_HANDOFF_OFFSET_DATA + (i 
* 4));
+
+                               if (!(i % 2))
+                                       debug(" No.%d Addr 0x%08x: ", i,
+                                             *table_x32);
+                               else
+                                       debug(" 0x%08x\n", *table_x32);
+
+                               table_x32++;
+                       }
+                       debug("\n}\n");
+               } else {
+                       debug("%s: Cannot find HANDOFF MAGIC ", __func__);
+                       debug("at addr 0x%p\n", (u32 *)handoff_address);
+                       return -EPERM;
+               }
+#endif
        }
 
        return 0;
-- 
2.13.0

Reply via email to