From patchwork Wed Jan 25 06:46:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fu.wei@linaro.org X-Patchwork-Id: 9536469 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 2D1636046A for ; Wed, 25 Jan 2017 06:46:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 05FD726E4E for ; Wed, 25 Jan 2017 06:46:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EE79026E75; Wed, 25 Jan 2017 06:46:35 +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=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7BDDE26E4E for ; Wed, 25 Jan 2017 06:46:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751320AbdAYGqW (ORCPT ); Wed, 25 Jan 2017 01:46:22 -0500 Received: from mail-it0-f52.google.com ([209.85.214.52]:38318 "EHLO mail-it0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751305AbdAYGqT (ORCPT ); Wed, 25 Jan 2017 01:46:19 -0500 Received: by mail-it0-f52.google.com with SMTP id c7so6266444itd.1 for ; Tue, 24 Jan 2017 22:46:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Pa6KgrCIRQRyEzy2E2qZ/3nyu1HGhL2KeXufkj8CzYk=; b=hUuzeD0T1zAatYtrmEqNEbTIZP4lj2Xo49BX1tRCTsxRmt+/PyKTNFjveeNkNHS5KN 9AYL936aEuzPZopXOxy+yBgW+SCGZX5RQXkVwMq9CEAPYAQKmsKKnCPnH/zJm6KQ5vfB 2LrlRiJCeu2EQsgMtlrdlBFCIICt1ZRuhvG3g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Pa6KgrCIRQRyEzy2E2qZ/3nyu1HGhL2KeXufkj8CzYk=; b=Lj074qjnudIWgvII58orUmKxC2+FJr1Tmm8oksCEPmwR9ZIkqAD7ww2AN0iCcXKrxV nK3MKSCPjCNF89d6asc88mqMTRn/4Lhtd+rI5qNriEZn0iOvArWkTfq4wC2boWWMMVc3 OJdXxIv0y53ABf0KHAHAwdy+nU3FgeSMOtNBQeUNMXg9Lee3sdU/lGuicsqiqwicY7N8 PNSSd954ym4w0HdH1MFAEWQfwGB+4U+bfpIFHP7jM04Ze5OrnR82AT0/avCBPLIF3/mQ rfJw/JcFXxifzQDQS/WDn36i4ZbSk9hMRIyeg/1PqCmgl7PYqessvaD+4UA5VG9DbEHd 45Xw== X-Gm-Message-State: AIkVDXJ6bSnFtiFEnRnJ7ezefvq+dRw9ws9jYv+AhdpTDa7uwBvt6K40yP23BHN2aIJxXvIW1kDCpKBjZexjXOsN X-Received: by 10.36.14.213 with SMTP id 204mr22526215ite.80.1485326773590; Tue, 24 Jan 2017 22:46:13 -0800 (PST) MIME-Version: 1.0 Received: by 10.79.138.70 with HTTP; Tue, 24 Jan 2017 22:46:12 -0800 (PST) In-Reply-To: <20170124172400.GG7572@leverpostej> References: <20170118132541.8989-1-fu.wei@linaro.org> <20170118132541.8989-9-fu.wei@linaro.org> <20170124172400.GG7572@leverpostej> From: Fu Wei Date: Wed, 25 Jan 2017 14:46:12 +0800 Message-ID: Subject: Re: [PATCH v20 08/17] clocksource/drivers/arm_arch_timer: Rework counter frequency detection. To: Mark Rutland Cc: "Rafael J. Wysocki" , Len Brown , Daniel Lezcano , Thomas Gleixner , Marc Zyngier , Lorenzo Pieralisi , Sudeep Holla , Hanjun Guo , linux-arm-kernel@lists.infradead.org, Linaro ACPI Mailman List , Linux Kernel Mailing List , ACPI Devel Maling List , rruigrok@codeaurora.org, "Abdulhamid, Harb" , Christopher Covington , Timur Tabi , G Gregory , Al Stone , Jon Masters , Wei Huang , Arnd Bergmann , Catalin Marinas , Will Deacon , Suravee Suthikulpanit , Leo Duran , Wim Van Sebroeck , Guenter Roeck , linux-watchdog@vger.kernel.org, Tomasz Nowicki , Christoffer Dall , Julien Grall Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi Mark, On 25 January 2017 at 01:24, Mark Rutland wrote: > On Wed, Jan 18, 2017 at 09:25:32PM +0800, fu.wei@linaro.org wrote: >> From: Fu Wei >> >> The counter frequency detection call(arch_timer_detect_rate) combines two >> ways to get counter frequency: system coprocessor register and MMIO timer. >> But in a specific timer init code, we only need one way to try: >> getting frequency from MMIO timer register will be needed only when we >> init MMIO timer; getting frequency from system coprocessor register will >> be needed only when we init arch timer. > > When I mentioned this splitting before, I had mean that we'd completely > separate the two, with separate mmio_rate and sysreg_rate variables. sorry for misunderstanding. Are you saying : But what have I learned From ARMv8 ARM is AArch64 System register CNTFRQ_EL0 is provided so that software can discover the frequency of the system counter. CNTFRQ(in CNTCTLBase and CNTBaseN) is provided so that software can discover the frequency of the system counter. The bit assignments of the registers are identical in the System register interface and in the memory-mapped system level interface. So I think they both contain the same value : the frequency of the system counter, just in different view, and can be accessed in different ways. So do we really need to separate mmio_rate and sysreg_rate variables? And for CNTFRQ(in CNTCTLBase and CNTBaseN) , we can NOT access it in Linux kernel (EL1), Because ARMv8 ARM says: In a system that implements both Secure and Non-secure states, this register is only accessible by Secure accesses. That means we still need to get the frequency of the system counter from CNTFRQ_EL0 in MMIO timer code. This have been proved when I tested this driver on foundation model, I got "0" when I access CNTFRQ from Linux kernel (Non-secure EL1) So I guess the logic of the original code is static u32 arch_timer_rate keeps the frequency of the system counter, no matter where the value comes from. Because they should be the same value. if we have got the frequency of the system counter(arch_timer_rate != 0), then we don't need to get it again, even in anther way. But the above is just my thought, and I believe you're the expert of ARM. So please correct me if I misunderstand something. :-) Thanks! > > The probing logic relying on this is complicated and fragile, and I > think these patches are complicating that further (though I appreciate > that's far from the intent). > > I believe we need to split the MMIO and sysreg timer code apart > entirely. I've had a look at that today, though it's been fairly painful > so far. It appears some platforms may inadvertently be relying on the > order and manner in which the rates are probed, which is a major > headache. > > I will try to attack that some more tomorrow. > >> This patch separates paths to determine frequency: >> Separate out the MMIO frequency and the sysreg frequency detection call, >> and use the appropriate one for the counter. >> >> Signed-off-by: Fu Wei >> --- >> drivers/clocksource/arm_arch_timer.c | 40 ++++++++++++++++++++++-------------- >> 1 file changed, 25 insertions(+), 15 deletions(-) >> >> diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c >> index 6484f84..9482481 100644 >> --- a/drivers/clocksource/arm_arch_timer.c >> +++ b/drivers/clocksource/arm_arch_timer.c >> @@ -488,23 +488,33 @@ static int arch_timer_starting_cpu(unsigned int cpu) >> return 0; >> } >> >> -static void arch_timer_detect_rate(void __iomem *cntbase) >> +static void __arch_timer_determine_rate(u32 rate) >> { >> - /* Who has more than one independent system counter? */ >> - if (arch_timer_rate) >> - return; >> + /* Check the timer frequency. */ >> + if (!arch_timer_rate) { >> + if (rate) >> + arch_timer_rate = rate; >> + else >> + pr_warn("frequency not available\n"); >> + } else if (rate && arch_timer_rate != rate) { >> + pr_warn("got different frequency, keep original.\n"); >> + } >> +} > > This function should be killed off entirely. We need to be able to fail > the probe if we cannot determine the rate, and that means we need error > handling in the ACPI and DT cases anyway. > > Thanks, > Mark. diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 663a57a..eec92f6 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -65,7 +65,8 @@ struct arch_timer { #define to_arch_timer(e) container_of(e, struct arch_timer, evt) -static u32 arch_timer_rate; +static u32 arch_timer_sysreg_rate ; +static u32 arch_timer_mmio_rate; static int arch_timer_ppi[ARCH_TIMER_MAX_TIMER_PPI]; static struct clock_event_device __percpu *arch_timer_evt;