Message ID | 1475086637-1914-6-git-send-email-fu.wei@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Sep 29, 2016 at 02:17:13AM +0800, fu.wei@linaro.org wrote: > From: Fu Wei <fu.wei@linaro.org> > > The patch update arm_arch_timer driver to use the function > provided by the new GTDT driver of ACPI. > By this way, arm_arch_timer.c can be simplified, and separate > all the ACPI GTDT knowledge from this timer driver. > > Signed-off-by: Fu Wei <fu.wei@linaro.org> > Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org> This generally looks fine, but: > + arch_timer_ppi[PHYS_SECURE_PPI] = acpi_gtdt_map_ppi(PHYS_SECURE_PPI); As mentioned on the prior patch, I think we shouldn't bother parsing the secure interrupt, given the problem with the GSIV, and the fact that we shouldn't need it in Linux. > + arch_timer_ppi[PHYS_NONSECURE_PPI] = acpi_gtdt_map_ppi(PHYS_NONSECURE_PPI); > + arch_timer_ppi[VIRT_PPI] = acpi_gtdt_map_ppi(VIRT_PPI); > + arch_timer_ppi[HYP_PPI] = acpi_gtdt_map_ppi(HYP_PPI); > + /* Always-on capability */ > + arch_timer_c3stop = acpi_gtdt_c3stop(); ... I think we should check the flag on the relevant interrupt, though that's worth clarifying. > > - /* Always-on capability */ > - arch_timer_c3stop = !(gtdt->non_secure_el1_flags & ACPI_GTDT_ALWAYS_ON); > + if (timer_count < 0) > + pr_err("Failed to get platform timer info.\n"); Why don't we log this in the code that would try to initialise the MMIO timer? We can still fail after this. Thanks, Mark.
On Thu, Oct 20, 2016 at 05:58:17PM +0100, Mark Rutland wrote: > On Thu, Sep 29, 2016 at 02:17:13AM +0800, fu.wei@linaro.org wrote: > > + arch_timer_ppi[PHYS_NONSECURE_PPI] = acpi_gtdt_map_ppi(PHYS_NONSECURE_PPI); > > + arch_timer_ppi[VIRT_PPI] = acpi_gtdt_map_ppi(VIRT_PPI); > > + arch_timer_ppi[HYP_PPI] = acpi_gtdt_map_ppi(HYP_PPI); > > + /* Always-on capability */ > > + arch_timer_c3stop = acpi_gtdt_c3stop(); > > ... I think we should check the flag on the relevant interrupt, though > that's worth clarifying. I see I misread the spec; this is part of the common flags. Please ignore this point; sorry for the noise. Thanks, Mark.
On Fri, Oct 21, 2016 at 12:14:01PM +0100, Mark Rutland wrote: > On Thu, Oct 20, 2016 at 05:58:17PM +0100, Mark Rutland wrote: > > On Thu, Sep 29, 2016 at 02:17:13AM +0800, fu.wei@linaro.org wrote: > > > + arch_timer_ppi[PHYS_NONSECURE_PPI] = acpi_gtdt_map_ppi(PHYS_NONSECURE_PPI); > > > + arch_timer_ppi[VIRT_PPI] = acpi_gtdt_map_ppi(VIRT_PPI); > > > + arch_timer_ppi[HYP_PPI] = acpi_gtdt_map_ppi(HYP_PPI); > > > + /* Always-on capability */ > > > + arch_timer_c3stop = acpi_gtdt_c3stop(); > > > > ... I think we should check the flag on the relevant interrupt, though > > that's worth clarifying. > > I see I misread the spec; this is part of the common flags. > > Please ignore this point; sorry for the noise. Actually, I misread the spec this time around; the flag *can* differ per interrupt for the sysreg/cp15 timer, but not for the MMIO timers where the flag is in a common field. So please *do* consider the above. Thanks, Mark.
Hi Mark, On 21 October 2016 at 19:21, Mark Rutland <mark.rutland@arm.com> wrote: > On Fri, Oct 21, 2016 at 12:14:01PM +0100, Mark Rutland wrote: >> On Thu, Oct 20, 2016 at 05:58:17PM +0100, Mark Rutland wrote: >> > On Thu, Sep 29, 2016 at 02:17:13AM +0800, fu.wei@linaro.org wrote: >> > > + arch_timer_ppi[PHYS_NONSECURE_PPI] = acpi_gtdt_map_ppi(PHYS_NONSECURE_PPI); >> > > + arch_timer_ppi[VIRT_PPI] = acpi_gtdt_map_ppi(VIRT_PPI); >> > > + arch_timer_ppi[HYP_PPI] = acpi_gtdt_map_ppi(HYP_PPI); >> > > + /* Always-on capability */ >> > > + arch_timer_c3stop = acpi_gtdt_c3stop(); >> > >> > ... I think we should check the flag on the relevant interrupt, though >> > that's worth clarifying. >> >> I see I misread the spec; this is part of the common flags. >> >> Please ignore this point; sorry for the noise. > > Actually, I misread the spec this time around; the flag *can* differ per > interrupt for the sysreg/cp15 timer, but not for the MMIO timers where > the flag is in a common field. > > So please *do* consider the above. yes , you are right , will do Thanks :-) > > Thanks, > Mark.
On 10/21/2016 07:21 PM, Mark Rutland wrote: > On Fri, Oct 21, 2016 at 12:14:01PM +0100, Mark Rutland wrote: >> On Thu, Oct 20, 2016 at 05:58:17PM +0100, Mark Rutland wrote: >>> On Thu, Sep 29, 2016 at 02:17:13AM +0800, fu.wei@linaro.org wrote: >>>> + arch_timer_ppi[PHYS_NONSECURE_PPI] = acpi_gtdt_map_ppi(PHYS_NONSECURE_PPI); >>>> + arch_timer_ppi[VIRT_PPI] = acpi_gtdt_map_ppi(VIRT_PPI); >>>> + arch_timer_ppi[HYP_PPI] = acpi_gtdt_map_ppi(HYP_PPI); >>>> + /* Always-on capability */ >>>> + arch_timer_c3stop = acpi_gtdt_c3stop(); >>> >>> ... I think we should check the flag on the relevant interrupt, though >>> that's worth clarifying. >> >> I see I misread the spec; this is part of the common flags. >> >> Please ignore this point; sorry for the noise. > > Actually, I misread the spec this time around; the flag *can* differ per > interrupt for the sysreg/cp15 timer, but not for the MMIO timers where > the flag is in a common field. > > So please *do* consider the above. Sorry, misread the email as well... Check the spec again and it's per interrupt flag. Thanks Hanjun
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index b58d259..a63bf12 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -8,6 +8,7 @@ config CLKSRC_OF config CLKSRC_ACPI bool select CLKSRC_PROBE + select ACPI_GTDT if ARM64 config CLKSRC_PROBE bool diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 84be023..c7b0040 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -887,61 +887,35 @@ out: CLOCKSOURCE_OF_DECLARE(armv7_arch_timer_mem, "arm,armv7-timer-mem", arch_timer_mem_init); -#ifdef CONFIG_ACPI -static int __init map_generic_timer_interrupt(u32 interrupt, u32 flags) -{ - int trigger, polarity; - - if (!interrupt) - return 0; - - trigger = (flags & ACPI_GTDT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE - : ACPI_LEVEL_SENSITIVE; - - polarity = (flags & ACPI_GTDT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW - : ACPI_ACTIVE_HIGH; - - return acpi_register_gsi(NULL, interrupt, trigger, polarity); -} - +#ifdef CONFIG_ACPI_GTDT /* Initialize per-processor generic timer */ static int __init arch_timer_acpi_init(struct acpi_table_header *table) { - struct acpi_table_gtdt *gtdt; + int timer_count; if (arch_timers_present & ARCH_CP15_TIMER) { pr_warn("already initialized, skipping\n"); return -EINVAL; } - gtdt = container_of(table, struct acpi_table_gtdt, header); - arch_timers_present |= ARCH_CP15_TIMER; - arch_timer_ppi[PHYS_SECURE_PPI] = - map_generic_timer_interrupt(gtdt->secure_el1_interrupt, - gtdt->secure_el1_flags); - - arch_timer_ppi[PHYS_NONSECURE_PPI] = - map_generic_timer_interrupt(gtdt->non_secure_el1_interrupt, - gtdt->non_secure_el1_flags); + timer_count = acpi_gtdt_init(table); - arch_timer_ppi[VIRT_PPI] = - map_generic_timer_interrupt(gtdt->virtual_timer_interrupt, - gtdt->virtual_timer_flags); - - arch_timer_ppi[HYP_PPI] = - map_generic_timer_interrupt(gtdt->non_secure_el2_interrupt, - gtdt->non_secure_el2_flags); + arch_timer_ppi[PHYS_SECURE_PPI] = acpi_gtdt_map_ppi(PHYS_SECURE_PPI); + arch_timer_ppi[PHYS_NONSECURE_PPI] = acpi_gtdt_map_ppi(PHYS_NONSECURE_PPI); + arch_timer_ppi[VIRT_PPI] = acpi_gtdt_map_ppi(VIRT_PPI); + arch_timer_ppi[HYP_PPI] = acpi_gtdt_map_ppi(HYP_PPI); + /* Always-on capability */ + arch_timer_c3stop = acpi_gtdt_c3stop(); /* Get the frequency from CNTFRQ */ arch_timer_detect_rate(NULL, NULL); - /* Always-on capability */ - arch_timer_c3stop = !(gtdt->non_secure_el1_flags & ACPI_GTDT_ALWAYS_ON); + if (timer_count < 0) + pr_err("Failed to get platform timer info.\n"); - arch_timer_init(); - return 0; + return arch_timer_init(); } CLOCKSOURCE_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init); #endif