arm64: zynqmp: Return pmufw version for zynqmp_pmufw_version()
authorSiva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Tue, 21 Aug 2018 10:14:49 +0000 (15:44 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 26 Sep 2018 08:15:00 +0000 (10:15 +0200)
Modify the zynqmp_pmufw_version() routine to return PMUFW version so
that it can be reused wherever required. Get PMUFW version from PMU
only once at bootup and later just return stored value.

Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/cpu/armv8/zynqmp/cpu.c
arch/arm/include/asm/arch-zynqmp/sys_proto.h
board/xilinx/zynqmp/zynqmp.c

index 8cdfb93175477e29812dc1feca454766b644b569..43ba739d2f7c0a305b0e961d79ab65c362671b78 100644 (file)
@@ -172,26 +172,27 @@ int __maybe_unused invoke_smc(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2,
 }
 
 #if defined(CONFIG_CLK_ZYNQMP)
-void zynqmp_pmufw_version(void)
+unsigned int zynqmp_pmufw_version(void)
 {
        int ret;
        u32 ret_payload[PAYLOAD_ARG_CNT];
-       u32 pm_api_version;
+       static u32 pm_api_version = ZYNQMP_PM_VERSION_INVALID;
 
-       ret = invoke_smc(ZYNQMP_SIP_SVC_GET_API_VERSION, 0, 0, 0, 0,
-                        ret_payload);
-       pm_api_version = ret_payload[1];
-
-       if (ret)
-               panic("PMUFW is not found - Please load it!\n");
+       /*
+        * Get PMU version only once and later
+        * just return stored values instead of
+        * asking PMUFW again.
+        */
+       if (pm_api_version == ZYNQMP_PM_VERSION_INVALID) {
+               ret = invoke_smc(ZYNQMP_SIP_SVC_GET_API_VERSION, 0, 0, 0, 0,
+                                ret_payload);
+               pm_api_version = ret_payload[1];
 
-       printf("PMUFW:\tv%d.%d\n",
-              pm_api_version >> ZYNQMP_PM_VERSION_MAJOR_SHIFT,
-              pm_api_version & ZYNQMP_PM_VERSION_MINOR_MASK);
+               if (ret)
+                       panic("PMUFW is not found - Please load it!\n");
+       }
 
-       if (pm_api_version < ZYNQMP_PM_VERSION)
-               panic("PMUFW version error. Expected: v%d.%d\n",
-                     ZYNQMP_PM_VERSION_MAJOR, ZYNQMP_PM_VERSION_MINOR);
+       return pm_api_version;
 }
 #endif
 
index bc563d2b61b9eb407e3d998feb2fee258d2e6304..79c655a0e1a7c62b38719e0fed6e5948b1df4112 100644 (file)
@@ -32,6 +32,8 @@
        ((ZYNQMP_PM_VERSION_MAJOR << ZYNQMP_PM_VERSION_MAJOR_SHIFT) | \
                                 ZYNQMP_PM_VERSION_MINOR)
 
+#define ZYNQMP_PM_VERSION_INVALID      ~0
+
 enum {
        IDCODE,
        VERSION,
@@ -55,7 +57,7 @@ unsigned int zynqmp_get_silicon_version(void);
 
 void handoff_setup(void);
 
-void zynqmp_pmufw_version(void);
+unsigned int zynqmp_pmufw_version(void);
 int zynqmp_mmio_write(const u32 address, const u32 mask, const u32 value);
 int zynqmp_mmio_read(const u32 address, u32 *value);
 int invoke_smc(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3,
index 89fac6bb67ca69bf8f7a5f1c5f192379e8800f52..af91cde7c89467dedf17c8f87b7b378e3512bfbc 100644 (file)
@@ -281,7 +281,16 @@ int board_early_init_f(void)
 {
        int ret = 0;
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CLK_ZYNQMP)
-       zynqmp_pmufw_version();
+       u32 pm_api_version;
+
+       pm_api_version = zynqmp_pmufw_version();
+       printf("PMUFW:\tv%d.%d\n",
+              pm_api_version >> ZYNQMP_PM_VERSION_MAJOR_SHIFT,
+              pm_api_version & ZYNQMP_PM_VERSION_MINOR_MASK);
+
+       if (pm_api_version < ZYNQMP_PM_VERSION)
+               panic("PMUFW version error. Expected: v%d.%d\n",
+                     ZYNQMP_PM_VERSION_MAJOR, ZYNQMP_PM_VERSION_MINOR);
 #endif
 
 #if defined(CONFIG_ZYNQMP_PSU_INIT_ENABLED)