From patchwork Tue Mar 20 09:56:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 10296759 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 305A660349 for ; Tue, 20 Mar 2018 09:57:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1EEBF290C7 for ; Tue, 20 Mar 2018 09:57:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 12FB329102; Tue, 20 Mar 2018 09:57:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 8B2C2290C7 for ; Tue, 20 Mar 2018 09:57:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=h4IFl/uBDSDxu6tlSZ3DM4V7uGF5exAOPQoVkdAgNVk=; b=YStH7mb2970TBb WfFWTcoA+GYFdMMOzIDD5071qiO7hBUC3CQHo+ILMF6Qp7kx7wXPpHPcWeLkzEiNTWMKpz/uV2cGm 6DEBmGFif7CIK18qsAj+f1JCDjcIowk8B3bk7vYCckr40TC2Pc2LJ5vt7jAYI53K8wRScV11R7Ulx A40VS35p/EFIgu15DzA9++KMvoUufXGGl9F05Stu662/xfGmiKv3xZO9v+qYWP+1z81A6iHM3l9U5 6ynblsw/ZEuuKhmWmBbv9SuIvPcI3HBpUtHvO5FyZSRlc7hKBSr79e3QIaDlx0Z80hF0kufsfVCYv RY5k4PRdr+Y1mPtamIhw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1eyE0x-0001Lp-Eg; Tue, 20 Mar 2018 09:57:07 +0000 Received: from foss.arm.com ([217.140.101.70]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1eyE0V-00014t-Fz; Tue, 20 Mar 2018 09:56:42 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3ECC21435; Tue, 20 Mar 2018 02:56:29 -0700 (PDT) Received: from [10.1.206.75] (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4D93F3F487; Tue, 20 Mar 2018 02:56:28 -0700 (PDT) Subject: Re: Failed to boot ARM64 boards for recent linux-next To: Shawn Lin References: <077cecdd-7982-dd33-454f-e38cc571366c@arm.com> <9cff515e-fcb9-a1c0-329b-a18c3bed0071@rock-chips.com> From: Marc Zyngier Organization: ARM Ltd Message-ID: <2dfe4f47-8163-d7a4-c9cc-d60b9f0e71a8@arm.com> Date: Tue, 20 Mar 2018 09:56:27 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <9cff515e-fcb9-a1c0-329b-a18c3bed0071@rock-chips.com> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180320_025639_748576_CA046945 X-CRM114-Status: GOOD ( 28.60 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "open list:ARM/Rockchip SoC..." , Jeffy Chen , Robin Murphy , "linux-arm-kernel@lists.infradead.org" Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP On 20/03/18 09:32, Shawn Lin wrote: > Hi Marc, > > On 2018/3/20 17:01, Marc Zyngier wrote: >> Hi Shawn, >> >> On 20/03/18 08:48, Shawn Lin wrote: >>> Hi Marc, >>> >>> I was able to boot my RK3399 board with in linux-next-20180314, >>> but not today. My bisect robot shows me it was introduced by >>> >>> commit d6062a6d62c643a06c393745d032da3e6441d4bd >>> Author: Marc Zyngier >>> Date: Fri Mar 9 14:53:19 2018 +0000 >>> >>> irqchip/gic-v3: Reset APgRn registers at boot time >>> >>> Booting a crash kernel while in an interrupt handler is likely >>> to leave the Active Priority Registers with some state that >>> is not relevant to the new kernel, and is likely to lead >>> to erratic behaviours such as interrupts not firing as their >>> priority is already active. >>> >>> As a sanity measure, wipe the APRs clean on startup. We make >>> sure to wipe both group 0 and 1 registers in order to avoid >>> any surprise. >>> >>> >>> The panic log is here: >>> https://paste.ubuntu.com/p/7WrJJDG6JQ/ >>> >>> Is it a known issue or is there a coming patch for that? >> >> Interesting. No, that wasn't the intention, but I may have missed a key >> detail (group 0 access traps to EL3 if SCR_EL3.FIQ==1). Can you have a >> go at the following hack, just to narrow it down: >> >> diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c >> index 5bb7bb22f1c1..f8ff43b1d4f8 100644 >> --- a/drivers/irqchip/irq-gic-v3.c >> +++ b/drivers/irqchip/irq-gic-v3.c >> @@ -570,16 +570,12 @@ static void gic_cpu_sys_reg_init(void) >> switch(val + 1) { >> case 8: >> case 7: >> - write_gicreg(0, ICC_AP0R3_EL1); >> write_gicreg(0, ICC_AP1R3_EL1); >> - write_gicreg(0, ICC_AP0R2_EL1); >> write_gicreg(0, ICC_AP1R2_EL1); >> case 6: >> - write_gicreg(0, ICC_AP0R1_EL1); >> write_gicreg(0, ICC_AP1R1_EL1); >> case 5: >> case 4: >> - write_gicreg(0, ICC_AP0R0_EL1); >> write_gicreg(0, ICC_AP1R0_EL1); >> } >> >> Let me know if that helps. >> > > It works for me. Thanks! OK. Would you mind testing a much more complete patch? From 192786590930c205461ea0a379d295a2d0375fc1 Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Tue, 20 Mar 2018 09:46:42 +0000 Subject: [PATCH] irqchip/gic-v3: Check availability of Group0 before resetting AP0Rn We now try to reset the Active Priority Registers at boot time, without checking if we actually have access to them. Bad move. If the secure side has set SCR_EL3.FIQ=1, we'll trap to EL3, and the firmware may not be please to get such an exception. Instead, let's use PMR to find out if its value gets affected by SCR_EL3.FIQ being set. Only if a readback from PMR shows the same value (or a higher priority) will we be able to write to AP0Rn. Fixes: d6062a6d62c6 ("irqchip/gic-v3: Reset APgRn registers at boot time") Reported-by: Shawn Lin Signed-off-by: Marc Zyngier --- arch/arm/include/asm/arch_gicv3.h | 6 +----- arch/arm64/include/asm/arch_gicv3.h | 5 ----- drivers/irqchip/irq-gic-v3.c | 25 ++++++++++++++++++++----- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/arch/arm/include/asm/arch_gicv3.h b/arch/arm/include/asm/arch_gicv3.h index 27288bdbd840..0bd530702118 100644 --- a/arch/arm/include/asm/arch_gicv3.h +++ b/arch/arm/include/asm/arch_gicv3.h @@ -137,6 +137,7 @@ static inline u64 read_ ## a64(void) \ return val; \ } +CPUIF_MAP(ICC_PMR, ICC_PMR_EL1) CPUIF_MAP(ICC_AP0R0, ICC_AP0R0_EL1) CPUIF_MAP(ICC_AP0R1, ICC_AP0R1_EL1) CPUIF_MAP(ICC_AP0R2, ICC_AP0R2_EL1) @@ -206,11 +207,6 @@ static inline u32 gic_read_iar(void) return irqstat; } -static inline void gic_write_pmr(u32 val) -{ - write_sysreg(val, ICC_PMR); -} - static inline void gic_write_ctlr(u32 val) { write_sysreg(val, ICC_CTLR); diff --git a/arch/arm64/include/asm/arch_gicv3.h b/arch/arm64/include/asm/arch_gicv3.h index 9becba9ab392..e278f94df0c9 100644 --- a/arch/arm64/include/asm/arch_gicv3.h +++ b/arch/arm64/include/asm/arch_gicv3.h @@ -76,11 +76,6 @@ static inline u64 gic_read_iar_cavium_thunderx(void) return irqstat; } -static inline void gic_write_pmr(u32 val) -{ - write_sysreg_s(val, SYS_ICC_PMR_EL1); -} - static inline void gic_write_ctlr(u32 val) { write_sysreg_s(val, SYS_ICC_CTLR_EL1); diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 5bb7bb22f1c1..a3f7624f5b00 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -532,6 +532,7 @@ static void gic_cpu_sys_reg_init(void) int i, cpu = smp_processor_id(); u64 mpidr = cpu_logical_map(cpu); u64 need_rss = MPIDR_RS(mpidr); + bool group0; u32 val; /* @@ -545,7 +546,11 @@ static void gic_cpu_sys_reg_init(void) pr_err("GIC: unable to set SRE (disabled at EL2), panic ahead\n"); /* Set priority mask register */ - gic_write_pmr(DEFAULT_PMR_VALUE); + write_gicreg(DEFAULT_PMR_VALUE, ICC_PMR_EL1); + + /* Is Group0 available to us? */ + val = read_gicreg(ICC_PMR_EL1); + group0 = (val <= DEFAULT_PMR_VALUE); /* * Some firmwares hand over to the kernel with the BPR changed from @@ -567,19 +572,29 @@ static void gic_cpu_sys_reg_init(void) val &= ICC_CTLR_EL1_PRI_BITS_MASK; val >>= ICC_CTLR_EL1_PRI_BITS_SHIFT; + if (group0) { + switch(val + 1) { + case 8: + case 7: + write_gicreg(0, ICC_AP0R3_EL1); + write_gicreg(0, ICC_AP0R2_EL1); + case 6: + write_gicreg(0, ICC_AP0R1_EL1); + case 5: + case 4: + write_gicreg(0, ICC_AP0R0_EL1); + } + } + switch(val + 1) { case 8: case 7: - write_gicreg(0, ICC_AP0R3_EL1); write_gicreg(0, ICC_AP1R3_EL1); - write_gicreg(0, ICC_AP0R2_EL1); write_gicreg(0, ICC_AP1R2_EL1); case 6: - write_gicreg(0, ICC_AP0R1_EL1); write_gicreg(0, ICC_AP1R1_EL1); case 5: case 4: - write_gicreg(0, ICC_AP0R0_EL1); write_gicreg(0, ICC_AP1R0_EL1); }