From: Mark Rutland <mark.rutland@arm.com> To: fu.wei@linaro.org Cc: rjw@rjwysocki.net, lenb@kernel.org, daniel.lezcano@linaro.org, tglx@linutronix.de, marc.zyngier@arm.com, lorenzo.pieralisi@arm.com, sudeep.holla@arm.com, hanjun.guo@linaro.org, linux-arm-kernel@lists.infradead.org, linaro-acpi@lists.linaro.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, rruigrok@codeaurora.org, harba@codeaurora.org, cov@codeaurora.org, timur@codeaurora.org, graeme.gregory@linaro.org, al.stone@linaro.org, jcm@redhat.com, wei@redhat.com, arnd@arndb.de, catalin.marinas@arm.com, will.deacon@arm.com, Suravee.Suthikulpanit@amd.com, leo.duran@amd.com, wim@iguana.be, linux@roeck-us.net, linux-watchdog@vger.kernel.org, tn@semihalf.com, christoffer.dall@linaro.org, julien.grall@arm.com Subject: Re: [PATCH v20 08/17] clocksource/drivers/arm_arch_timer: Rework counter frequency detection. Date: Tue, 24 Jan 2017 17:24:00 +0000 [thread overview] Message-ID: <20170124172400.GG7572@leverpostej> (raw) In-Reply-To: <20170118132541.8989-9-fu.wei@linaro.org> On Wed, Jan 18, 2017 at 09:25:32PM +0800, fu.wei@linaro.org wrote: > From: Fu Wei <fu.wei@linaro.org> > > 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. 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 <fu.wei@linaro.org> > --- > 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.
WARNING: multiple messages have this Message-ID (diff)
From: mark.rutland@arm.com (Mark Rutland) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v20 08/17] clocksource/drivers/arm_arch_timer: Rework counter frequency detection. Date: Tue, 24 Jan 2017 17:24:00 +0000 [thread overview] Message-ID: <20170124172400.GG7572@leverpostej> (raw) In-Reply-To: <20170118132541.8989-9-fu.wei@linaro.org> On Wed, Jan 18, 2017 at 09:25:32PM +0800, fu.wei at linaro.org wrote: > From: Fu Wei <fu.wei@linaro.org> > > 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. 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 <fu.wei@linaro.org> > --- > 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.
next prev parent reply other threads:[~2017-01-24 17:25 UTC|newest] Thread overview: 134+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-01-18 13:25 [PATCH v20 00/17] acpi, clocksource: add GTDT driver and GTDT support in arm_arch_timer fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` [PATCH v20 01/17] clocksource/drivers/arm_arch_timer: Improve printk relevant code fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` [PATCH v20 02/17] clocksource/drivers/arm_arch_timer: Rename the timer type macros fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 03/17] clocksource/drivers/arm_arch_timer: Rename the PPI enum and its values fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` [PATCH v20 04/17] clocksource/drivers/arm_arch_timer: Move enums and defines to header file fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 05/17] clocksource/drivers/arm_arch_timer: Add a new enum for spi type fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 06/17] clocksource/drivers/arm_arch_timer: rework PPI determination fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 07/17] clocksource/drivers/arm_arch_timer: Separate out device-tree code from arch_timer_detect_rate fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 08/17] clocksource/drivers/arm_arch_timer: Rework counter frequency detection fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org [not found] ` <20170118132541.8989-9-fu.wei-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2017-01-19 8:02 ` Hanjun Guo 2017-01-19 8:02 ` Hanjun Guo 2017-01-19 8:02 ` Hanjun Guo [not found] ` <cafa8c7a-9c7c-51ba-5566-0cfe1fe6f764-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2017-01-19 9:44 ` Fu Wei 2017-01-19 9:44 ` Fu Wei 2017-01-19 9:44 ` Fu Wei 2017-01-19 12:41 ` Hanjun Guo 2017-01-19 12:41 ` Hanjun Guo 2017-01-19 12:41 ` Hanjun Guo 2017-01-19 12:41 ` Hanjun Guo 2017-01-24 17:24 ` Mark Rutland [this message] 2017-01-24 17:24 ` Mark Rutland 2017-01-25 6:46 ` Fu Wei 2017-01-25 6:46 ` Fu Wei 2017-01-25 6:46 ` Fu Wei 2017-01-25 7:23 ` Fu Wei 2017-01-25 7:23 ` Fu Wei 2017-01-25 7:23 ` Fu Wei 2017-01-25 15:38 ` Christopher Covington 2017-01-25 15:38 ` Christopher Covington 2017-01-25 15:38 ` Christopher Covington 2017-01-25 17:36 ` Mark Rutland 2017-01-25 17:36 ` Mark Rutland 2017-01-25 17:36 ` Mark Rutland 2017-01-26 5:55 ` Fu Wei 2017-01-26 5:55 ` Fu Wei 2017-01-26 5:55 ` Fu Wei 2017-01-25 17:25 ` Mark Rutland 2017-01-25 17:25 ` Mark Rutland 2017-01-25 17:25 ` Mark Rutland 2017-01-26 5:49 ` Fu Wei 2017-01-26 5:49 ` Fu Wei 2017-01-26 5:49 ` Fu Wei 2017-01-30 17:49 ` Mark Rutland 2017-01-30 17:49 ` Mark Rutland 2017-01-30 17:49 ` Mark Rutland 2017-01-31 11:42 ` Mark Rutland 2017-01-31 11:42 ` Mark Rutland 2017-01-31 11:42 ` Mark Rutland 2017-01-31 18:43 ` Fu Wei 2017-01-31 18:43 ` Fu Wei 2017-01-31 18:43 ` Fu Wei 2017-01-31 18:49 ` Mark Rutland 2017-01-31 18:49 ` Mark Rutland 2017-01-31 18:49 ` Mark Rutland 2017-01-31 19:07 ` Fu Wei 2017-01-31 19:07 ` Fu Wei 2017-01-31 19:07 ` Fu Wei 2017-01-18 13:25 ` [PATCH v20 09/17] clocksource/drivers/arm_arch_timer: Refactor arch_timer_needs_probing fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 10/17] clocksource/drivers/arm_arch_timer: Move arch_timer_needs_of_probing into DT init call fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 11/17] clocksource/drivers/arm_arch_timer: Introduce some new structs to prepare for GTDT fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-19 8:28 ` Hanjun Guo 2017-01-19 8:28 ` Hanjun Guo 2017-01-19 9:47 ` Fu Wei 2017-01-19 9:47 ` Fu Wei 2017-01-19 9:47 ` Fu Wei 2017-01-18 13:25 ` [PATCH v20 12/17] clocksource/drivers/arm_arch_timer: Refactor MMIO timer probing fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 13/17] acpi/arm64: Add GTDT table parse driver fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-19 9:11 ` Hanjun Guo 2017-01-19 9:11 ` Hanjun Guo [not found] ` <e69d80d1-0954-b1be-817e-c0be6fc24b77-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2017-01-19 10:32 ` Fu Wei 2017-01-19 10:32 ` Fu Wei 2017-01-19 10:32 ` Fu Wei 2017-01-19 11:16 ` Mark Rutland 2017-01-19 11:16 ` Mark Rutland 2017-01-19 11:16 ` Mark Rutland 2017-01-19 12:28 ` Fu Wei 2017-01-19 12:28 ` Fu Wei 2017-01-19 12:28 ` Fu Wei 2017-01-18 13:25 ` [PATCH v20 14/17] clocksource/drivers/arm_arch_timer: Simplify ACPI support code fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 15/17] acpi/arm64: Add memory-mapped timer support in GTDT driver fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` [PATCH v20 16/17] clocksource/drivers/arm_arch_timer: Add GTDT support for memory-mapped timer fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org [not found] ` <20170118132541.8989-17-fu.wei-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2017-01-19 9:16 ` Hanjun Guo 2017-01-19 9:16 ` Hanjun Guo 2017-01-19 9:16 ` Hanjun Guo 2017-01-19 10:02 ` Fu Wei 2017-01-19 10:02 ` Fu Wei 2017-01-19 10:02 ` Fu Wei 2017-01-19 12:42 ` Hanjun Guo 2017-01-19 12:42 ` Hanjun Guo 2017-01-19 12:42 ` Hanjun Guo 2017-01-18 13:25 ` [PATCH v20 17/17] acpi/arm64: Add SBSA Generic Watchdog support in GTDT driver fu.wei 2017-01-18 13:25 ` fu.wei at linaro.org 2017-01-18 13:25 ` fu.wei 2017-01-18 13:25 ` fu.wei 2017-01-19 9:20 ` [PATCH v20 00/17] acpi, clocksource: add GTDT driver and GTDT support in arm_arch_timer Hanjun Guo 2017-01-19 9:20 ` Hanjun Guo 2017-01-19 9:20 ` Hanjun Guo 2017-01-19 11:06 ` Fu Wei 2017-01-19 11:06 ` Fu Wei 2017-01-19 11:06 ` Fu Wei 2017-01-23 18:54 ` Mark Rutland 2017-01-23 18:54 ` Mark Rutland 2017-01-24 5:11 ` Fu Wei 2017-01-24 5:11 ` Fu Wei 2017-01-24 5:11 ` Fu Wei
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170124172400.GG7572@leverpostej \ --to=mark.rutland@arm.com \ --cc=Suravee.Suthikulpanit@amd.com \ --cc=al.stone@linaro.org \ --cc=arnd@arndb.de \ --cc=catalin.marinas@arm.com \ --cc=christoffer.dall@linaro.org \ --cc=cov@codeaurora.org \ --cc=daniel.lezcano@linaro.org \ --cc=fu.wei@linaro.org \ --cc=graeme.gregory@linaro.org \ --cc=hanjun.guo@linaro.org \ --cc=harba@codeaurora.org \ --cc=jcm@redhat.com \ --cc=julien.grall@arm.com \ --cc=lenb@kernel.org \ --cc=leo.duran@amd.com \ --cc=linaro-acpi@lists.linaro.org \ --cc=linux-acpi@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-watchdog@vger.kernel.org \ --cc=linux@roeck-us.net \ --cc=lorenzo.pieralisi@arm.com \ --cc=marc.zyngier@arm.com \ --cc=rjw@rjwysocki.net \ --cc=rruigrok@codeaurora.org \ --cc=sudeep.holla@arm.com \ --cc=tglx@linutronix.de \ --cc=timur@codeaurora.org \ --cc=tn@semihalf.com \ --cc=wei@redhat.com \ --cc=will.deacon@arm.com \ --cc=wim@iguana.be \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.