Skip to contentSkip to conversation

Versatile Express: add support for local timers on CA9X4 daughterboard

PATCH New Will Deacon 2 participants 6 messages Jun 7, 2010 – Jul 9, 2010

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Versatile Express: add support for local timers on CA9X4 daughterboard

This patch adds support for the Cortex-A9 local timers available when using the CA9X4 daughterboard with the Versatile Express.

---
 arch/arm/Kconfig                               |    5 +++--
 arch/arm/mach-vexpress/ct-ca9x4.c              |   14 ++++++++------
 arch/arm/mach-vexpress/include/mach/ct-ca9x4.h |    1 +
 3 files changed, 12 insertions(+), 8 deletions(-)
arch/arm/Kconfig +3 -2
index 98922f7..7b117b1 100644
@@ -1172,9 +1172,10 @@ config HOTPLUG_CPU
 config LOCAL_TIMERS
 	bool "Use local timer interrupts"
 	depends on SMP && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || \
-		REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || ARCH_U8500)
+		REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
+		ARCH_U8500 || ARCH_VEXPRESS_CA9X4)
 	default y
-	select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500)
+	select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_VEXPRESS || ARCH_OMAP4 || ARCH_U8500)
 	help
 	  Enable support for local timers on SMP platforms, rather then the
 	  legacy IPI broadcast method.  Local timers allows the system
arch/arm/mach-vexpress/ct-ca9x4.c +8 -6
index e6f7303..3762fc8 100644
@@ -14,6 +14,7 @@
 #include <asm/hardware/gic.h>
 #include <asm/mach-types.h>
 #include <asm/pmu.h>
+#include <asm/smp_twd.h>
 
 #include <mach/clkdev.h>
 #include <mach/ct-ca9x4.h>
@@ -63,20 +64,25 @@ static void __init ct_ca9x4_init_irq(void)
 	gic_cpu_init(0, gic_cpu_base_addr);
 }
 
-#if 0
 static void ct_ca9x4_timer_init(void)
 {
+#if 0
 	writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL);
 	writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL);
 
 	sp804_clocksource_init(MMIO_P2V(CT_CA9X4_TIMER1));
 	sp804_clockevents_init(MMIO_P2V(CT_CA9X4_TIMER0), IRQ_CT_CA9X4_TIMER0);
+#endif
+
+#ifdef CONFIG_LOCAL_TIMERS
+	twd_base = MMIO_P2V(A9_MPCORE_TWD);
+#endif
+	v2m_timer.init();
 }
 
 static struct sys_timer ct_ca9x4_timer = {
 	.init	= ct_ca9x4_timer_init,
 };
-#endif
 
 static struct clcd_panel xvga_panel = {
 	.mode		= {
@@ -240,10 +246,6 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4")
 	.boot_params	= PHYS_OFFSET + 0x00000100,
 	.map_io		= ct_ca9x4_map_io,
 	.init_irq	= ct_ca9x4_init_irq,
-#if 0
 	.timer		= &ct_ca9x4_timer,
-#else
-	.timer		= &v2m_timer,
-#endif
 	.init_machine	= ct_ca9x4_init,
 MACHINE_END
arch/arm/mach-vexpress/include/mach/ct-ca9x4.h +1 -0
index 8650f04..f9e2f8d 100644
@@ -28,6 +28,7 @@
 #define A9_MPCORE_SCU		(CT_CA9X4_MPIC + 0x0000)
 #define A9_MPCORE_GIC_CPU	(CT_CA9X4_MPIC + 0x0100)
 #define A9_MPCORE_GIT		(CT_CA9X4_MPIC + 0x0200)
+#define A9_MPCORE_TWD		(CT_CA9X4_MPIC + 0x0600)
 #define A9_MPCORE_GIC_DIST	(CT_CA9X4_MPIC + 0x1000)
 
 /*
Signature · 1 line
1.6.3.3
#1 lore raw

PATCH 1/1 Versatile Express: add support for local timers on CA9X4 daughterboard

Hi Russell,

Quoted 5 lines

[PATCH] Versatile Express: add support for local timers on CA9X4 daughterboard

This patch adds support for the Cortex-A9 local timers available when using the CA9X4 daughterboard with the Versatile Express.

Quoted 9 lines
---
 arch/arm/Kconfig                               |    5 +++--
 arch/arm/mach-vexpress/ct-ca9x4.c              |   14 ++++++++------
 arch/arm/mach-vexpress/include/mach/ct-ca9x4.h |    1 +
 3 files changed, 12 insertions(+), 8 deletions(-)

Do you have any objections to this patch, or can I submit it to the patch system please? There are some timer init functions in ct-ca9x4.c that are commented out so I'd like to make sure I'm not interfering with any future plans.

Thanks,

Will

#2 lore raw

PATCH 1/1 Versatile Express: add support for local timers on CA9X4 daughterboard

In reply to Will Deacon
Quoted 2 lines · Will Deacon

This patch adds support for the Cortex-A9 local timers available when using the CA9X4 daughterboard with the Versatile Express.

I'd rather we didn't change the timer stuff like this - all that you seem to want is some way to setup the twd base address. Can this be done via .map_io method instead?

#3 lore raw

PATCH 1/1 Versatile Express: add support for local timers on CA9X4 daughterboard

Hello Russell,

Quoted 7 lines · Will Deacon
Quoted 2 lines

This patch adds support for the Cortex-A9 local timers available when using the CA9X4 daughterboard with the Versatile Express.

I'd rather we didn't change the timer stuff like this - all that you seem to want is some way to setup the twd base address. Can this be done via .map_io method instead?

That's a lot tidier, how about something like this?:

arch/arm/Kconfig +3 -2
index 98922f7..7b117b1 100644
@@ -1172,9 +1172,10 @@ config HOTPLUG_CPU
 config LOCAL_TIMERS
        bool "Use local timer interrupts"
        depends on SMP && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || \
-               REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || ARCH_U8500)
+               REALVIEW_EB_A9MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
+               ARCH_U8500 || ARCH_VEXPRESS_CA9X4)
        default y
-       select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500)
+       select HAVE_ARM_TWD if (ARCH_REALVIEW || ARCH_VEXPRESS || ARCH_OMAP4 || ARCH_U8500)
        help
          Enable support for local timers on SMP platforms, rather then the
          legacy IPI broadcast method.  Local timers allows the system
arch/arm/mach-vexpress/ct-ca9x4.c +2 -0
index 6353459..577df6c 100644
@@ -16,6 +16,7 @@
 #include <asm/hardware/gic.h>
 #include <asm/mach-types.h>
 #include <asm/pmu.h>
+#include <asm/smp_twd.h>
 
 #include <mach/clkdev.h>
 #include <mach/ct-ca9x4.h>
@@ -53,6 +54,7 @@ static struct map_desc ct_ca9x4_io_desc[] __initdata = {
 
 static void __init ct_ca9x4_map_io(void)
 {
+       twd_base = MMIO_P2V(A9_MPCORE_TWD);
        v2m_map_io(ct_ca9x4_io_desc, ARRAY_SIZE(ct_ca9x4_io_desc));
 }
 
arch/arm/mach-vexpress/include/mach/ct-ca9x4.h +1 -0
index 8650f04..f9e2f8d 100644
@@ -28,6 +28,7 @@
 #define A9_MPCORE_SCU          (CT_CA9X4_MPIC + 0x0000)
 #define A9_MPCORE_GIC_CPU      (CT_CA9X4_MPIC + 0x0100)
 #define A9_MPCORE_GIT          (CT_CA9X4_MPIC + 0x0200)
+#define A9_MPCORE_TWD          (CT_CA9X4_MPIC + 0x0600)
 #define A9_MPCORE_GIC_DIST     (CT_CA9X4_MPIC + 0x1000)
 
 /*

My only question is; what is the commented-out timer code for in ct-ca9x4.c? It would be nice to get rid of it if it's not useful.

Cheers,

Will

#4 lore raw

PATCH 1/1 Versatile Express: add support for local timers on CA9X4 daughterboard

Quoted 1 line · Will Deacon

That's a lot tidier, how about something like this?:

Yea.

Quoted 2 lines

My only question is; what is the commented-out timer code for in ct-ca9x4.c? It would be nice to get rid of it if it's not useful.

I tried to use the core tile timers, but I couldn't get them to work properly (I don't remember why.) I guess it would be preferable to use the core tile timers as they probably have a faster latency than the baseboard ones. Hence I left the code there for when I can investigate a little more.

#5 lore raw

PATCH 1/1 Versatile Express: add support for local timers on CA9X4 daughterboard

Quoted 4 lines · Will Deacon
Quoted 1 line

That's a lot tidier, how about something like this?:

Yea.

Great - submitted as 6218/1 superseding the old patch.

Quoted 8 lines
Quoted 2 lines

My only question is; what is the commented-out timer code for in ct-ca9x4.c? It would be nice to get rid of it if it's not useful.

I tried to use the core tile timers, but I couldn't get them to work properly (I don't remember why.) I guess it would be preferable to use the core tile timers as they probably have a faster latency than the baseboard ones. Hence I left the code there for when I can investigate a little more.

Ah, ok, I'll leave that alone then.

Thanks,

Will