* [PATCH 0/2] arm: zynq: Enable global timer
@ 2013-09-12 16:50 Soren Brinkmann
2013-09-12 16:50 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Soren Brinkmann
2013-09-12 16:50 ` [PATCH 2/2] arm: zynq: Enable arm_global_timer Soren Brinkmann
0 siblings, 2 replies; 16+ messages in thread
From: Soren Brinkmann @ 2013-09-12 16:50 UTC (permalink / raw)
To: linux-arm-kernel
Hi all,
I'm sitting on this for a while and was waiting for Stephen's patch to
get merged somewhere. Unfortunately that didn't happen yet.
The patch to enable the global timer is pretty straight forward.
Stephen's patch is the result of this thread: https://lkml.org/lkml/2013/7/22/649
and required to prevent the global_timer from becoming the broadcast
device, since the system will hang otherwise.
Soren Brinkmann (1):
arm: zynq: Enable arm_global_timer
Stephen Boyd (1):
tick: broadcast: Deny per-cpu clockevents from being broadcast sources
arch/arm/boot/dts/zynq-7000.dtsi | 8 ++++++++
arch/arm/mach-zynq/Kconfig | 1 +
kernel/time/tick-broadcast.c | 3 +++
3 files changed, 12 insertions(+)
--
1.8.4
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-09-12 16:50 [PATCH 0/2] arm: zynq: Enable global timer Soren Brinkmann
@ 2013-09-12 16:50 ` Soren Brinkmann
2013-09-12 20:30 ` Thomas Gleixner
2013-09-12 16:50 ` [PATCH 2/2] arm: zynq: Enable arm_global_timer Soren Brinkmann
1 sibling, 1 reply; 16+ messages in thread
From: Soren Brinkmann @ 2013-09-12 16:50 UTC (permalink / raw)
To: linux-arm-kernel
From: Stephen Boyd <sboyd@codeaurora.org>
On most ARM systems the per-cpu clockevents are truly per-cpu in
the sense that they can't be controlled on any other CPU besides
the CPU that they interrupt. If one of these clockevents were to
become a broadcast source we will run into a lot of trouble
because the broadcast source is enabled on the first CPU to go
into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
could be a different CPU than what the clockevent is interrupting
(or even worse the CPU that the clockevent interrupts could be
offline).
Theoretically it's possible to support per-cpu clockevents as the
broadcast source but so far we haven't needed this and supporting
it is rather complicated. Let's just deny the possibility for now
until this becomes a reality (let's hope it never does!).
Reported-by: S?ren Brinkmann <soren.brinkmann@xilinx.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
kernel/time/tick-broadcast.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 218bcb5..d3539e5 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -77,6 +77,9 @@ static bool tick_check_broadcast_device(struct clock_event_device *curdev,
!(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
return false;
+ if (cpumask_equal(newdev->cpumask, cpumask_of(smp_processor_id())))
+ return false;
+
return !curdev || newdev->rating > curdev->rating;
}
--
1.8.4
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-09-12 16:50 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Soren Brinkmann
@ 2013-09-12 20:30 ` Thomas Gleixner
2013-09-12 23:48 ` Sören Brinkmann
2013-09-13 8:25 ` Daniel Lezcano
0 siblings, 2 replies; 16+ messages in thread
From: Thomas Gleixner @ 2013-09-12 20:30 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, 12 Sep 2013, Soren Brinkmann wrote:
> From: Stephen Boyd <sboyd@codeaurora.org>
>
> On most ARM systems the per-cpu clockevents are truly per-cpu in
> the sense that they can't be controlled on any other CPU besides
> the CPU that they interrupt. If one of these clockevents were to
> become a broadcast source we will run into a lot of trouble
> because the broadcast source is enabled on the first CPU to go
> into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
> could be a different CPU than what the clockevent is interrupting
> (or even worse the CPU that the clockevent interrupts could be
> offline).
>
> Theoretically it's possible to support per-cpu clockevents as the
> broadcast source but so far we haven't needed this and supporting
> it is rather complicated. Let's just deny the possibility for now
> until this becomes a reality (let's hope it never does!).
Well, we can't do it this way. There are globally accessible clock
event devices which deliver only to cpu0. So the mask check might be
causing failure here.
Just add a feature flag CLOCK_EVT_FEAT_PERCPU to the clock event
device and check for it.
Thanks,
tglx
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-09-12 20:30 ` Thomas Gleixner
@ 2013-09-12 23:48 ` Sören Brinkmann
2013-09-13 14:45 ` Thomas Gleixner
2013-09-13 8:25 ` Daniel Lezcano
1 sibling, 1 reply; 16+ messages in thread
From: Sören Brinkmann @ 2013-09-12 23:48 UTC (permalink / raw)
To: linux-arm-kernel
Hi Thomas,
On Thu, Sep 12, 2013 at 10:30:15PM +0200, Thomas Gleixner wrote:
> On Thu, 12 Sep 2013, Soren Brinkmann wrote:
> > From: Stephen Boyd <sboyd@codeaurora.org>
> >
> > On most ARM systems the per-cpu clockevents are truly per-cpu in
> > the sense that they can't be controlled on any other CPU besides
> > the CPU that they interrupt. If one of these clockevents were to
> > become a broadcast source we will run into a lot of trouble
> > because the broadcast source is enabled on the first CPU to go
> > into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
> > could be a different CPU than what the clockevent is interrupting
> > (or even worse the CPU that the clockevent interrupts could be
> > offline).
> >
> > Theoretically it's possible to support per-cpu clockevents as the
> > broadcast source but so far we haven't needed this and supporting
> > it is rather complicated. Let's just deny the possibility for now
> > until this becomes a reality (let's hope it never does!).
>
> Well, we can't do it this way. There are globally accessible clock
> event devices which deliver only to cpu0. So the mask check might be
> causing failure here.
>
> Just add a feature flag CLOCK_EVT_FEAT_PERCPU to the clock event
> device and check for it.
I gave it a shot. Is this what you imagine:
diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c
index b66c1f3..c639b1a 100644
--- a/drivers/clocksource/arm_global_timer.c
+++ b/drivers/clocksource/arm_global_timer.c
@@ -169,7 +169,8 @@ static int gt_clockevents_init(struct clock_event_device *clk)
int cpu = smp_processor_id();
clk->name = "arm_global_timer";
- clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
+ clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
+ CLOCK_EVT_FEAT_PERCPU;
clk->set_mode = gt_clockevent_set_mode;
clk->set_next_event = gt_clockevent_set_next_event;
clk->cpumask = cpumask_of(cpu);
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 0857922..493aa02 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -60,6 +60,7 @@ enum clock_event_mode {
* Core shall set the interrupt affinity dynamically in broadcast mode
*/
#define CLOCK_EVT_FEAT_DYNIRQ 0x000020
+#define CLOCK_EVT_FEAT_PERCPU 0x000040
/**
* struct clock_event_device - clock event device descriptor
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index d3539e5..de4c5d8 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -70,16 +70,14 @@ static bool tick_check_broadcast_device(struct clock_event_device *curdev,
struct clock_event_device *newdev)
{
if ((newdev->features & CLOCK_EVT_FEAT_DUMMY) ||
- (newdev->features & CLOCK_EVT_FEAT_C3STOP))
+ (newdev->features & CLOCK_EVT_FEAT_C3STOP) ||
+ (newdev->features & CLOCK_EVT_FEAT_PERCPU))
return false;
if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT &&
!(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
return false;
- if (cpumask_equal(newdev->cpumask, cpumask_of(smp_processor_id())))
- return false;
-
return !curdev || newdev->rating > curdev->rating;
}
If this is the way to go, I can prepare this in a v2.
Thanks,
S?ren
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-09-12 23:48 ` Sören Brinkmann
@ 2013-09-13 14:45 ` Thomas Gleixner
2013-09-13 15:25 ` Sören Brinkmann
0 siblings, 1 reply; 16+ messages in thread
From: Thomas Gleixner @ 2013-09-13 14:45 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, 12 Sep 2013, S?ren Brinkmann wrote:
> On Thu, Sep 12, 2013 at 10:30:15PM +0200, Thomas Gleixner wrote:
> I gave it a shot. Is this what you imagine:
> diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c
> index b66c1f3..c639b1a 100644
> --- a/drivers/clocksource/arm_global_timer.c
> +++ b/drivers/clocksource/arm_global_timer.c
> @@ -169,7 +169,8 @@ static int gt_clockevents_init(struct clock_event_device *clk)
> int cpu = smp_processor_id();
>
> clk->name = "arm_global_timer";
> - clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
> + clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
> + CLOCK_EVT_FEAT_PERCPU;
> clk->set_mode = gt_clockevent_set_mode;
> clk->set_next_event = gt_clockevent_set_next_event;
> clk->cpumask = cpumask_of(cpu);
> diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
> index 0857922..493aa02 100644
> --- a/include/linux/clockchips.h
> +++ b/include/linux/clockchips.h
> @@ -60,6 +60,7 @@ enum clock_event_mode {
> * Core shall set the interrupt affinity dynamically in broadcast mode
> */
> #define CLOCK_EVT_FEAT_DYNIRQ 0x000020
> +#define CLOCK_EVT_FEAT_PERCPU 0x000040
>
> /**
> * struct clock_event_device - clock event device descriptor
> diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
> index d3539e5..de4c5d8 100644
> --- a/kernel/time/tick-broadcast.c
> +++ b/kernel/time/tick-broadcast.c
> @@ -70,16 +70,14 @@ static bool tick_check_broadcast_device(struct clock_event_device *curdev,
> struct clock_event_device *newdev)
> {
> if ((newdev->features & CLOCK_EVT_FEAT_DUMMY) ||
> - (newdev->features & CLOCK_EVT_FEAT_C3STOP))
> + (newdev->features & CLOCK_EVT_FEAT_C3STOP) ||
> + (newdev->features & CLOCK_EVT_FEAT_PERCPU))
> return false;
>
> if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT &&
> !(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
> return false;
>
> - if (cpumask_equal(newdev->cpumask, cpumask_of(smp_processor_id())))
> - return false;
> -
> return !curdev || newdev->rating > curdev->rating;
> }
>
> If this is the way to go, I can prepare this in a v2.
Looks good to me. The last junk of the patch won't apply on mainline,
but thats the least of my worries. :)
Thanks,
tglx
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-09-13 14:45 ` Thomas Gleixner
@ 2013-09-13 15:25 ` Sören Brinkmann
0 siblings, 0 replies; 16+ messages in thread
From: Sören Brinkmann @ 2013-09-13 15:25 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Sep 13, 2013 at 04:45:12PM +0200, Thomas Gleixner wrote:
> On Thu, 12 Sep 2013, S?ren Brinkmann wrote:
> > On Thu, Sep 12, 2013 at 10:30:15PM +0200, Thomas Gleixner wrote:
> > I gave it a shot. Is this what you imagine:
> > diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c
> > index b66c1f3..c639b1a 100644
> > --- a/drivers/clocksource/arm_global_timer.c
> > +++ b/drivers/clocksource/arm_global_timer.c
> > @@ -169,7 +169,8 @@ static int gt_clockevents_init(struct clock_event_device *clk)
> > int cpu = smp_processor_id();
> >
> > clk->name = "arm_global_timer";
> > - clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
> > + clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
> > + CLOCK_EVT_FEAT_PERCPU;
> > clk->set_mode = gt_clockevent_set_mode;
> > clk->set_next_event = gt_clockevent_set_next_event;
> > clk->cpumask = cpumask_of(cpu);
> > diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
> > index 0857922..493aa02 100644
> > --- a/include/linux/clockchips.h
> > +++ b/include/linux/clockchips.h
> > @@ -60,6 +60,7 @@ enum clock_event_mode {
> > * Core shall set the interrupt affinity dynamically in broadcast mode
> > */
> > #define CLOCK_EVT_FEAT_DYNIRQ 0x000020
> > +#define CLOCK_EVT_FEAT_PERCPU 0x000040
> >
> > /**
> > * struct clock_event_device - clock event device descriptor
> > diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
> > index d3539e5..de4c5d8 100644
> > --- a/kernel/time/tick-broadcast.c
> > +++ b/kernel/time/tick-broadcast.c
> > @@ -70,16 +70,14 @@ static bool tick_check_broadcast_device(struct clock_event_device *curdev,
> > struct clock_event_device *newdev)
> > {
> > if ((newdev->features & CLOCK_EVT_FEAT_DUMMY) ||
> > - (newdev->features & CLOCK_EVT_FEAT_C3STOP))
> > + (newdev->features & CLOCK_EVT_FEAT_C3STOP) ||
> > + (newdev->features & CLOCK_EVT_FEAT_PERCPU))
> > return false;
> >
> > if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT &&
> > !(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
> > return false;
> >
> > - if (cpumask_equal(newdev->cpumask, cpumask_of(smp_processor_id())))
> > - return false;
> > -
> > return !curdev || newdev->rating > curdev->rating;
> > }
> >
> > If this is the way to go, I can prepare this in a v2.
>
> Looks good to me. The last junk of the patch won't apply on mainline,
> but thats the least of my worries. :)
Of course. I'll split this into smaller chunks and send out a v2.
Thanks,
S?ren
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-09-12 20:30 ` Thomas Gleixner
2013-09-12 23:48 ` Sören Brinkmann
@ 2013-09-13 8:25 ` Daniel Lezcano
[not found] ` <CAM4v1pPQwBfQ3V6M2VGsc-Fh+VhLkQE2JZeoVc=_3kniODNEhA@mail.gmail.com>
1 sibling, 1 reply; 16+ messages in thread
From: Daniel Lezcano @ 2013-09-13 8:25 UTC (permalink / raw)
To: linux-arm-kernel
On 09/12/2013 10:30 PM, Thomas Gleixner wrote:
> On Thu, 12 Sep 2013, Soren Brinkmann wrote:
>> From: Stephen Boyd <sboyd@codeaurora.org>
>>
>> On most ARM systems the per-cpu clockevents are truly per-cpu in
>> the sense that they can't be controlled on any other CPU besides
>> the CPU that they interrupt. If one of these clockevents were to
>> become a broadcast source we will run into a lot of trouble
>> because the broadcast source is enabled on the first CPU to go
>> into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
>> could be a different CPU than what the clockevent is interrupting
>> (or even worse the CPU that the clockevent interrupts could be
>> offline).
>>
>> Theoretically it's possible to support per-cpu clockevents as the
>> broadcast source but so far we haven't needed this and supporting
>> it is rather complicated. Let's just deny the possibility for now
>> until this becomes a reality (let's hope it never does!).
>
> Well, we can't do it this way. There are globally accessible clock
> event devices which deliver only to cpu0. So the mask check might be
> causing failure here.
>
> Just add a feature flag CLOCK_EVT_FEAT_PERCPU to the clock event
> device and check for it.
It sounds probably more understandable than dealing with the cpumasks.
I am wondering if this is semantically opposed to
http://lwn.net/Articles/566270/ ?
[PATCH V3 0/6] cpuidle/ppc: Enable broadcast support for deep idle states
-- Daniel
--
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
* English - detected
* English
* French
* English
* French
<javascript:void(0);>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/2] arm: zynq: Enable arm_global_timer
2013-09-12 16:50 [PATCH 0/2] arm: zynq: Enable global timer Soren Brinkmann
2013-09-12 16:50 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Soren Brinkmann
@ 2013-09-12 16:50 ` Soren Brinkmann
2013-09-15 12:40 ` Grant Likely
1 sibling, 1 reply; 16+ messages in thread
From: Soren Brinkmann @ 2013-09-12 16:50 UTC (permalink / raw)
To: linux-arm-kernel
Zynq is based on an ARM Cortex-A9 MPCore, which features the
arm_global_timer in its SCU. Therefore enable the timer for Zynq.
Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
---
arch/arm/boot/dts/zynq-7000.dtsi | 8 ++++++++
arch/arm/mach-zynq/Kconfig | 1 +
2 files changed, 9 insertions(+)
diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi
index e32b92b..eaacb39 100644
--- a/arch/arm/boot/dts/zynq-7000.dtsi
+++ b/arch/arm/boot/dts/zynq-7000.dtsi
@@ -92,6 +92,14 @@
};
};
+ global_timer: global_timer at f8f00200 {
+ compatible = "arm,cortex-a9-global-timer";
+ reg = <0xf8f00200 0x20>;
+ interrupts = <1 11 0x301>;
+ interrupt-parent = <&intc>;
+ clocks = <&clkc 4>;
+ };
+
ttc0: ttc0 at f8001000 {
interrupt-parent = <&intc>;
interrupts = < 0 10 4 0 11 4 0 12 4 >;
diff --git a/arch/arm/mach-zynq/Kconfig b/arch/arm/mach-zynq/Kconfig
index 04f8a4a..6b04260 100644
--- a/arch/arm/mach-zynq/Kconfig
+++ b/arch/arm/mach-zynq/Kconfig
@@ -13,5 +13,6 @@ config ARCH_ZYNQ
select HAVE_SMP
select SPARSE_IRQ
select CADENCE_TTC_TIMER
+ select ARM_GLOBAL_TIMER
help
Support for Xilinx Zynq ARM Cortex A9 Platform
--
1.8.4
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/2] arm: zynq: Enable arm_global_timer
2013-09-12 16:50 ` [PATCH 2/2] arm: zynq: Enable arm_global_timer Soren Brinkmann
@ 2013-09-15 12:40 ` Grant Likely
2013-09-18 17:05 ` Sören Brinkmann
0 siblings, 1 reply; 16+ messages in thread
From: Grant Likely @ 2013-09-15 12:40 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, 12 Sep 2013 09:50:40 -0700, Soren Brinkmann <soren.brinkmann@xilinx.com> wrote:
> Zynq is based on an ARM Cortex-A9 MPCore, which features the
> arm_global_timer in its SCU. Therefore enable the timer for Zynq.
>
> Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> ---
> arch/arm/boot/dts/zynq-7000.dtsi | 8 ++++++++
> arch/arm/mach-zynq/Kconfig | 1 +
> 2 files changed, 9 insertions(+)
>
> diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi
> index e32b92b..eaacb39 100644
> --- a/arch/arm/boot/dts/zynq-7000.dtsi
> +++ b/arch/arm/boot/dts/zynq-7000.dtsi
> @@ -92,6 +92,14 @@
> };
> };
>
> + global_timer: global_timer at f8f00200 {
Nit: node names and property names use '-' not '_'. Plus the generic
names principle suggests the node should be names 'timer' not
'global_timer'. The following would be fine:
global_timer: timer at f8f00200 {
(There's a distinction between node names and labels. '_' is fine in
labels since it doesn't get output into the compiled .dtb.
g.
> + compatible = "arm,cortex-a9-global-timer";
> + reg = <0xf8f00200 0x20>;
> + interrupts = <1 11 0x301>;
> + interrupt-parent = <&intc>;
> + clocks = <&clkc 4>;
> + };
> +
> ttc0: ttc0 at f8001000 {
> interrupt-parent = <&intc>;
> interrupts = < 0 10 4 0 11 4 0 12 4 >;
> diff --git a/arch/arm/mach-zynq/Kconfig b/arch/arm/mach-zynq/Kconfig
> index 04f8a4a..6b04260 100644
> --- a/arch/arm/mach-zynq/Kconfig
> +++ b/arch/arm/mach-zynq/Kconfig
> @@ -13,5 +13,6 @@ config ARCH_ZYNQ
> select HAVE_SMP
> select SPARSE_IRQ
> select CADENCE_TTC_TIMER
> + select ARM_GLOBAL_TIMER
> help
> Support for Xilinx Zynq ARM Cortex A9 Platform
> --
> 1.8.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/2] arm: zynq: Enable arm_global_timer
2013-09-15 12:40 ` Grant Likely
@ 2013-09-18 17:05 ` Sören Brinkmann
0 siblings, 0 replies; 16+ messages in thread
From: Sören Brinkmann @ 2013-09-18 17:05 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Sep 15, 2013 at 01:40:36PM +0100, Grant Likely wrote:
> On Thu, 12 Sep 2013 09:50:40 -0700, Soren Brinkmann <soren.brinkmann@xilinx.com> wrote:
> > Zynq is based on an ARM Cortex-A9 MPCore, which features the
> > arm_global_timer in its SCU. Therefore enable the timer for Zynq.
> >
> > Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
> > ---
> > arch/arm/boot/dts/zynq-7000.dtsi | 8 ++++++++
> > arch/arm/mach-zynq/Kconfig | 1 +
> > 2 files changed, 9 insertions(+)
> >
> > diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi
> > index e32b92b..eaacb39 100644
> > --- a/arch/arm/boot/dts/zynq-7000.dtsi
> > +++ b/arch/arm/boot/dts/zynq-7000.dtsi
> > @@ -92,6 +92,14 @@
> > };
> > };
> >
> > + global_timer: global_timer at f8f00200 {
>
> Nit: node names and property names use '-' not '_'. Plus the generic
> names principle suggests the node should be names 'timer' not
> 'global_timer'. The following would be fine:
That is really good to know. When I wrote this line, I read through a
couple of other dtses and was unable to identify a consistent system
behind node/label names.
>
> global_timer: timer at f8f00200 {
All right, I'll change it to this.
Thanks,
S?ren
^ permalink raw reply [flat|nested] 16+ messages in thread
* Enable arm_global_timer for Zynq brakes boot
@ 2013-08-20 15:13 Daniel Lezcano
2013-08-22 17:06 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Stephen Boyd
0 siblings, 1 reply; 16+ messages in thread
From: Daniel Lezcano @ 2013-08-20 15:13 UTC (permalink / raw)
To: linux-arm-kernel
On 08/20/2013 02:57 AM, Stephen Boyd wrote:
> On 08/19, S??ren Brinkmann wrote:
>> Hi Stephen,
>>
>> On Mon, Aug 19, 2013 at 04:00:36PM -0700, Stephen Boyd wrote:
>>> On 08/16/13 10:28, S??ren Brinkmann wrote:
>>>> On Mon, Aug 12, 2013 at 07:02:39PM +0200, Daniel Lezcano wrote:
>>>>> On 08/12/2013 06:53 PM, S??ren Brinkmann wrote:
>>>>>> It's actually present. I have a clean 3.11-rc3 and the only changes are
>>>>>> my patch to enable the GT and Stephen's fix.
>>>>>> The cpuidle stats show both idle states being used.
>>>>> Ah, right. The tick_broadcast_mask is not set because the arm global
>>>>> timer has not the CLOCK_EVT_FEAT_C3STOP feature flag set.
>>>> Just to check in. Do you want any additional testing done? Or can I
>>>> expect Stephens fix to get merged, so Zynq can use the GT?
>>>>
>>>
>>> I was curious, can you use just the first hunk of the patch that applied
>>> to tick-broadcast.c to fix the problem? I think the answer is yes.
>>
>> Yes, that seems to be enough.
>>
>
> Great thank you. I will split the patch into two pieces. That way
> we can discuss the merit of always using a timer that doesn't
> suffer from FEAT_C3_STOP over a timer that does.
Yes, that sounds a good idea.
-- Daniel
--
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-08-20 15:13 Enable arm_global_timer for Zynq brakes boot Daniel Lezcano
@ 2013-08-22 17:06 ` Stephen Boyd
2013-08-22 23:38 ` Sören Brinkmann
2013-09-05 16:53 ` Sören Brinkmann
0 siblings, 2 replies; 16+ messages in thread
From: Stephen Boyd @ 2013-08-22 17:06 UTC (permalink / raw)
To: linux-arm-kernel
On most ARM systems the per-cpu clockevents are truly per-cpu in
the sense that they can't be controlled on any other CPU besides
the CPU that they interrupt. If one of these clockevents were to
become a broadcast source we will run into a lot of trouble
because the broadcast source is enabled on the first CPU to go
into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
could be a different CPU than what the clockevent is interrupting
(or even worse the CPU that the clockevent interrupts could be
offline).
Theoretically it's possible to support per-cpu clockevents as the
broadcast source but so far we haven't needed this and supporting
it is rather complicated. Let's just deny the possibility for now
until this becomes a reality (let's hope it never does!).
Reported-by: S?ren Brinkmann <soren.brinkmann@xilinx.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
kernel/time/tick-broadcast.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
index 218bcb5..d3539e5 100644
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -77,6 +77,9 @@ static bool tick_check_broadcast_device(struct clock_event_device *curdev,
!(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
return false;
+ if (cpumask_equal(newdev->cpumask, cpumask_of(smp_processor_id())))
+ return false;
+
return !curdev || newdev->rating > curdev->rating;
}
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-08-22 17:06 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Stephen Boyd
@ 2013-08-22 23:38 ` Sören Brinkmann
2013-09-05 16:53 ` Sören Brinkmann
1 sibling, 0 replies; 16+ messages in thread
From: Sören Brinkmann @ 2013-08-22 23:38 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Aug 22, 2013 at 10:06:40AM -0700, Stephen Boyd wrote:
> On most ARM systems the per-cpu clockevents are truly per-cpu in
> the sense that they can't be controlled on any other CPU besides
> the CPU that they interrupt. If one of these clockevents were to
> become a broadcast source we will run into a lot of trouble
> because the broadcast source is enabled on the first CPU to go
> into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
> could be a different CPU than what the clockevent is interrupting
> (or even worse the CPU that the clockevent interrupts could be
> offline).
>
> Theoretically it's possible to support per-cpu clockevents as the
> broadcast source but so far we haven't needed this and supporting
> it is rather complicated. Let's just deny the possibility for now
> until this becomes a reality (let's hope it never does!).
>
> Reported-by: S?ren Brinkmann <soren.brinkmann@xilinx.com>
> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Tested-by: S?ren Brinkmann <soren.brinkmann@xilinx.com>
This fixes the issue I reported when enabling the global timer on Zynq.
The global timer is prevented from becoming the broadcast device and my
system boots.
Thanks,
S?ren
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources
2013-08-22 17:06 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Stephen Boyd
2013-08-22 23:38 ` Sören Brinkmann
@ 2013-09-05 16:53 ` Sören Brinkmann
1 sibling, 0 replies; 16+ messages in thread
From: Sören Brinkmann @ 2013-09-05 16:53 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Aug 22, 2013 at 10:06:40AM -0700, Stephen Boyd wrote:
> On most ARM systems the per-cpu clockevents are truly per-cpu in
> the sense that they can't be controlled on any other CPU besides
> the CPU that they interrupt. If one of these clockevents were to
> become a broadcast source we will run into a lot of trouble
> because the broadcast source is enabled on the first CPU to go
> into deep idle (if that CPU suffers from FEAT_C3_STOP) and that
> could be a different CPU than what the clockevent is interrupting
> (or even worse the CPU that the clockevent interrupts could be
> offline).
>
> Theoretically it's possible to support per-cpu clockevents as the
> broadcast source but so far we haven't needed this and supporting
> it is rather complicated. Let's just deny the possibility for now
> until this becomes a reality (let's hope it never does!).
>
> Reported-by: S?ren Brinkmann <soren.brinkmann@xilinx.com>
> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Has this been merged anywhere?
Thanks,
S?ren
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2013-09-18 17:05 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-12 16:50 [PATCH 0/2] arm: zynq: Enable global timer Soren Brinkmann
2013-09-12 16:50 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Soren Brinkmann
2013-09-12 20:30 ` Thomas Gleixner
2013-09-12 23:48 ` Sören Brinkmann
2013-09-13 14:45 ` Thomas Gleixner
2013-09-13 15:25 ` Sören Brinkmann
2013-09-13 8:25 ` Daniel Lezcano
[not found] ` <CAM4v1pPQwBfQ3V6M2VGsc-Fh+VhLkQE2JZeoVc=_3kniODNEhA@mail.gmail.com>
2013-09-13 10:39 ` Preeti U Murthy
2013-09-13 16:23 ` Sören Brinkmann
2013-09-14 0:23 ` Preeti U Murthy
2013-09-12 16:50 ` [PATCH 2/2] arm: zynq: Enable arm_global_timer Soren Brinkmann
2013-09-15 12:40 ` Grant Likely
2013-09-18 17:05 ` Sören Brinkmann
-- strict thread matches above, loose matches on Subject: below --
2013-08-20 15:13 Enable arm_global_timer for Zynq brakes boot Daniel Lezcano
2013-08-22 17:06 ` [PATCH 1/2] tick: broadcast: Deny per-cpu clockevents from being broadcast sources Stephen Boyd
2013-08-22 23:38 ` Sören Brinkmann
2013-09-05 16:53 ` Sören Brinkmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).