From 46cb684f32f1aad8fb7f104a331b90b2a122505b Mon Sep 17 00:00:00 2001 From: Soren Brinkmann Date: Thu, 22 Sep 2016 12:21:11 -0700 Subject: [PATCH] zynqmp: pm: Plumb get_chipid through FW interface Use the PMUFW get_chipid call to obtain IDCODE and version register. Cc: Michal Simek Cc: Siva Durga Prasad Paladugu Signed-off-by: Soren Brinkmann --- plat/xilinx/zynqmp/aarch64/zynqmp_common.c | 24 ++++++++++----------- plat/xilinx/zynqmp/pm_service/pm_api_sys.c | 16 ++++++++++++++ plat/xilinx/zynqmp/pm_service/pm_api_sys.h | 2 ++ plat/xilinx/zynqmp/pm_service/pm_svc_main.c | 8 ++++++- plat/xilinx/zynqmp/zynqmp_private.h | 1 - 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/plat/xilinx/zynqmp/aarch64/zynqmp_common.c b/plat/xilinx/zynqmp/aarch64/zynqmp_common.c index 11a9e760e..8e461d3ce 100644 --- a/plat/xilinx/zynqmp/aarch64/zynqmp_common.c +++ b/plat/xilinx/zynqmp/aarch64/zynqmp_common.c @@ -77,18 +77,6 @@ unsigned int zynqmp_get_uart_clk(void) return 100000000; } -unsigned int zynqmp_get_silicon_id(void) -{ - uint32_t id; - - id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); - - id &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | ZYNQMP_CSU_IDCODE_SVD_MASK; - id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; - - return id; -} - #if LOG_LEVEL >= LOG_LEVEL_NOTICE static const struct { unsigned int id; @@ -140,6 +128,18 @@ static const struct { }, }; +static unsigned int zynqmp_get_silicon_id(void) +{ + uint32_t id; + + id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); + + id &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | ZYNQMP_CSU_IDCODE_SVD_MASK; + id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; + + return id; +} + static char *zynqmp_get_silicon_idcode_name(void) { unsigned int id; diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c index a46668718..b99060606 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c @@ -541,3 +541,19 @@ enum pm_ret_status pm_fpga_get_status(unsigned int *value) PM_PACK_PAYLOAD1(payload, PM_FPGA_GET_STATUS); return pm_ipi_send_sync(primary_proc, payload, value, 1); } + +/** + * pm_get_chipid() - Read silicon ID registers + * @value Buffer for return values. Must be large enough + * to hold 8 bytes. + * + * @return Returns silicon ID registers + */ +enum pm_ret_status pm_get_chipid(uint32_t *value) +{ + uint32_t payload[PAYLOAD_ARG_CNT]; + + /* Send request to the PMU */ + PM_PACK_PAYLOAD1(payload, PM_GET_CHIPID); + return pm_ipi_send_sync(primary_proc, payload, value, 2); +} diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_sys.h b/plat/xilinx/zynqmp/pm_service/pm_api_sys.h index 26d83e75a..1f6811801 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_sys.h +++ b/plat/xilinx/zynqmp/pm_service/pm_api_sys.h @@ -115,4 +115,6 @@ enum pm_ret_status pm_fpga_load(uint32_t address_high, uint32_t flags); enum pm_ret_status pm_fpga_get_status(unsigned int *value); +enum pm_ret_status pm_get_chipid(uint32_t *value); + #endif /* _PM_API_SYS_H_ */ diff --git a/plat/xilinx/zynqmp/pm_service/pm_svc_main.c b/plat/xilinx/zynqmp/pm_service/pm_svc_main.c index 9c08ffb9a..d63558340 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_svc_main.c +++ b/plat/xilinx/zynqmp/pm_service/pm_svc_main.c @@ -242,7 +242,13 @@ uint64_t pm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, } case PM_GET_CHIPID: - SMC_RET1(handle, zynqmp_get_silicon_id()); + { + uint32_t result[2]; + + ret = pm_get_chipid(result); + SMC_RET2(handle, (uint64_t)ret | ((uint64_t)result[0] << 32), + result[1]); + } default: WARN("Unimplemented PM Service Call: 0x%x\n", smc_fid); diff --git a/plat/xilinx/zynqmp/zynqmp_private.h b/plat/xilinx/zynqmp/zynqmp_private.h index abcdebc39..ddef37b8f 100644 --- a/plat/xilinx/zynqmp/zynqmp_private.h +++ b/plat/xilinx/zynqmp/zynqmp_private.h @@ -39,7 +39,6 @@ void zynqmp_config_setup(void); unsigned int zynqmp_get_uart_clk(void); int zynqmp_is_pmu_up(void); unsigned int zynqmp_get_bootmode(void); -unsigned int zynqmp_get_silicon_id(void); /* For FSBL handover */ void fsbl_atf_handover(entry_point_info_t *bl32_image_ep_info,