From patchwork Fri Jul 16 17:16:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jorge Ramirez-Ortiz, Foundries" X-Patchwork-Id: 1506260 X-Patchwork-Delegate: monstr@monstr.eu Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=foundries.io header.i=@foundries.io header.a=rsa-sha256 header.s=google header.b=fMyxr5L3; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4GRHwZ4zTSz9sRf for ; Sat, 17 Jul 2021 03:17:00 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 2B45F82C22; Fri, 16 Jul 2021 19:16:50 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=foundries.io Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=foundries.io header.i=@foundries.io header.b="fMyxr5L3"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 441E782C22; Fri, 16 Jul 2021 19:16:48 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 19D5C80C8F for ; Fri, 16 Jul 2021 19:16:45 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=foundries.io Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=jorge@foundries.io Received: by mail-wr1-x42b.google.com with SMTP id d12so12854652wre.13 for ; Fri, 16 Jul 2021 10:16:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foundries.io; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=KStWYoSgJCkjfT7JJAiCAGdKftHvdx25C0nNo4mJ/zo=; b=fMyxr5L3CJQLPOyW7TVQEB/fxzM2mOavKSbdjrNYmfzX0z1knViFSCnu2QhM/1d6Px HvoI3x/SLp8usHR5xb6KIpTP1P7Qj9PiLOLUDj8hI0fbab8sja1zSrajAnSl+AO/SfhE hfgRWLnZjhmqIyzKrTQgbLlss9O8FylXxuvPmuVNoD8RLMcZnCT4W6ni/Gz3ovTcTdQy UKvfXDAfO/qofgyYfF3VCAAT15owihyY7reSpr/U28M2dsGy9nQ/VZF0AuMRLsAznZyD ynbcI1sD6smit1HzkKPRTdv6VNhu1iZ3X9JgAKvx10BenVb+IsmhC1+Q5a0c6hu2OpGF q5lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=KStWYoSgJCkjfT7JJAiCAGdKftHvdx25C0nNo4mJ/zo=; b=tCIMvwou0uOUPryfskltu1BwvAPD75LsjYb18G5uxNf3VXJdnqedHVLas+5Xp5BSl3 8yARBYVF52P/oYSmsqHKwsIzL2VvZ12Z3x/wfUzxjHQvqgvqx8ev1JN8vuT0dOrzgL9B 35dsV8i8OQ8tOdBPd94nz0Mg8SpFxPKqn+D11L+IMU9nMTGGMnW/CfQueYJopDoHEDgf W+swkuuoXfy4DvCWiKlUP7Szi3R/kX3tJBCzn3N0fq6HR9E3sTEArPuPKYXaRb/xQXRy SCSp/oSiKtWIRD7bbjCevnrlewPoLh1XFf9SHSoewCjN2tvyXJ99XMROPxH36BIGHPvQ uXEg== X-Gm-Message-State: AOAM530MsvRHcyy4ofZMcI44Or9k+3nE7cI1ywiv99BmtR5elRRgZKZi zG6n4n9gaq9uNpPgVwuhWpQ6gg== X-Google-Smtp-Source: ABdhPJz0F9c2OjEiIB2SzEHVXUNfX/5NC8LjHywk+EJL0sGaFyqbjzhhAjcXvJ79x6DX5NTkdlDatA== X-Received: by 2002:a5d:6849:: with SMTP id o9mr14204994wrw.250.1626455804635; Fri, 16 Jul 2021 10:16:44 -0700 (PDT) Received: from localhost.localdomain (138.red-79-146-80.dynamicip.rima-tde.net. [79.146.80.138]) by smtp.gmail.com with ESMTPSA id t16sm10388119wrp.44.2021.07.16.10.16.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Jul 2021 10:16:44 -0700 (PDT) From: Jorge Ramirez-Ortiz To: jorge@foundries.io, monstr@monstr.eu Cc: 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: [PATCH] zynqmp: restore the jtag interface Date: Fri, 16 Jul 2021 19:16:40 +0200 Message-Id: <20210716171640.18879-1-jorge@foundries.io> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean 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 --- 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();