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;
|
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
|
#if LOG_LEVEL >= LOG_LEVEL_NOTICE
|
||||||
static const struct {
|
static const struct {
|
||||||
unsigned int id;
|
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)
|
static char *zynqmp_get_silicon_idcode_name(void)
|
||||||
{
|
{
|
||||||
unsigned int id;
|
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);
|
PM_PACK_PAYLOAD1(payload, PM_FPGA_GET_STATUS);
|
||||||
return pm_ipi_send_sync(primary_proc, payload, value, 1);
|
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);
|
uint32_t flags);
|
||||||
enum pm_ret_status pm_fpga_get_status(unsigned int *value);
|
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_ */
|
#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:
|
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:
|
default:
|
||||||
WARN("Unimplemented PM Service Call: 0x%x\n", smc_fid);
|
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);
|
unsigned int zynqmp_get_uart_clk(void);
|
||||||
int zynqmp_is_pmu_up(void);
|
int zynqmp_is_pmu_up(void);
|
||||||
unsigned int zynqmp_get_bootmode(void);
|
unsigned int zynqmp_get_bootmode(void);
|
||||||
unsigned int zynqmp_get_silicon_id(void);
|
|
||||||
|
|
||||||
/* For FSBL handover */
|
/* For FSBL handover */
|
||||||
void fsbl_atf_handover(entry_point_info_t *bl32_image_ep_info,
|
void fsbl_atf_handover(entry_point_info_t *bl32_image_ep_info,
|
||||||
|
|
Loading…
Reference in New Issue