diff mbox series

[2/3] zynq: Add function to enable JTAG

Message ID 20240328090110.14683-3-lukas.funke-oss@weidmueller.com
State New
Delegated to: Michal Simek
Headers show
Series Add support for jtag disable/enable and multiboot get/set for zynq | expand

Commit Message

Lukas Funke March 28, 2024, 9:01 a.m. UTC
From: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>

In non-secure boot mode jtag is restored by the BootROM. In secure boot
mode jtag has to be restored by the trusted application, i.e. the
bootloader.

This commit adds a function to enable the jtag interface on zynq
devices from u-boot.

Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
---

 arch/arm/mach-zynq/cpu.c                    | 19 +++++++++++++++++++
 arch/arm/mach-zynq/include/mach/sys_proto.h |  1 +
 2 files changed, 20 insertions(+)
diff mbox series

Patch

diff --git a/arch/arm/mach-zynq/cpu.c b/arch/arm/mach-zynq/cpu.c
index 3d2866422e..b8d413b69a 100644
--- a/arch/arm/mach-zynq/cpu.c
+++ b/arch/arm/mach-zynq/cpu.c
@@ -14,6 +14,13 @@ 
 #include <asm/arch/ps7_init_gpl.h>
 #include <asm/arch/sys_proto.h>
 
+#define ZYNQ_DEV_CFG_CTRL_DAP_EN		GENMASK(0, 2)
+#define ZYNQ_DEV_CFG_CTRL_DBGEN			BIT(3)
+#define ZYNQ_DEV_CFG_CTRL_NIDEN			BIT(4)
+#define ZYNQ_DEV_CFG_CTRL_SPIDEM		BIT(5)
+#define ZYNQ_DEV_CFG_CTRL_SPNIDEN		BIT(6)
+#define ZYNQ_DEV_CFG_CTRL_JTAG_CHAIN_DIS	BIT(23)
+
 #define ZYNQ_SILICON_VER_MASK		0xF0000000
 #define ZYNQ_SILICON_VER_SHIFT		28
 #define ZYNQ_MULTIBOOT_ADDR_MASK	0x00001FFF
@@ -74,6 +81,18 @@  int arch_cpu_init(void)
 	return 0;
 }
 
+void zynq_enable_jtag(void)
+{
+	unsigned int v;
+
+	v = readl(&devcfg_base->ctrl);
+	v &= ~ZYNQ_DEV_CFG_CTRL_JTAG_CHAIN_DIS;
+	v |= ZYNQ_DEV_CFG_CTRL_DAP_EN | ZYNQ_DEV_CFG_CTRL_DBGEN
+	   | ZYNQ_DEV_CFG_CTRL_NIDEN | ZYNQ_DEV_CFG_CTRL_NIDEN
+	   | ZYNQ_DEV_CFG_CTRL_SPIDEM | ZYNQ_DEV_CFG_CTRL_SPNIDEN;
+	writel(v, &devcfg_base->ctrl);
+}
+
 unsigned int zynq_get_silicon_version(void)
 {
 	return (readl(&devcfg_base->mctrl) & ZYNQ_SILICON_VER_MASK)
diff --git a/arch/arm/mach-zynq/include/mach/sys_proto.h b/arch/arm/mach-zynq/include/mach/sys_proto.h
index 6b85682808..f583ef090d 100644
--- a/arch/arm/mach-zynq/include/mach/sys_proto.h
+++ b/arch/arm/mach-zynq/include/mach/sys_proto.h
@@ -15,6 +15,7 @@  extern u32 zynq_slcr_get_boot_mode(void);
 extern u32 zynq_slcr_get_idcode(void);
 extern int zynq_slcr_get_mio_pin_status(const char *periph);
 extern void zynq_ddrc_init(void);
+extern void zynq_enable_jtag(void);
 extern unsigned int zynq_get_silicon_version(void);
 extern unsigned int zynq_get_mulitboot_addr(void);
 extern void zynq_set_mulitboot_addr(unsigned int);