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:
Ibai Erkiaga 2020-08-04 23:17:28 +01:00 committed by Michal Simek
parent 2eabb6bfea
commit 21c2fc7c6a

View File

@ -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(&regs); /*
* 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) {