From: Stefan Herbrechtsmeier <stefan.herbrechtsme...@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.herbrechtsme...@weidmueller.com> Signed-off-by: Lukas Funke <lukas.fu...@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 --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); -- 2.30.2