]> git.sur5r.net Git - u-boot/blobdiff - board/xilinx/zynqmp/zynqmp.c
arm64: zynqmp: Modify chip_id routine to get either idcode or version
[u-boot] / board / xilinx / zynqmp / zynqmp.c
index 5b1852a8cec32f628a03e9a65b3bf2944bcaf513..5958350a0098369bd6d42e2c2fc5b7447e9280da 100644 (file)
@@ -76,13 +76,14 @@ static const struct {
        },
 };
 
-static int chip_id(void)
+static int chip_id(unsigned char id)
 {
        struct pt_regs regs;
        regs.regs[0] = ZYNQMP_SIP_SVC_CSU_DMA_CHIPID;
        regs.regs[1] = 0;
        regs.regs[2] = 0;
        regs.regs[3] = 0;
+       int val = -EINVAL;
 
        smc_call(&regs);
 
@@ -92,19 +93,31 @@ static int chip_id(void)
         * regs[0][63:32] = CSU.IDCODE register
         * regs[1][31:0]  = CSU.version register
         */
-       regs.regs[0] = upper_32_bits(regs.regs[0]);
-       regs.regs[0] &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
-                       ZYNQMP_CSU_IDCODE_SVD_MASK;
-       regs.regs[0] >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
+       switch (id) {
+       case IDCODE:
+               regs.regs[0] = upper_32_bits(regs.regs[0]);
+               regs.regs[0] &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
+                               ZYNQMP_CSU_IDCODE_SVD_MASK;
+               regs.regs[0] >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
+               val = regs.regs[0];
+               break;
+       case VERSION:
+               regs.regs[1] = lower_32_bits(regs.regs[1]);
+               regs.regs[1] &= ZYNQMP_CSU_SILICON_VER_MASK;
+               val = regs.regs[1];
+               break;
+       default:
+               printf("%s, Invalid Req:0x%x\n", __func__, id);
+       }
 
-       return regs.regs[0];
+       return val;
 }
 
 static char *zynqmp_get_silicon_idcode_name(void)
 {
        uint32_t i, id;
 
-       id = chip_id();
+       id = chip_id(IDCODE);
        for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
                if (zynqmp_devices[i].id == id)
                        return zynqmp_devices[i].name;