From: "Jorge Ramirez-Ortiz, Foundries" <jorge@foundries.io>
To: Jorge Ramirez-Ortiz <jorge@foundries.io>
Cc: monstr@monstr.eu, adrian.fiergolski@fastree3d.com,
ibai.erkiaga-elorza@xilinx.com, sjg@chromium.org,
t.karthik.reddy@xilinx.com, ricardo@foundries.io,
u-boot@lists.denx.de
Subject: Re: [PATCH] zynqmp: restore the jtag interface
Date: Wed, 11 Aug 2021 20:56:09 +0200 [thread overview]
Message-ID: <20210811185609.GB1091@trex> (raw)
In-Reply-To: <20210716171640.18879-1-jorge@foundries.io>
On 16/07/21, Jorge Ramirez-Ortiz wrote:
reminder
> As a security feature, if boot.bin was configured for secure boot the
> CSU will disable the JTAG interface on all cases.
>
> Some boards might rely on this interface for flashing to QSPI in which
> case those systems might end up bricked during development.
>
> This commit attempts to restore the interface - if the CSU allows for it.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
> ---
> arch/arm/mach-zynqmp/Kconfig | 9 ++++++++
> arch/arm/mach-zynqmp/include/mach/hardware.h | 23 +++++++++++++------
> board/xilinx/zynqmp/zynqmp.c | 24 ++++++++++++++++++++
> 3 files changed, 49 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/mach-zynqmp/Kconfig b/arch/arm/mach-zynqmp/Kconfig
> index 39144d654e..1e551c0020 100644
> --- a/arch/arm/mach-zynqmp/Kconfig
> +++ b/arch/arm/mach-zynqmp/Kconfig
> @@ -149,6 +149,15 @@ config SPL_ZYNQMP_ALT_BOOTMODE_ENABLED
> Overwrite bootmode selected via boot mode pins to tell SPL what should
> be the next boot device.
>
> +config SPL_ZYNQMP_RESTORE_JTAG
> + bool "Restore JTAG"
> + depends on SPL
> + default n
> + help
> + Booting SPL in secure mode causes the CSU to disable the JTAG interface
> + even if no eFuses were burnt. This option restores the interface if
> + possible.
> +
> config ZYNQ_SDHCI_MAX_FREQ
> default 200000000
>
> diff --git a/arch/arm/mach-zynqmp/include/mach/hardware.h b/arch/arm/mach-zynqmp/include/mach/hardware.h
> index 3776499070..58822e3f25 100644
> --- a/arch/arm/mach-zynqmp/include/mach/hardware.h
> +++ b/arch/arm/mach-zynqmp/include/mach/hardware.h
> @@ -42,17 +42,20 @@
> struct crlapb_regs {
> u32 reserved0[36];
> u32 cpu_r5_ctrl; /* 0x90 */
> - u32 reserved1[37];
> + u32 reserved1[7];
> + u32 dbg_lpd_ctrl; /* 0xB0 */
> + u32 reserved2[29];
> u32 timestamp_ref_ctrl; /* 0x128 */
> - u32 reserved2[53];
> + u32 reserved3[53];
> u32 boot_mode; /* 0x200 */
> - u32 reserved3_0[7];
> + u32 reserved4_0[7];
> u32 reset_reason; /* 0x220 */
> - u32 reserved3_1[6];
> + u32 reserved4_1[6];
> u32 rst_lpd_top; /* 0x23C */
> - u32 reserved4[4];
> + u32 rst_lpd_dbg; /* 0x240 */
> + u32 reserved5[3];
> u32 boot_pin_ctrl; /* 0x250 */
> - u32 reserved5[21];
> + u32 reserved6[21];
> };
>
> #define crlapb_base ((struct crlapb_regs *)ZYNQMP_CRL_APB_BASEADDR)
> @@ -141,9 +144,15 @@ struct apu_regs {
> struct csu_regs {
> u32 reserved0[4];
> u32 multi_boot;
> - u32 reserved1[11];
> + u32 reserved1[7];
> + u32 jtag_chain_status_wr;
> + u32 jtag_chain_status;
> + u32 jtag_sec;
> + u32 jtag_dap_cfg;
> u32 idcode;
> u32 version;
> + u32 reserved2[3055];
> + u32 pcap_prog;
> };
>
> #define csu_base ((struct csu_regs *)ZYNQMP_CSU_BASEADDR)
> diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> index 1748fec2e4..feffda54e7 100644
> --- a/board/xilinx/zynqmp/zynqmp.c
> +++ b/board/xilinx/zynqmp/zynqmp.c
> @@ -355,6 +355,25 @@ static int multi_boot(void)
> return 0;
> }
>
> +#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_ZYNQMP_RESTORE_JTAG)
> +static void restore_jtag(void)
> +{
> + const u32 disable_security_gate = 0xff;
> + const u32 setup_clock = 0x01002002;
> + const u32 setup_jtag = 0x3;
> + const u32 release_pl = 0x1;
> + const u32 enable_debug = 0xff;
> + const u32 do_reset = 0x0;
> +
> + writel(disable_security_gate, &csu_base->jtag_sec);
> + writel(enable_debug, &csu_base->jtag_dap_cfg);
> + writel(setup_jtag, &csu_base->jtag_chain_status_wr);
> + writel(setup_clock, &crlapb_base->dbg_lpd_ctrl);
> + writel(do_reset, &crlapb_base->rst_lpd_dbg);
> + writel(release_pl, &csu_base->pcap_prog);
> +}
> +#endif
> +
> #define PS_SYSMON_ANALOG_BUS_VAL 0x3210
> #define PS_SYSMON_ANALOG_BUS_REG 0xFFA50914
>
> @@ -374,6 +393,11 @@ int board_init(void)
> zynqmp_pmufw_load_config_object(zynqmp_pm_cfg_obj,
> zynqmp_pm_cfg_obj_size);
> printf("Silicon version:\t%d\n", zynqmp_get_silicon_version());
> +
> +#if defined(CONFIG_SPL_ZYNQMP_RESTORE_JTAG)
> + /* the CSU disables the JTAG interface when secure boot is enabled */
> + restore_jtag();
> +#endif
> #else
> if (CONFIG_IS_ENABLED(DM_I2C) && CONFIG_IS_ENABLED(I2C_EEPROM))
> xilinx_read_eeprom();
> --
> 2.31.1
>
next prev parent reply other threads:[~2021-08-11 18:56 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-16 17:16 [PATCH] zynqmp: restore the jtag interface Jorge Ramirez-Ortiz
2021-08-11 18:56 ` Jorge Ramirez-Ortiz, Foundries [this message]
2021-08-12 5:19 ` Michal Simek
2021-08-27 9:17 ` Jorge Ramirez-Ortiz, Foundries
2021-08-27 9:51 ` Michal Simek
-- strict thread matches above, loose matches on Subject: below --
2021-10-13 8:22 Jorge Ramirez-Ortiz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210811185609.GB1091@trex \
--to=jorge@foundries.io \
--cc=adrian.fiergolski@fastree3d.com \
--cc=ibai.erkiaga-elorza@xilinx.com \
--cc=monstr@monstr.eu \
--cc=ricardo@foundries.io \
--cc=sjg@chromium.org \
--cc=t.karthik.reddy@xilinx.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox