zynqmp: pm: Plumb get_chipid through FW interface
Use the PMUFW get_chipid call to obtain IDCODE and version register. Cc: Michal Simek <michal.simek@xilinx.com> Cc: Siva Durga Prasad Paladugu <sivadur@xilinx.com> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
This commit is contained in:
parent
dc0c5a42d6
commit
46cb684f32
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue