Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp7226309imu; Thu, 31 Jan 2019 07:02:02 -0800 (PST) X-Google-Smtp-Source: ALg8bN5JA5TSg+VX6b+wPhX8OfoH97tRtMZhHmB4IaGY8iq93Jvl6R1OFze7P6VDQIn2zqwjJK29 X-Received: by 2002:a63:4611:: with SMTP id t17mr31597332pga.119.1548946922371; Thu, 31 Jan 2019 07:02:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548946922; cv=none; d=google.com; s=arc-20160816; b=a+MQ89n5oBj58majVh2lMRlPfMIEYvdKUjGvIYED2RzGOhU77jLH/XHll4LiWgto2h ek9TZi01LnFcTyCTpqQO+uJgDWarwO5PzmuidtQF9q/o2EX96zGtbXbRFcH1qGq3sfmv elpzooz1jjMJ/69aZHix+cdTCUN78Wrm3yosM3CnQOd/yWTMlFOnrhUpqNflu0W9hvtb Y6iacC46sVZ8V/YWMHE3v5bJcJrPa3He1YV7/kkuk6EtSEG96t51Ww3BkdCXOfufektD 5PjJijkAL+WrqnDuGvMsmUrlZCpsnnS+1kyr/FJZZCkfdlWfq+lzT7YmKhNuo6wXIZPm n6Rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=ry867XS5u/b/DZ/qUZ7KZS4Qxz556rzaGKP19QpSqHs=; b=BchTd8zhvTO7rXYhhXTYKwwdZfn75RUd9dH+rrGfMv4Dc7RHyoW5r9P9bL5EbkmMNf 7RU2rqdyPJmZqFrGWEQpx5n+bA5XlJjHmfL3eRj1u77cf9MVpD7K1qDYlQaTXfocGkPG FqljQ99kM8i/ofRuexeDT9609NqXzJbMLhIoUl+4L/TUc3IP/PN0TBXpM7G/qq/V6zhz YRb44eifw6zqXO8YLn3t7ITNaXM84SRJDNSgCL1K4vYfurx6vMcAVxB5pimnX3fiRSV6 4xP5wXFYyFUXoIm6/y/NwbgcwRYD2lEADKWeJdBshDP/1lMI2Q3yEklhsJTqwR6Kxymh VU7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v16si4617867pgc.519.2019.01.31.07.01.46; Thu, 31 Jan 2019 07:02:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732719AbfAaO7k (ORCPT + 99 others); Thu, 31 Jan 2019 09:59:40 -0500 Received: from foss.arm.com ([217.140.101.70]:45566 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732631AbfAaO7h (ORCPT ); Thu, 31 Jan 2019 09:59:37 -0500 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 804BBEBD; Thu, 31 Jan 2019 06:59:37 -0800 (PST) Received: from e112298-lin.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 86D693F59C; Thu, 31 Jan 2019 06:59:35 -0800 (PST) From: Julien Thierry To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, daniel.thompson@linaro.org, joel@joelfernandes.org, marc.zyngier@arm.com, christoffer.dall@arm.com, james.morse@arm.com, catalin.marinas@arm.com, will.deacon@arm.com, mark.rutland@arm.com, Julien Thierry Subject: [PATCH v10 09/25] arm64: Unmask PMR before going idle Date: Thu, 31 Jan 2019 14:58:47 +0000 Message-Id: <1548946743-38979-10-git-send-email-julien.thierry@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1548946743-38979-1-git-send-email-julien.thierry@arm.com> References: <1548946743-38979-1-git-send-email-julien.thierry@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org CPU does not received signals for interrupts with a priority masked by ICC_PMR_EL1. This means the CPU might not come back from a WFI instruction. Make sure ICC_PMR_EL1 does not mask interrupts when doing a WFI. Since the logic of cpu_do_idle is becoming a bit more complex than just two instructions, lets turn it from ASM to C. Signed-off-by: Julien Thierry Suggested-by: Daniel Thompson Reviewed-by: Catalin Marinas Reviewed-by: Marc Zyngier Cc: Catalin Marinas Cc: Will Deacon --- arch/arm64/kernel/process.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ arch/arm64/mm/proc.S | 11 ----------- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 6d410fc..3767fb2 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -51,6 +51,7 @@ #include #include +#include #include #include #include @@ -74,6 +75,50 @@ void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd); +static void __cpu_do_idle(void) +{ + dsb(sy); + wfi(); +} + +static void __cpu_do_idle_irqprio(void) +{ + unsigned long pmr; + unsigned long daif_bits; + + daif_bits = read_sysreg(daif); + write_sysreg(daif_bits | PSR_I_BIT, daif); + + /* + * Unmask PMR before going idle to make sure interrupts can + * be raised. + */ + pmr = gic_read_pmr(); + gic_write_pmr(GIC_PRIO_IRQON); + + __cpu_do_idle(); + + gic_write_pmr(pmr); + write_sysreg(daif_bits, daif); +} + +/* + * cpu_do_idle() + * + * Idle the processor (wait for interrupt). + * + * If the CPU supports priority masking we must do additional work to + * ensure that interrupts are not masked at the PMR (because the core will + * not wake up if we block the wake up signal in the interrupt controller). + */ +void cpu_do_idle(void) +{ + if (system_uses_irq_prio_masking()) + __cpu_do_idle_irqprio(); + else + __cpu_do_idle(); +} + /* * This is our default idle handler. */ diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index 73886a5..3ea4f3b 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S @@ -55,17 +55,6 @@ #define MAIR(attr, mt) ((attr) << ((mt) * 8)) -/* - * cpu_do_idle() - * - * Idle the processor (wait for interrupt). - */ -ENTRY(cpu_do_idle) - dsb sy // WFI may enter a low-power mode - wfi - ret -ENDPROC(cpu_do_idle) - #ifdef CONFIG_CPU_PM /** * cpu_do_suspend - save CPU registers context -- 1.9.1