Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1561261
| Path | csiph.com!news.redatomik.org!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Fu Wei <fu.wei@linaro.org> |
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH v19 06/15] clocksource/drivers/arm_arch_timer: Rework counter frequency detection. |
| Date | Wed, 18 Jan 2017 05:30:01 +0100 |
| Message-ID | <t0Q2J-7Ky-7@gated-at.bofh.it> (permalink) |
| References | <sQISR-8ka-3@gated-at.bofh.it> <sQISS-8ka-37@gated-at.bofh.it> <t0jJv-3Hq-11@gated-at.bofh.it> |
| 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=JXE8I8mdoO22UGeGtAiBYRtJlGs5oouSRcpR8DyY3TA=; b=EnB1ggqh9N07zZxVjStSlTmndCrnyQ4wtNORK0mYwuOveLkH4dtSNyXPbQmPX3vC2p oE7DH2WWMMqgbd5e0hiokBepv19hTaOkL4IR7gJaVYjahMLAAJLINkh3wH6/EWQy2Z4g Q/k1RioRgyav3FPpnIMZiBT0QHwKkraIWKuVg= |
| 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=JXE8I8mdoO22UGeGtAiBYRtJlGs5oouSRcpR8DyY3TA=; b=CIidM+GIpfAwCWd86T4WGUG/pznFcybbP6irUWQSz2tLguqm6n702C2d+m3jUBWKyG yshxDDwpa1peASsO+n1LivhfOG+UAU5i3uZeT/2paoWGWpLy1XXhMzOPm/FfdCzGHGnG Xoe/NvGCvEN+8EhmJKNijIbPllAyyfK3mXmOd6YkmWT3wkuDuBTQ6lOPY0rB4TWEZWK1 THgUx1IqFVuL9h3gLKSZcBZcOCntrf3pj9OuF6el+rrkAA4lYM4SWIratt8WauSv3SJ+ O4+cdLVJNSCOkF3xIoQMib8wyULwCcnjmw0ZfCRjuJph+FWrpY6BtdUsxI5T9l798qYq 60nw== |
| X-Gm-Message-State | AIkVDXJCxAayK+onXA8NRthxwNVYS3EnuptTGuH8Cu6yfmSxT3nQeotcFfKRKYH1t0vdPXx/XGaNtcpYo8ln9OGa |
| X-Received | by 10.36.0.74 with SMTP id 71mr24613919ita.106.1484713658117; Tue, 17 Jan 2017 20:27:38 -0800 (PST) |
| MIME-Version | 1.0 |
| Content-Type | text/plain; charset=UTF-8 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 181 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | "Rafael J. Wysocki" <rjw@rjwysocki.net>, Len Brown <lenb@kernel.org>, Daniel Lezcano <daniel.lezcano@linaro.org>, Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com>, Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>, Sudeep Holla <sudeep.holla@arm.com>, Hanjun Guo <hanjun.guo@linaro.org>, linux-arm-kernel@lists.infradead.org, Linaro ACPI Mailman List <linaro-acpi@lists.linaro.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, ACPI Devel Maling List <linux-acpi@vger.kernel.org>, rruigrok@codeaurora.org, "Abdulhamid, Harb" <harba@codeaurora.org>, Christopher Covington <cov@codeaurora.org>, Timur Tabi <timur@codeaurora.org>, G Gregory <graeme.gregory@linaro.org>, Al Stone <al.stone@linaro.org>, Jon Masters <jcm@redhat.com>, Wei Huang <wei@redhat.com>, Arnd Bergmann <arnd@arndb.de>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>, Leo Duran <leo.duran@amd.com>, Wim Van Sebroeck <wim@iguana.be>, Guenter Roeck <linux@roeck-us.net>, linux-watchdog@vger.kernel.org, Tomasz Nowicki <tn@semihalf.com>, Christoffer Dall <christoffer.dall@linaro.org>, Julien Grall <julien.grall@arm.com> |
| X-Original-Date | Wed, 18 Jan 2017 12:27:37 +0800 |
| X-Original-Message-ID | <CADyBb7tMaOJ9D-AYnaNP1OX8kkst7DCkVT0giB2HqdrjSpgX3A@mail.gmail.com> |
| X-Original-References | <20161221064603.11830-1-fu.wei@linaro.org> <20161221064603.11830-7-fu.wei@linaro.org> <20170116175025.GJ5908@leverpostej> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1561261 |
Show key headers only | View raw
Hi Mark,
On 17 January 2017 at 01:50, Mark Rutland <mark.rutland@arm.com> wrote:
> On Wed, Dec 21, 2016 at 02:45:54PM +0800, fu.wei@linaro.org wrote:
>> From: Fu Wei <fu.wei@linaro.org>
>>
>> Currently, the counter frequency detection call(arch_timer_detect_rate)
>> combines all the ways to get counter frequency: device-tree property,
>> system coprocessor register, MMIO timer. But in the most of use cases,
>> we don't need all the ways to try:
>> For example, reading device-tree property will be needed only when
>> system boot with device-tree, getting frequency from MMIO timer register
>> will beneeded only when we init MMIO timer.
>>
>> This patch separates paths to determine frequency:
>> Separate out device-tree code, keep them in device-tree init function.
>
> Splitting these out makes sense to me.
OK , will do
>
>> Separate out the MMIO frequency and the sysreg frequency detection call,
>> and use the appropriate one for the counter.
>
>> Signed-off-by: Fu Wei <fu.wei@linaro.org>
>> Tested-by: Xiongfeng Wang <wangxiongfeng2@huawei.com>
>> ---
>> drivers/clocksource/arm_arch_timer.c | 49 +++++++++++++++++++++++-------------
>> 1 file changed, 31 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
>> index c7b4482..9a1f138 100644
>> --- a/drivers/clocksource/arm_arch_timer.c
>> +++ b/drivers/clocksource/arm_arch_timer.c
>> @@ -488,27 +488,31 @@ static int arch_timer_starting_cpu(unsigned int cpu)
>> return 0;
>> }
>>
>> -static void
>> -arch_timer_detect_rate(void __iomem *cntbase, struct device_node *np)
>> +static void arch_timer_detect_rate(void)
>> {
>> - /* Who has more than one independent system counter? */
>> - if (arch_timer_rate)
>> - return;
>> + /*
>> + * Try to get the timer frequency from
>> + * cntfrq_el0(system coprocessor register).
>> + */
>> + if (!arch_timer_rate)
>> + arch_timer_rate = arch_timer_get_cntfrq();
>> +
>> + /* Check the timer frequency. */
>> + if (!arch_timer_rate)
>> + pr_warn("frequency not available\n");
>> +}
>>
>> +static void arch_timer_mem_detect_rate(void __iomem *cntbase)
>> +{
>> /*
>> - * Try to determine the frequency from the device tree or CNTFRQ,
>> - * if ACPI is enabled, get the frequency from CNTFRQ ONLY.
>> + * Try to determine the frequency from
>> + * CNTFRQ in memory-mapped timer.
>> */
>> - if (!acpi_disabled ||
>> - of_property_read_u32(np, "clock-frequency", &arch_timer_rate)) {
>> - if (cntbase)
>> - arch_timer_rate = readl_relaxed(cntbase + CNTFRQ);
>> - else
>> - arch_timer_rate = arch_timer_get_cntfrq();
>> - }
>> + if (!arch_timer_rate)
>> + arch_timer_rate = readl_relaxed(cntbase + CNTFRQ);
>>
>> /* Check the timer frequency. */
>> - if (arch_timer_rate == 0)
>> + if (!arch_timer_rate)
I think you mean this one, this is for keeping consistency with
arch_timer_detect_rate.
>> pr_warn("frequency not available\n");
>> }
>
> There's a subtle change in behaviour here. Previously for ACPI we'd only
> ever use the sysreg CNTFRQ value for arch_timer_rate, whereas now we
> might use the MMIO timer rate. Maybe that's not a big deal, but I will
> need to think.
>
> Generally, the logic to determine the rate is fairly gnarly regardless.
>
> It would be nice if we could split the MMIO and sysreg rates entirely,
Yes, I am doing this way,
For sysreg rates,
static void arch_timer_detect_rate(void)
{
/*
* Try to get the timer frequency from
* cntfrq_el0(system coprocessor register).
*/
if (!arch_timer_rate)
arch_timer_rate = arch_timer_get_cntfrq();
/* Check the timer frequency. */
if (!arch_timer_rate)
pr_warn("frequency not available\n");
}
For MMIO timer,
static void arch_timer_mem_detect_rate(void __iomem *cntbase)
{
/*
* Try to determine the frequency from
* CNTFRQ in memory-mapped timer.
*/
if (!arch_timer_rate)
arch_timer_rate = readl_relaxed(cntbase + CNTFRQ);
/* Check the timer frequency. */
if (!arch_timer_rate)
pr_warn("frequency not available\n");
}
in arch_time_*_init, only call arch_timer_detect_rate,
in arch_timer_mem_init, only call arch_timer_mem_detect_rate.
But you are right, this is fairly gnarly regardless.
> and kill the implicit relationship between the two, or at least make one
> canonical and warn if the two differ.
So I think maybe we can do this:
static void __arch_timer_determine_rate(u32 rate)
{
/* Check the timer frequency. */
if (!arch_timer_rate)
if (rate)
arch_timer_rate = rate;
else
pr_warn("frequency not available\n");
else if (arch_timer_rate != rate)
pr_warn("got different frequency, keep original.\n");
}
static void arch_timer_detect_rate(void)
{
/*
* Try to get the timer frequency from
* cntfrq_el0(system coprocessor register).
*/
__arch_timer_determine_rate(arch_timer_get_cntfrq());
}
static void arch_timer_mem_detect_rate(void __iomem *cntbase)
{
/*
* Try to get the timer frequency from
* CNTFRQ in the MMIO timer.
*/
__arch_timer_determine_rate(readl_relaxed(cntbase + CNTFRQ));
}
any thought?
>
> Thanks,
> Mark.
--
Best regards,
Fu Wei
Software Engineer
Red Hat
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
Re: [PATCH v19 06/15] clocksource/drivers/arm_arch_timer: Rework counter frequency detection. Fu Wei <fu.wei@linaro.org> - 2017-01-18 05:30 +0100
csiph-web