mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-08-14 19:26:58 +02:00
xilinx: zynqmp: get chip ID using firmware driver
Current implementation for getting chip ID uses either raw access on EL3 or a SMC call to get the silicon information. Following change simplifies the code using always the firmware driver. Signed-off-by: Ibai Erkiaga <ibai.erkiaga-elorza@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
2eabb6bfea
commit
21c2fc7c6a
@ -199,60 +199,34 @@ static const struct {
|
|||||||
|
|
||||||
int chip_id(unsigned char id)
|
int chip_id(unsigned char id)
|
||||||
{
|
{
|
||||||
struct pt_regs regs;
|
|
||||||
int val = -EINVAL;
|
int val = -EINVAL;
|
||||||
|
u32 ret_payload[PAYLOAD_ARG_CNT];
|
||||||
|
|
||||||
if (current_el() != 3) {
|
xilinx_pm_request(PM_GET_CHIPID, 0, 0, 0, 0, ret_payload);
|
||||||
regs.regs[0] = ZYNQMP_SIP_SVC_CSU_DMA_CHIPID;
|
|
||||||
regs.regs[1] = 0;
|
|
||||||
regs.regs[2] = 0;
|
|
||||||
regs.regs[3] = 0;
|
|
||||||
|
|
||||||
smc_call(®s);
|
/*
|
||||||
|
* Firmware returns:
|
||||||
/*
|
* payload[0][31:0] = status of the operation
|
||||||
* SMC returns:
|
* payload[1]] = IDCODE
|
||||||
* regs[0][31:0] = status of the operation
|
* payload[2][19:0] = Version
|
||||||
* regs[0][63:32] = CSU.IDCODE register
|
* payload[2][28:20] = EXTENDED_IDCODE
|
||||||
* regs[1][31:0] = CSU.version register
|
* payload[2][29] = PL_INIT
|
||||||
* regs[1][63:32] = CSU.IDCODE2 register
|
*/
|
||||||
*/
|
switch (id) {
|
||||||
switch (id) {
|
case IDCODE:
|
||||||
case IDCODE:
|
val = ret_payload[1];
|
||||||
regs.regs[0] = upper_32_bits(regs.regs[0]);
|
val &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
|
||||||
regs.regs[0] &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
|
ZYNQMP_CSU_IDCODE_SVD_MASK;
|
||||||
ZYNQMP_CSU_IDCODE_SVD_MASK;
|
val >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
|
||||||
regs.regs[0] >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
|
break;
|
||||||
val = regs.regs[0];
|
case VERSION:
|
||||||
break;
|
val = ret_payload[2] & ZYNQMP_CSU_SILICON_VER_MASK;
|
||||||
case VERSION:
|
break;
|
||||||
regs.regs[1] = lower_32_bits(regs.regs[1]);
|
case IDCODE2:
|
||||||
regs.regs[1] &= ZYNQMP_CSU_SILICON_VER_MASK;
|
val = ret_payload[2] >> ZYNQMP_CSU_VERSION_EMPTY_SHIFT;
|
||||||
val = regs.regs[1];
|
break;
|
||||||
break;
|
default:
|
||||||
case IDCODE2:
|
printf("%s, Invalid Req:0x%x\n", __func__, id);
|
||||||
regs.regs[1] = lower_32_bits(regs.regs[1]);
|
|
||||||
regs.regs[1] >>= ZYNQMP_CSU_VERSION_EMPTY_SHIFT;
|
|
||||||
val = regs.regs[1];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("%s, Invalid Req:0x%x\n", __func__, id);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (id) {
|
|
||||||
case IDCODE:
|
|
||||||
val = readl(ZYNQMP_CSU_IDCODE_ADDR);
|
|
||||||
val &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
|
|
||||||
ZYNQMP_CSU_IDCODE_SVD_MASK;
|
|
||||||
val >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
|
|
||||||
break;
|
|
||||||
case VERSION:
|
|
||||||
val = readl(ZYNQMP_CSU_VER_ADDR);
|
|
||||||
val &= ZYNQMP_CSU_SILICON_VER_MASK;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("%s, Invalid Req:0x%x\n", __func__, id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
@ -277,6 +251,7 @@ static char *zynqmp_get_silicon_idcode_name(void)
|
|||||||
|
|
||||||
id = chip_id(IDCODE);
|
id = chip_id(IDCODE);
|
||||||
ver = chip_id(IDCODE2);
|
ver = chip_id(IDCODE2);
|
||||||
|
debug("%s, ID: 0x%0X, Ver: 0x%0X\r\n", __func__, id, ver);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
|
for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
|
||||||
if (zynqmp_devices[i].id == id) {
|
if (zynqmp_devices[i].id == id) {
|
||||||
|
Loading…
Reference in New Issue
Block a user