Commit fb4000e87178bf20aeb0d6c6a71b0e25ff8dcda3

Authored by Michal Simek
1 parent 7033ae272e

arm64: zynqmp: Check pmufw version

If PMUFW version is not v0.3 then panic.
ZynqMP switch to CCF based clock driver which requires
PMUFW to be present at certain version.
This patch ensure that you use correct and tested PMUFW
binary.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>

Showing 4 changed files with 46 additions and 0 deletions Side-by-side Diff

arch/arm/cpu/armv8/zynqmp/cpu.c
... ... @@ -129,6 +129,41 @@
129 129 return regs.regs[0];
130 130 }
131 131  
  132 +#define ZYNQMP_SIP_SVC_GET_API_VERSION 0xC2000001
  133 +
  134 +#define ZYNQMP_PM_VERSION_MAJOR 0
  135 +#define ZYNQMP_PM_VERSION_MINOR 3
  136 +#define ZYNQMP_PM_VERSION_MAJOR_SHIFT 16
  137 +#define ZYNQMP_PM_VERSION_MINOR_MASK 0xFFFF
  138 +
  139 +#define ZYNQMP_PM_VERSION \
  140 + ((ZYNQMP_PM_VERSION_MAJOR << ZYNQMP_PM_VERSION_MAJOR_SHIFT) | \
  141 + ZYNQMP_PM_VERSION_MINOR)
  142 +
  143 +#if defined(CONFIG_CLK_ZYNQMP)
  144 +void zynqmp_pmufw_version(void)
  145 +{
  146 + int ret;
  147 + u32 ret_payload[PAYLOAD_ARG_CNT];
  148 + u32 pm_api_version;
  149 +
  150 + ret = invoke_smc(ZYNQMP_SIP_SVC_GET_API_VERSION, 0, 0, 0, 0,
  151 + ret_payload);
  152 + pm_api_version = ret_payload[1];
  153 +
  154 + if (ret)
  155 + panic("PMUFW is not found - Please load it!\n");
  156 +
  157 + printf("PMUFW:\tv%d.%d\n",
  158 + pm_api_version >> ZYNQMP_PM_VERSION_MAJOR_SHIFT,
  159 + pm_api_version & ZYNQMP_PM_VERSION_MINOR_MASK);
  160 +
  161 + if (pm_api_version != ZYNQMP_PM_VERSION)
  162 + panic("PMUFW version error. Expected: v%d.%d\n",
  163 + ZYNQMP_PM_VERSION_MAJOR, ZYNQMP_PM_VERSION_MINOR);
  164 +}
  165 +#endif
  166 +
132 167 int zynqmp_mmio_write(const u32 address,
133 168 const u32 mask,
134 169 const u32 value)
arch/arm/include/asm/arch-zynqmp/sys_proto.h
... ... @@ -18,6 +18,7 @@
18 18  
19 19 void handoff_setup(void);
20 20  
  21 +void zynqmp_pmufw_version(void);
21 22 int zynqmp_mmio_write(const u32 address, const u32 mask, const u32 value);
22 23 int zynqmp_mmio_read(const u32 address, u32 *value);
23 24 int invoke_smc(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3,
board/xilinx/zynqmp/zynqmp.c
... ... @@ -113,6 +113,14 @@
113 113 }
114 114 #endif
115 115  
  116 +int board_early_init_f(void)
  117 +{
  118 +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CLK_ZYNQMP)
  119 + zynqmp_pmufw_version();
  120 +#endif
  121 + return 0;
  122 +}
  123 +
116 124 #define ZYNQMP_VERSION_SIZE 9
117 125  
118 126 int board_init(void)
include/configs/xilinx_zynqmp.h
... ... @@ -296,5 +296,7 @@
296 296 #endif
297 297 #endif
298 298  
  299 +#define CONFIG_BOARD_EARLY_INIT_F
  300 +
299 301 #endif /* __XILINX_ZYNQMP_H */