瀏覽代碼

arm64: zynqmp: Modify chip_id routine to get either idcode or version

This patch modifies the chip_id routine to get either idcode or
silicon version based on the argument received.

Signed-off-by: Siva Durga Prasad Paladugu <sivadur@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Siva Durga Prasad Paladugu 7 年之前
父節點
當前提交
db3123b40d
共有 2 個文件被更改,包括 34 次插入7 次删除
  1. 14 0
      arch/arm/include/asm/arch-zynqmp/sys_proto.h
  2. 20 7
      board/xilinx/zynqmp/zynqmp.c

+ 14 - 0
arch/arm/include/asm/arch-zynqmp/sys_proto.h

@@ -10,6 +10,20 @@
 
 #define PAYLOAD_ARG_CNT		5
 
+#define ZYNQMP_CSU_SILICON_VER_MASK	0xF
+
+enum {
+	IDCODE,
+	VERSION,
+};
+
+enum {
+	ZYNQMP_SILICON_V1,
+	ZYNQMP_SILICON_V2,
+	ZYNQMP_SILICON_V3,
+	ZYNQMP_SILICON_V4,
+};
+
 enum {
 	TCM_LOCK,
 	TCM_SPLIT,

+ 20 - 7
board/xilinx/zynqmp/zynqmp.c

@@ -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;