All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-29 14:55 ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Sudeep.KarkadaNagesha, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano,
	Sudeep KarkadaNagesha

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

This patch series adds support to configure the rate and enable the
event stream for architected timer. The event streams can be used to
impose a timeout on a wfe, to safeguard against any programming error
in case an expected event is not generated or even to implement
wfe-based timeouts for userspace locking implementations. This feature
can be disabled(enabled by default).

Since the timer control register is reset to zero on warm boot, CPU
PM notifier is added to save and restore the value.

Changes v5->v6:
1. Disabling event stream by default on boot and enable it
   only if CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
   This removes runtime configuration of timer event stream.
2. Moved COMPAT_ELF_HWCAP_DEFAULT to arch/arm64/kernel/setup.c

Changes v4->v5:
1. Removed compat_dyn_elf_hwcap and used just compat_elf_hwcap as per
   Catalin's suggestion
2. Instead of resetting event stream in CPU PM callbacks, saving and
   restoring counter control register now.

Changes v3->v4:
1. Added a config option to en/disable the timer event stream feature.
   Due to this the ordering of the patches as well as some cosmetic
   code changes are done.( So dropped previous reviewed-by tags)
2. Removed exporting compat_dyn_elf_hwcap as there are no modules
   requiring it for now.

Changes v2->v3:
1. Moved ARM and ARM64 changes into separate patches
2. Added native hwcaps definations(ARM/ARM64) and compat-specific
   definitions(ARM64) to the users for the event stream feature. 

Changes v1->v2:
1. Saved event stream divider value on cold reset path and re-used it
   in CPU PM notifier instead of calculating every time.
2. Rebased on v3.11-rc2(to avoid conflicts with __cpuinit* deletion)
3. Dropped "ARM/ARM64: arch_timer: remove __cpuinit attribute for
   arch_counter_set_user_access"(already done as part of __cpuinit*
   deletion)

Regards,
Sudeep


Sudeep KarkadaNagesha (4):
  ARM/ARM64: arch_timer: add macros for bits in control register
  ARM: arch_timer: add support to configure and enable event stream
  ARM64: arch_timer: add support to configure and enable event stream
  drivers: clocksource: add CPU PM notifier for ARM architected timer

Will Deacon (1):
  drivers: clocksource: add support for ARM architected timer event
    stream

 arch/arm/include/asm/arch_timer.h    | 36 ++++++++++++++++++++++----
 arch/arm/include/uapi/asm/hwcap.h    |  1 +
 arch/arm/kernel/setup.c              |  1 +
 arch/arm64/include/asm/arch_timer.h  | 42 ++++++++++++++++++++++++++-----
 arch/arm64/include/asm/hwcap.h       | 11 ++++----
 arch/arm64/include/uapi/asm/hwcap.h  |  1 +
 arch/arm64/kernel/setup.c            | 11 ++++++++
 drivers/clocksource/Kconfig          | 14 +++++++++++
 drivers/clocksource/arm_arch_timer.c | 49 ++++++++++++++++++++++++++++++++++++
 include/clocksource/arm_arch_timer.h | 10 ++++++++
 10 files changed, 160 insertions(+), 16 deletions(-)

-- 
1.8.1.2



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-29 14:55 ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

This patch series adds support to configure the rate and enable the
event stream for architected timer. The event streams can be used to
impose a timeout on a wfe, to safeguard against any programming error
in case an expected event is not generated or even to implement
wfe-based timeouts for userspace locking implementations. This feature
can be disabled(enabled by default).

Since the timer control register is reset to zero on warm boot, CPU
PM notifier is added to save and restore the value.

Changes v5->v6:
1. Disabling event stream by default on boot and enable it
   only if CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
   This removes runtime configuration of timer event stream.
2. Moved COMPAT_ELF_HWCAP_DEFAULT to arch/arm64/kernel/setup.c

Changes v4->v5:
1. Removed compat_dyn_elf_hwcap and used just compat_elf_hwcap as per
   Catalin's suggestion
2. Instead of resetting event stream in CPU PM callbacks, saving and
   restoring counter control register now.

Changes v3->v4:
1. Added a config option to en/disable the timer event stream feature.
   Due to this the ordering of the patches as well as some cosmetic
   code changes are done.( So dropped previous reviewed-by tags)
2. Removed exporting compat_dyn_elf_hwcap as there are no modules
   requiring it for now.

Changes v2->v3:
1. Moved ARM and ARM64 changes into separate patches
2. Added native hwcaps definations(ARM/ARM64) and compat-specific
   definitions(ARM64) to the users for the event stream feature. 

Changes v1->v2:
1. Saved event stream divider value on cold reset path and re-used it
   in CPU PM notifier instead of calculating every time.
2. Rebased on v3.11-rc2(to avoid conflicts with __cpuinit* deletion)
3. Dropped "ARM/ARM64: arch_timer: remove __cpuinit attribute for
   arch_counter_set_user_access"(already done as part of __cpuinit*
   deletion)

Regards,
Sudeep


Sudeep KarkadaNagesha (4):
  ARM/ARM64: arch_timer: add macros for bits in control register
  ARM: arch_timer: add support to configure and enable event stream
  ARM64: arch_timer: add support to configure and enable event stream
  drivers: clocksource: add CPU PM notifier for ARM architected timer

Will Deacon (1):
  drivers: clocksource: add support for ARM architected timer event
    stream

 arch/arm/include/asm/arch_timer.h    | 36 ++++++++++++++++++++++----
 arch/arm/include/uapi/asm/hwcap.h    |  1 +
 arch/arm/kernel/setup.c              |  1 +
 arch/arm64/include/asm/arch_timer.h  | 42 ++++++++++++++++++++++++++-----
 arch/arm64/include/asm/hwcap.h       | 11 ++++----
 arch/arm64/include/uapi/asm/hwcap.h  |  1 +
 arch/arm64/kernel/setup.c            | 11 ++++++++
 drivers/clocksource/Kconfig          | 14 +++++++++++
 drivers/clocksource/arm_arch_timer.c | 49 ++++++++++++++++++++++++++++++++++++
 include/clocksource/arm_arch_timer.h | 10 ++++++++
 10 files changed, 160 insertions(+), 16 deletions(-)

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 1/5] ARM/ARM64: arch_timer: add macros for bits in control register
  2013-08-29 14:55 ` Sudeep KarkadaNagesha
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Sudeep.KarkadaNagesha, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano,
	Sudeep KarkadaNagesha

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

Add macros to describe the bitfields in the ARM architected timer
control register to make code easy to understand.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm/include/asm/arch_timer.h    |  9 +++++++--
 arch/arm64/include/asm/arch_timer.h  | 12 ++++++++----
 include/clocksource/arm_arch_timer.h |  8 ++++++++
 3 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h
index e406d57..1a3e967 100644
--- a/arch/arm/include/asm/arch_timer.h
+++ b/arch/arm/include/asm/arch_timer.h
@@ -95,8 +95,13 @@ static inline void arch_counter_set_user_access(void)
 
 	asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
 
-	/* disable user access to everything */
-	cntkctl &= ~((3 << 8) | (7 << 0));
+	/* Disable user access to both physical/virtual counters/timers */
+	/* Also disable virtual event stream */
+	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN
+			| ARCH_TIMER_USR_VT_ACCESS_EN
+			| ARCH_TIMER_VIRT_EVT_EN
+			| ARCH_TIMER_USR_VCT_ACCESS_EN
+			| ARCH_TIMER_USR_PCT_ACCESS_EN);
 
 	asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
 }
diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h
index 98abd47..fa4af76 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -101,12 +101,16 @@ static inline void arch_counter_set_user_access(void)
 {
 	u32 cntkctl;
 
-	/* Disable user access to the timers and the physical counter. */
 	asm volatile("mrs	%0, cntkctl_el1" : "=r" (cntkctl));
-	cntkctl &= ~((3 << 8) | (1 << 0));
 
-	/* Enable user access to the virtual counter and frequency. */
-	cntkctl |= (1 << 1);
+	/* Disable user access to the timers and the physical counter */
+	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN
+			| ARCH_TIMER_USR_VT_ACCESS_EN
+			| ARCH_TIMER_USR_PCT_ACCESS_EN);
+
+	/* Enable user access to the virtual counter */
+	cntkctl |= ARCH_TIMER_USR_VCT_ACCESS_EN;
+
 	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
 }
 
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h
index c463ce9..551f7e9 100644
--- a/include/clocksource/arm_arch_timer.h
+++ b/include/clocksource/arm_arch_timer.h
@@ -29,6 +29,14 @@
 #define ARCH_TIMER_PHYS_ACCESS		0
 #define ARCH_TIMER_VIRT_ACCESS		1
 
+#define ARCH_TIMER_USR_PCT_ACCESS_EN	(1 << 0) /* physical counter */
+#define ARCH_TIMER_USR_VCT_ACCESS_EN	(1 << 1) /* virtual counter */
+#define ARCH_TIMER_VIRT_EVT_EN		(1 << 2)
+#define ARCH_TIMER_EVT_TRIGGER_SHIFT	(4)
+#define ARCH_TIMER_EVT_TRIGGER_MASK	(0xF << ARCH_TIMER_EVT_TRIGGER_SHIFT)
+#define ARCH_TIMER_USR_VT_ACCESS_EN	(1 << 8) /* virtual timer registers */
+#define ARCH_TIMER_USR_PT_ACCESS_EN	(1 << 9) /* physical timer registers */
+
 #ifdef CONFIG_ARM_ARCH_TIMER
 
 extern u32 arch_timer_get_rate(void);
-- 
1.8.1.2



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 1/5] ARM/ARM64: arch_timer: add macros for bits in control register
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

Add macros to describe the bitfields in the ARM architected timer
control register to make code easy to understand.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm/include/asm/arch_timer.h    |  9 +++++++--
 arch/arm64/include/asm/arch_timer.h  | 12 ++++++++----
 include/clocksource/arm_arch_timer.h |  8 ++++++++
 3 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h
index e406d57..1a3e967 100644
--- a/arch/arm/include/asm/arch_timer.h
+++ b/arch/arm/include/asm/arch_timer.h
@@ -95,8 +95,13 @@ static inline void arch_counter_set_user_access(void)
 
 	asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
 
-	/* disable user access to everything */
-	cntkctl &= ~((3 << 8) | (7 << 0));
+	/* Disable user access to both physical/virtual counters/timers */
+	/* Also disable virtual event stream */
+	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN
+			| ARCH_TIMER_USR_VT_ACCESS_EN
+			| ARCH_TIMER_VIRT_EVT_EN
+			| ARCH_TIMER_USR_VCT_ACCESS_EN
+			| ARCH_TIMER_USR_PCT_ACCESS_EN);
 
 	asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
 }
diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h
index 98abd47..fa4af76 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -101,12 +101,16 @@ static inline void arch_counter_set_user_access(void)
 {
 	u32 cntkctl;
 
-	/* Disable user access to the timers and the physical counter. */
 	asm volatile("mrs	%0, cntkctl_el1" : "=r" (cntkctl));
-	cntkctl &= ~((3 << 8) | (1 << 0));
 
-	/* Enable user access to the virtual counter and frequency. */
-	cntkctl |= (1 << 1);
+	/* Disable user access to the timers and the physical counter */
+	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN
+			| ARCH_TIMER_USR_VT_ACCESS_EN
+			| ARCH_TIMER_USR_PCT_ACCESS_EN);
+
+	/* Enable user access to the virtual counter */
+	cntkctl |= ARCH_TIMER_USR_VCT_ACCESS_EN;
+
 	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
 }
 
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h
index c463ce9..551f7e9 100644
--- a/include/clocksource/arm_arch_timer.h
+++ b/include/clocksource/arm_arch_timer.h
@@ -29,6 +29,14 @@
 #define ARCH_TIMER_PHYS_ACCESS		0
 #define ARCH_TIMER_VIRT_ACCESS		1
 
+#define ARCH_TIMER_USR_PCT_ACCESS_EN	(1 << 0) /* physical counter */
+#define ARCH_TIMER_USR_VCT_ACCESS_EN	(1 << 1) /* virtual counter */
+#define ARCH_TIMER_VIRT_EVT_EN		(1 << 2)
+#define ARCH_TIMER_EVT_TRIGGER_SHIFT	(4)
+#define ARCH_TIMER_EVT_TRIGGER_MASK	(0xF << ARCH_TIMER_EVT_TRIGGER_SHIFT)
+#define ARCH_TIMER_USR_VT_ACCESS_EN	(1 << 8) /* virtual timer registers */
+#define ARCH_TIMER_USR_PT_ACCESS_EN	(1 << 9) /* physical timer registers */
+
 #ifdef CONFIG_ARM_ARCH_TIMER
 
 extern u32 arch_timer_get_rate(void);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 2/5] ARM: arch_timer: add support to configure and enable event stream
  2013-08-29 14:55 ` Sudeep KarkadaNagesha
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Sudeep.KarkadaNagesha, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano,
	Sudeep KarkadaNagesha, Russell King, Lorenzo Pieralisi,
	Will Deacon

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

This patch adds support for configuring the event stream frequency
and enabling it.

It also adds the hwcaps definitions to the user to detect this event
stream feature.

Cc: Russell King <linux@arm.linux.org.uk>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm/include/asm/arch_timer.h | 27 ++++++++++++++++++++++++---
 arch/arm/include/uapi/asm/hwcap.h |  1 +
 arch/arm/kernel/setup.c           |  1 +
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h
index 1a3e967..f10cd1c 100644
--- a/arch/arm/include/asm/arch_timer.h
+++ b/arch/arm/include/asm/arch_timer.h
@@ -89,11 +89,21 @@ static inline u64 arch_counter_get_cntvct(void)
 	return cval;
 }
 
-static inline void arch_counter_set_user_access(void)
+static inline u32 arch_timer_get_cntkctl(void)
 {
 	u32 cntkctl;
-
 	asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
+	return cntkctl;
+}
+
+static inline void arch_timer_set_cntkctl(u32 cntkctl)
+{
+	asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
+}
+
+static inline void arch_counter_set_user_access(void)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
 
 	/* Disable user access to both physical/virtual counters/timers */
 	/* Also disable virtual event stream */
@@ -102,9 +112,20 @@ static inline void arch_counter_set_user_access(void)
 			| ARCH_TIMER_VIRT_EVT_EN
 			| ARCH_TIMER_USR_VCT_ACCESS_EN
 			| ARCH_TIMER_USR_PCT_ACCESS_EN);
+	arch_timer_set_cntkctl(cntkctl);
+}
 
-	asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
+static inline void arch_timer_evtstrm_enable(int divider)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
+	cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK;
+	/* Set the divider and enable virtual event stream */
+	cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT)
+			| ARCH_TIMER_VIRT_EVT_EN;
+	arch_timer_set_cntkctl(cntkctl);
+	elf_hwcap |= HWCAP_EVTSTRM;
 }
+
 #endif
 
 #endif
diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h
index 6d34d08..7dcc10d 100644
--- a/arch/arm/include/uapi/asm/hwcap.h
+++ b/arch/arm/include/uapi/asm/hwcap.h
@@ -26,5 +26,6 @@
 #define HWCAP_VFPD32	(1 << 19)	/* set if VFP has 32 regs (not 16) */
 #define HWCAP_IDIV	(HWCAP_IDIVA | HWCAP_IDIVT)
 #define HWCAP_LPAE	(1 << 20)
+#define HWCAP_EVTSTRM	(1 << 21)
 
 #endif /* _UAPI__ASMARM_HWCAP_H */
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index afc2489..305ffc9 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -975,6 +975,7 @@ static const char *hwcap_str[] = {
 	"idivt",
 	"vfpd32",
 	"lpae",
+	"evtstrm",
 	NULL
 };
 
-- 
1.8.1.2



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 2/5] ARM: arch_timer: add support to configure and enable event stream
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

This patch adds support for configuring the event stream frequency
and enabling it.

It also adds the hwcaps definitions to the user to detect this event
stream feature.

Cc: Russell King <linux@arm.linux.org.uk>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm/include/asm/arch_timer.h | 27 ++++++++++++++++++++++++---
 arch/arm/include/uapi/asm/hwcap.h |  1 +
 arch/arm/kernel/setup.c           |  1 +
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h
index 1a3e967..f10cd1c 100644
--- a/arch/arm/include/asm/arch_timer.h
+++ b/arch/arm/include/asm/arch_timer.h
@@ -89,11 +89,21 @@ static inline u64 arch_counter_get_cntvct(void)
 	return cval;
 }
 
-static inline void arch_counter_set_user_access(void)
+static inline u32 arch_timer_get_cntkctl(void)
 {
 	u32 cntkctl;
-
 	asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl));
+	return cntkctl;
+}
+
+static inline void arch_timer_set_cntkctl(u32 cntkctl)
+{
+	asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
+}
+
+static inline void arch_counter_set_user_access(void)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
 
 	/* Disable user access to both physical/virtual counters/timers */
 	/* Also disable virtual event stream */
@@ -102,9 +112,20 @@ static inline void arch_counter_set_user_access(void)
 			| ARCH_TIMER_VIRT_EVT_EN
 			| ARCH_TIMER_USR_VCT_ACCESS_EN
 			| ARCH_TIMER_USR_PCT_ACCESS_EN);
+	arch_timer_set_cntkctl(cntkctl);
+}
 
-	asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl));
+static inline void arch_timer_evtstrm_enable(int divider)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
+	cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK;
+	/* Set the divider and enable virtual event stream */
+	cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT)
+			| ARCH_TIMER_VIRT_EVT_EN;
+	arch_timer_set_cntkctl(cntkctl);
+	elf_hwcap |= HWCAP_EVTSTRM;
 }
+
 #endif
 
 #endif
diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h
index 6d34d08..7dcc10d 100644
--- a/arch/arm/include/uapi/asm/hwcap.h
+++ b/arch/arm/include/uapi/asm/hwcap.h
@@ -26,5 +26,6 @@
 #define HWCAP_VFPD32	(1 << 19)	/* set if VFP has 32 regs (not 16) */
 #define HWCAP_IDIV	(HWCAP_IDIVA | HWCAP_IDIVT)
 #define HWCAP_LPAE	(1 << 20)
+#define HWCAP_EVTSTRM	(1 << 21)
 
 #endif /* _UAPI__ASMARM_HWCAP_H */
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index afc2489..305ffc9 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -975,6 +975,7 @@ static const char *hwcap_str[] = {
 	"idivt",
 	"vfpd32",
 	"lpae",
+	"evtstrm",
 	NULL
 };
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 3/5] ARM64: arch_timer: add support to configure and enable event stream
  2013-08-29 14:55 ` Sudeep KarkadaNagesha
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Sudeep.KarkadaNagesha, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano,
	Sudeep KarkadaNagesha, Lorenzo Pieralisi, Will Deacon

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

This patch adds support for configuring the event stream frequency
and enabling it.

It also adds the hwcaps as well as compat-specific definitions to
the user to detect this event stream feature.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm64/include/asm/arch_timer.h | 32 +++++++++++++++++++++++++++++---
 arch/arm64/include/asm/hwcap.h      | 11 ++++++-----
 arch/arm64/include/uapi/asm/hwcap.h |  1 +
 arch/arm64/kernel/setup.c           | 11 +++++++++++
 4 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h
index fa4af76..3bca364 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -97,21 +97,47 @@ static inline u32 arch_timer_get_cntfrq(void)
 	return val;
 }
 
-static inline void arch_counter_set_user_access(void)
+static inline u32 arch_timer_get_cntkctl(void)
 {
 	u32 cntkctl;
-
 	asm volatile("mrs	%0, cntkctl_el1" : "=r" (cntkctl));
+	return cntkctl;
+}
+
+static inline void arch_timer_set_cntkctl(u32 cntkctl)
+{
+	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
+}
+
+static inline void arch_counter_set_user_access(void)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
 
 	/* Disable user access to the timers and the physical counter */
+	/* Also disable virtual event stream */
 	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN
 			| ARCH_TIMER_USR_VT_ACCESS_EN
+			| ARCH_TIMER_VIRT_EVT_EN
 			| ARCH_TIMER_USR_PCT_ACCESS_EN);
 
 	/* Enable user access to the virtual counter */
 	cntkctl |= ARCH_TIMER_USR_VCT_ACCESS_EN;
 
-	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
+	arch_timer_set_cntkctl(cntkctl);
+}
+
+static inline void arch_timer_evtstrm_enable(int divider)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
+	cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK;
+	/* Set the divider and enable virtual event stream */
+	cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT)
+			| ARCH_TIMER_VIRT_EVT_EN;
+	arch_timer_set_cntkctl(cntkctl);
+	elf_hwcap |= HWCAP_EVTSTRM;
+#ifdef CONFIG_COMPAT
+	compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM;
+#endif
 }
 
 static inline u64 arch_counter_get_cntvct(void)
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h
index 6d4482f..3a48433 100644
--- a/arch/arm64/include/asm/hwcap.h
+++ b/arch/arm64/include/asm/hwcap.h
@@ -30,6 +30,7 @@
 #define COMPAT_HWCAP_IDIVA	(1 << 17)
 #define COMPAT_HWCAP_IDIVT	(1 << 18)
 #define COMPAT_HWCAP_IDIV	(COMPAT_HWCAP_IDIVA|COMPAT_HWCAP_IDIVT)
+#define COMPAT_HWCAP_EVTSTRM	(1 << 21)
 
 #ifndef __ASSEMBLY__
 /*
@@ -37,11 +38,11 @@
  * instruction set this cpu supports.
  */
 #define ELF_HWCAP		(elf_hwcap)
-#define COMPAT_ELF_HWCAP	(COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\
-				 COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\
-				 COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\
-				 COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\
-				 COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV)
+
+#ifdef CONFIG_COMPAT
+#define COMPAT_ELF_HWCAP	(compat_elf_hwcap)
+extern unsigned int compat_elf_hwcap;
+#endif
 
 extern unsigned int elf_hwcap;
 #endif
diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/asm/hwcap.h
index eea4975..9b12476 100644
--- a/arch/arm64/include/uapi/asm/hwcap.h
+++ b/arch/arm64/include/uapi/asm/hwcap.h
@@ -21,6 +21,7 @@
  */
 #define HWCAP_FP		(1 << 0)
 #define HWCAP_ASIMD		(1 << 1)
+#define HWCAP_EVTSTRM		(1 << 2)
 
 
 #endif /* _UAPI__ASM_HWCAP_H */
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index add6ea6..57cb006 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -60,6 +60,16 @@ EXPORT_SYMBOL(processor_id);
 unsigned int elf_hwcap __read_mostly;
 EXPORT_SYMBOL_GPL(elf_hwcap);
 
+#ifdef CONFIG_COMPAT
+#define COMPAT_ELF_HWCAP_DEFAULT	\
+				(COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\
+				 COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\
+				 COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\
+				 COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\
+				 COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV)
+unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT;
+#endif
+
 static const char *cpu_name;
 static const char *machine_name;
 phys_addr_t __fdt_pointer __initdata;
@@ -309,6 +319,7 @@ subsys_initcall(topology_init);
 static const char *hwcap_str[] = {
 	"fp",
 	"asimd",
+	"evtstrm",
 	NULL
 };
 
-- 
1.8.1.2



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 3/5] ARM64: arch_timer: add support to configure and enable event stream
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

This patch adds support for configuring the event stream frequency
and enabling it.

It also adds the hwcaps as well as compat-specific definitions to
the user to detect this event stream feature.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 arch/arm64/include/asm/arch_timer.h | 32 +++++++++++++++++++++++++++++---
 arch/arm64/include/asm/hwcap.h      | 11 ++++++-----
 arch/arm64/include/uapi/asm/hwcap.h |  1 +
 arch/arm64/kernel/setup.c           | 11 +++++++++++
 4 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h
index fa4af76..3bca364 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -97,21 +97,47 @@ static inline u32 arch_timer_get_cntfrq(void)
 	return val;
 }
 
-static inline void arch_counter_set_user_access(void)
+static inline u32 arch_timer_get_cntkctl(void)
 {
 	u32 cntkctl;
-
 	asm volatile("mrs	%0, cntkctl_el1" : "=r" (cntkctl));
+	return cntkctl;
+}
+
+static inline void arch_timer_set_cntkctl(u32 cntkctl)
+{
+	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
+}
+
+static inline void arch_counter_set_user_access(void)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
 
 	/* Disable user access to the timers and the physical counter */
+	/* Also disable virtual event stream */
 	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN
 			| ARCH_TIMER_USR_VT_ACCESS_EN
+			| ARCH_TIMER_VIRT_EVT_EN
 			| ARCH_TIMER_USR_PCT_ACCESS_EN);
 
 	/* Enable user access to the virtual counter */
 	cntkctl |= ARCH_TIMER_USR_VCT_ACCESS_EN;
 
-	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
+	arch_timer_set_cntkctl(cntkctl);
+}
+
+static inline void arch_timer_evtstrm_enable(int divider)
+{
+	u32 cntkctl = arch_timer_get_cntkctl();
+	cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK;
+	/* Set the divider and enable virtual event stream */
+	cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT)
+			| ARCH_TIMER_VIRT_EVT_EN;
+	arch_timer_set_cntkctl(cntkctl);
+	elf_hwcap |= HWCAP_EVTSTRM;
+#ifdef CONFIG_COMPAT
+	compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM;
+#endif
 }
 
 static inline u64 arch_counter_get_cntvct(void)
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h
index 6d4482f..3a48433 100644
--- a/arch/arm64/include/asm/hwcap.h
+++ b/arch/arm64/include/asm/hwcap.h
@@ -30,6 +30,7 @@
 #define COMPAT_HWCAP_IDIVA	(1 << 17)
 #define COMPAT_HWCAP_IDIVT	(1 << 18)
 #define COMPAT_HWCAP_IDIV	(COMPAT_HWCAP_IDIVA|COMPAT_HWCAP_IDIVT)
+#define COMPAT_HWCAP_EVTSTRM	(1 << 21)
 
 #ifndef __ASSEMBLY__
 /*
@@ -37,11 +38,11 @@
  * instruction set this cpu supports.
  */
 #define ELF_HWCAP		(elf_hwcap)
-#define COMPAT_ELF_HWCAP	(COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\
-				 COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\
-				 COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\
-				 COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\
-				 COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV)
+
+#ifdef CONFIG_COMPAT
+#define COMPAT_ELF_HWCAP	(compat_elf_hwcap)
+extern unsigned int compat_elf_hwcap;
+#endif
 
 extern unsigned int elf_hwcap;
 #endif
diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/asm/hwcap.h
index eea4975..9b12476 100644
--- a/arch/arm64/include/uapi/asm/hwcap.h
+++ b/arch/arm64/include/uapi/asm/hwcap.h
@@ -21,6 +21,7 @@
  */
 #define HWCAP_FP		(1 << 0)
 #define HWCAP_ASIMD		(1 << 1)
+#define HWCAP_EVTSTRM		(1 << 2)
 
 
 #endif /* _UAPI__ASM_HWCAP_H */
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index add6ea6..57cb006 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -60,6 +60,16 @@ EXPORT_SYMBOL(processor_id);
 unsigned int elf_hwcap __read_mostly;
 EXPORT_SYMBOL_GPL(elf_hwcap);
 
+#ifdef CONFIG_COMPAT
+#define COMPAT_ELF_HWCAP_DEFAULT	\
+				(COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\
+				 COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\
+				 COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\
+				 COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\
+				 COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV)
+unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT;
+#endif
+
 static const char *cpu_name;
 static const char *machine_name;
 phys_addr_t __fdt_pointer __initdata;
@@ -309,6 +319,7 @@ subsys_initcall(topology_init);
 static const char *hwcap_str[] = {
 	"fp",
 	"asimd",
+	"evtstrm",
 	NULL
 };
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer event stream
  2013-08-29 14:55 ` Sudeep KarkadaNagesha
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Sudeep.KarkadaNagesha, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano, Will Deacon,
	Lorenzo Pieralisi, Sudeep KarkadaNagesha

From: Will Deacon <will.deacon@arm.com>

The ARM architected timer can generate events (used for waking up
CPUs executing the wfe instruction) at a frequency represented as a
power-of-2 divisor of the clock rate.

An event stream might be used:
- To impose a time-out on a wfe polling loop.
- To safeguard against any programming error in case an expected event
  is not generated.
- To implement wfe-based timeouts for userspace locking implementations.

This patch computes the event stream frequency aiming for a period
of 100us between events. It uses ARM/ARM64 specific backends to configure
and enable the event stream.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
[sudeep: moving ARM/ARM64 changes into separate patches
         and adding Kconfig option]
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 drivers/clocksource/Kconfig          | 14 ++++++++++++++
 drivers/clocksource/arm_arch_timer.c | 15 +++++++++++++++
 include/clocksource/arm_arch_timer.h |  2 ++
 3 files changed, 31 insertions(+)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index b7b9b04..49f1f6e 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -74,6 +74,20 @@ config ARM_ARCH_TIMER
 	bool
 	select CLKSRC_OF if OF
 
+config ARM_ARCH_TIMER_EVTSTREAM
+	bool "Support for ARM architected timer event stream generation"
+	default y if ARM_ARCH_TIMER
+	help
+	  This option enables support for event stream generation based on
+	  the ARM architected timer. It is used for waking up CPUs executing
+	  the wfe instruction at a frequency represented as a power-of-2
+	  divisor of the clock rate. An event stream might be mainly useful
+	  for wfe-based timeouts for userspace locking implementations.
+	  It might also be useful for imposing timeout on a wfe or even
+	  safeguarding against any programming errors in case an expected
+	  event is not generated. This must be disabled for hardware validation
+	  purposes to detect any hardware anomalies of missing events.
+
 config ARM_GLOBAL_TIMER
 	bool
 	select CLKSRC_OF if OF
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index ffadd83..9777b36 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -123,6 +123,19 @@ static int arch_timer_set_next_event_phys(unsigned long evt,
 	return 0;
 }
 
+static void arch_timer_enable_evtstream(void)
+{
+	int evt_stream_div, pos;
+
+	/* Find the closest power of two to the divisor */
+	evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ;
+	pos = fls(evt_stream_div);
+	if (pos > 1 && !(evt_stream_div & (1 << (pos - 2))))
+		pos--;
+	/* enable event stream */
+	arch_timer_evtstrm_enable(min(pos, 15));
+}
+
 static int arch_timer_setup(struct clock_event_device *clk)
 {
 	clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP;
@@ -154,6 +167,8 @@ static int arch_timer_setup(struct clock_event_device *clk)
 	}
 
 	arch_counter_set_user_access();
+	if (IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM))
+		arch_timer_enable_evtstream();
 
 	return 0;
 }
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h
index 551f7e9..c4d0fc4 100644
--- a/include/clocksource/arm_arch_timer.h
+++ b/include/clocksource/arm_arch_timer.h
@@ -37,6 +37,8 @@
 #define ARCH_TIMER_USR_VT_ACCESS_EN	(1 << 8) /* virtual timer registers */
 #define ARCH_TIMER_USR_PT_ACCESS_EN	(1 << 9) /* physical timer registers */
 
+#define ARCH_TIMER_EVT_STREAM_FREQ	10000	/* 100us */
+
 #ifdef CONFIG_ARM_ARCH_TIMER
 
 extern u32 arch_timer_get_rate(void);
-- 
1.8.1.2



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer event stream
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel

From: Will Deacon <will.deacon@arm.com>

The ARM architected timer can generate events (used for waking up
CPUs executing the wfe instruction) at a frequency represented as a
power-of-2 divisor of the clock rate.

An event stream might be used:
- To impose a time-out on a wfe polling loop.
- To safeguard against any programming error in case an expected event
  is not generated.
- To implement wfe-based timeouts for userspace locking implementations.

This patch computes the event stream frequency aiming for a period
of 100us between events. It uses ARM/ARM64 specific backends to configure
and enable the event stream.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
[sudeep: moving ARM/ARM64 changes into separate patches
         and adding Kconfig option]
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 drivers/clocksource/Kconfig          | 14 ++++++++++++++
 drivers/clocksource/arm_arch_timer.c | 15 +++++++++++++++
 include/clocksource/arm_arch_timer.h |  2 ++
 3 files changed, 31 insertions(+)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index b7b9b04..49f1f6e 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -74,6 +74,20 @@ config ARM_ARCH_TIMER
 	bool
 	select CLKSRC_OF if OF
 
+config ARM_ARCH_TIMER_EVTSTREAM
+	bool "Support for ARM architected timer event stream generation"
+	default y if ARM_ARCH_TIMER
+	help
+	  This option enables support for event stream generation based on
+	  the ARM architected timer. It is used for waking up CPUs executing
+	  the wfe instruction at a frequency represented as a power-of-2
+	  divisor of the clock rate. An event stream might be mainly useful
+	  for wfe-based timeouts for userspace locking implementations.
+	  It might also be useful for imposing timeout on a wfe or even
+	  safeguarding against any programming errors in case an expected
+	  event is not generated. This must be disabled for hardware validation
+	  purposes to detect any hardware anomalies of missing events.
+
 config ARM_GLOBAL_TIMER
 	bool
 	select CLKSRC_OF if OF
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index ffadd83..9777b36 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -123,6 +123,19 @@ static int arch_timer_set_next_event_phys(unsigned long evt,
 	return 0;
 }
 
+static void arch_timer_enable_evtstream(void)
+{
+	int evt_stream_div, pos;
+
+	/* Find the closest power of two to the divisor */
+	evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ;
+	pos = fls(evt_stream_div);
+	if (pos > 1 && !(evt_stream_div & (1 << (pos - 2))))
+		pos--;
+	/* enable event stream */
+	arch_timer_evtstrm_enable(min(pos, 15));
+}
+
 static int arch_timer_setup(struct clock_event_device *clk)
 {
 	clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP;
@@ -154,6 +167,8 @@ static int arch_timer_setup(struct clock_event_device *clk)
 	}
 
 	arch_counter_set_user_access();
+	if (IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM))
+		arch_timer_enable_evtstream();
 
 	return 0;
 }
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h
index 551f7e9..c4d0fc4 100644
--- a/include/clocksource/arm_arch_timer.h
+++ b/include/clocksource/arm_arch_timer.h
@@ -37,6 +37,8 @@
 #define ARCH_TIMER_USR_VT_ACCESS_EN	(1 << 8) /* virtual timer registers */
 #define ARCH_TIMER_USR_PT_ACCESS_EN	(1 << 9) /* physical timer registers */
 
+#define ARCH_TIMER_EVT_STREAM_FREQ	10000	/* 100us */
+
 #ifdef CONFIG_ARM_ARCH_TIMER
 
 extern u32 arch_timer_get_rate(void);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 5/5] drivers: clocksource: add CPU PM notifier for ARM architected timer
  2013-08-29 14:55 ` Sudeep KarkadaNagesha
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel, linux-kernel
  Cc: Sudeep.KarkadaNagesha, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano,
	Sudeep KarkadaNagesha

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

Few control settings done in architected timer as part of initialisation
can be lost when CPU enters deeper power states. They need to be
restored when the CPU is (warm)reset again.

This patch adds CPU PM notifiers to save the counter control register
when entering low power modes and restore it when CPU exits low power.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 drivers/clocksource/arm_arch_timer.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 9777b36..611f9cb 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -13,6 +13,7 @@
 #include <linux/device.h>
 #include <linux/smp.h>
 #include <linux/cpu.h>
+#include <linux/cpu_pm.h>
 #include <linux/clockchips.h>
 #include <linux/interrupt.h>
 #include <linux/of_irq.h>
@@ -275,6 +276,33 @@ static struct notifier_block arch_timer_cpu_nb = {
 	.notifier_call = arch_timer_cpu_notify,
 };
 
+#ifdef CONFIG_CPU_PM
+static unsigned int saved_cntkctl;
+static int arch_timer_cpu_pm_notify(struct notifier_block *self,
+				    unsigned long action, void *hcpu)
+{
+	if (action == CPU_PM_ENTER)
+		saved_cntkctl = arch_timer_get_cntkctl();
+	else if (action == CPU_PM_ENTER_FAILED || action == CPU_PM_EXIT)
+		arch_timer_set_cntkctl(saved_cntkctl);
+	return NOTIFY_OK;
+}
+
+static struct notifier_block arch_timer_cpu_pm_notifier = {
+	.notifier_call = arch_timer_cpu_pm_notify,
+};
+
+static int __init arch_timer_cpu_pm_init(void)
+{
+	return cpu_pm_register_notifier(&arch_timer_cpu_pm_notifier);
+}
+#else
+static int __init arch_timer_cpu_pm_init(void)
+{
+	return 0;
+}
+#endif
+
 static int __init arch_timer_register(void)
 {
 	int err;
@@ -324,11 +352,17 @@ static int __init arch_timer_register(void)
 	if (err)
 		goto out_free_irq;
 
+	err = arch_timer_cpu_pm_init();
+	if (err)
+		goto out_unreg_notify;
+
 	/* Immediately configure the timer on the boot CPU */
 	arch_timer_setup(this_cpu_ptr(arch_timer_evt));
 
 	return 0;
 
+out_unreg_notify:
+	unregister_cpu_notifier(&arch_timer_cpu_nb);
 out_free_irq:
 	if (arch_timer_use_virtual)
 		free_percpu_irq(arch_timer_ppi[VIRT_PPI], arch_timer_evt);
-- 
1.8.1.2



^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v6 5/5] drivers: clocksource: add CPU PM notifier for ARM architected timer
@ 2013-08-29 14:55   ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 14:55 UTC (permalink / raw)
  To: linux-arm-kernel

From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>

Few control settings done in architected timer as part of initialisation
can be lost when CPU enters deeper power states. They need to be
restored when the CPU is (warm)reset again.

This patch adds CPU PM notifiers to save the counter control register
when entering low power modes and restore it when CPU exits low power.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
---
 drivers/clocksource/arm_arch_timer.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 9777b36..611f9cb 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -13,6 +13,7 @@
 #include <linux/device.h>
 #include <linux/smp.h>
 #include <linux/cpu.h>
+#include <linux/cpu_pm.h>
 #include <linux/clockchips.h>
 #include <linux/interrupt.h>
 #include <linux/of_irq.h>
@@ -275,6 +276,33 @@ static struct notifier_block arch_timer_cpu_nb = {
 	.notifier_call = arch_timer_cpu_notify,
 };
 
+#ifdef CONFIG_CPU_PM
+static unsigned int saved_cntkctl;
+static int arch_timer_cpu_pm_notify(struct notifier_block *self,
+				    unsigned long action, void *hcpu)
+{
+	if (action == CPU_PM_ENTER)
+		saved_cntkctl = arch_timer_get_cntkctl();
+	else if (action == CPU_PM_ENTER_FAILED || action == CPU_PM_EXIT)
+		arch_timer_set_cntkctl(saved_cntkctl);
+	return NOTIFY_OK;
+}
+
+static struct notifier_block arch_timer_cpu_pm_notifier = {
+	.notifier_call = arch_timer_cpu_pm_notify,
+};
+
+static int __init arch_timer_cpu_pm_init(void)
+{
+	return cpu_pm_register_notifier(&arch_timer_cpu_pm_notifier);
+}
+#else
+static int __init arch_timer_cpu_pm_init(void)
+{
+	return 0;
+}
+#endif
+
 static int __init arch_timer_register(void)
 {
 	int err;
@@ -324,11 +352,17 @@ static int __init arch_timer_register(void)
 	if (err)
 		goto out_free_irq;
 
+	err = arch_timer_cpu_pm_init();
+	if (err)
+		goto out_unreg_notify;
+
 	/* Immediately configure the timer on the boot CPU */
 	arch_timer_setup(this_cpu_ptr(arch_timer_evt));
 
 	return 0;
 
+out_unreg_notify:
+	unregister_cpu_notifier(&arch_timer_cpu_nb);
 out_free_irq:
 	if (arch_timer_use_virtual)
 		free_percpu_irq(arch_timer_ppi[VIRT_PPI], arch_timer_evt);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer event stream
  2013-08-29 14:55   ` Sudeep KarkadaNagesha
@ 2013-08-29 15:39     ` Catalin Marinas
  -1 siblings, 0 replies; 26+ messages in thread
From: Catalin Marinas @ 2013-08-29 15:39 UTC (permalink / raw)
  To: Sudeep KarkadaNagesha
  Cc: linux-arm-kernel, linux-kernel, Lorenzo Pieralisi, Will Deacon,
	Thomas Gleixner, Daniel Lezcano

On Thu, Aug 29, 2013 at 03:55:41PM +0100, Sudeep KarkadaNagesha wrote:
> From: Will Deacon <will.deacon@arm.com>
> 
> The ARM architected timer can generate events (used for waking up
> CPUs executing the wfe instruction) at a frequency represented as a
> power-of-2 divisor of the clock rate.
> 
> An event stream might be used:
> - To impose a time-out on a wfe polling loop.
> - To safeguard against any programming error in case an expected event
>   is not generated.
> - To implement wfe-based timeouts for userspace locking implementations.
> 
> This patch computes the event stream frequency aiming for a period
> of 100us between events. It uses ARM/ARM64 specific backends to configure
> and enable the event stream.
> 
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
> [sudeep: moving ARM/ARM64 changes into separate patches
>          and adding Kconfig option]
> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> ---
>  drivers/clocksource/Kconfig          | 14 ++++++++++++++
>  drivers/clocksource/arm_arch_timer.c | 15 +++++++++++++++
>  include/clocksource/arm_arch_timer.h |  2 ++
>  3 files changed, 31 insertions(+)
> 
> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
> index b7b9b04..49f1f6e 100644
> --- a/drivers/clocksource/Kconfig
> +++ b/drivers/clocksource/Kconfig
> @@ -74,6 +74,20 @@ config ARM_ARCH_TIMER
>  	bool
>  	select CLKSRC_OF if OF
>  
> +config ARM_ARCH_TIMER_EVTSTREAM
> +	bool "Support for ARM architected timer event stream generation"
> +	default y if ARM_ARCH_TIMER
> +	help
> +	  This option enables support for event stream generation based on
> +	  the ARM architected timer. It is used for waking up CPUs executing
> +	  the wfe instruction at a frequency represented as a power-of-2
> +	  divisor of the clock rate. An event stream might be mainly useful
> +	  for wfe-based timeouts for userspace locking implementations.

I would be a bit more assertive here, something like "the main use of
the event stream is wfe-based timeouts of userspace locking
implementations."

> +	  It might also be useful for imposing timeout on a wfe or even
> +	  safeguarding against any programming errors in case an expected

Maybe "imposting timeout on wfe to safeguard against ...". We already
mentioned wfe-based timeout above.

Otherwise, for the whole series:

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer event stream
@ 2013-08-29 15:39     ` Catalin Marinas
  0 siblings, 0 replies; 26+ messages in thread
From: Catalin Marinas @ 2013-08-29 15:39 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Aug 29, 2013 at 03:55:41PM +0100, Sudeep KarkadaNagesha wrote:
> From: Will Deacon <will.deacon@arm.com>
> 
> The ARM architected timer can generate events (used for waking up
> CPUs executing the wfe instruction) at a frequency represented as a
> power-of-2 divisor of the clock rate.
> 
> An event stream might be used:
> - To impose a time-out on a wfe polling loop.
> - To safeguard against any programming error in case an expected event
>   is not generated.
> - To implement wfe-based timeouts for userspace locking implementations.
> 
> This patch computes the event stream frequency aiming for a period
> of 100us between events. It uses ARM/ARM64 specific backends to configure
> and enable the event stream.
> 
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
> [sudeep: moving ARM/ARM64 changes into separate patches
>          and adding Kconfig option]
> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> ---
>  drivers/clocksource/Kconfig          | 14 ++++++++++++++
>  drivers/clocksource/arm_arch_timer.c | 15 +++++++++++++++
>  include/clocksource/arm_arch_timer.h |  2 ++
>  3 files changed, 31 insertions(+)
> 
> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
> index b7b9b04..49f1f6e 100644
> --- a/drivers/clocksource/Kconfig
> +++ b/drivers/clocksource/Kconfig
> @@ -74,6 +74,20 @@ config ARM_ARCH_TIMER
>  	bool
>  	select CLKSRC_OF if OF
>  
> +config ARM_ARCH_TIMER_EVTSTREAM
> +	bool "Support for ARM architected timer event stream generation"
> +	default y if ARM_ARCH_TIMER
> +	help
> +	  This option enables support for event stream generation based on
> +	  the ARM architected timer. It is used for waking up CPUs executing
> +	  the wfe instruction at a frequency represented as a power-of-2
> +	  divisor of the clock rate. An event stream might be mainly useful
> +	  for wfe-based timeouts for userspace locking implementations.

I would be a bit more assertive here, something like "the main use of
the event stream is wfe-based timeouts of userspace locking
implementations."

> +	  It might also be useful for imposing timeout on a wfe or even
> +	  safeguarding against any programming errors in case an expected

Maybe "imposting timeout on wfe to safeguard against ...". We already
mentioned wfe-based timeout above.

Otherwise, for the whole series:

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer event stream
  2013-08-29 15:39     ` Catalin Marinas
@ 2013-08-29 15:42       ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 15:42 UTC (permalink / raw)
  To: Catalin Marinas
  Cc: Sudeep KarkadaNagesha, linux-arm-kernel, linux-kernel,
	Lorenzo Pieralisi, Will Deacon, Thomas Gleixner, Daniel Lezcano

On 29/08/13 16:39, Catalin Marinas wrote:
> On Thu, Aug 29, 2013 at 03:55:41PM +0100, Sudeep KarkadaNagesha wrote:
>> From: Will Deacon <will.deacon@arm.com>
>>
>> The ARM architected timer can generate events (used for waking up
>> CPUs executing the wfe instruction) at a frequency represented as a
>> power-of-2 divisor of the clock rate.
>>
>> An event stream might be used:
>> - To impose a time-out on a wfe polling loop.
>> - To safeguard against any programming error in case an expected event
>>   is not generated.
>> - To implement wfe-based timeouts for userspace locking implementations.
>>
>> This patch computes the event stream frequency aiming for a period
>> of 100us between events. It uses ARM/ARM64 specific backends to configure
>> and enable the event stream.
>>
>> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
>> Cc: Catalin Marinas <catalin.marinas@arm.com>
>> Signed-off-by: Will Deacon <will.deacon@arm.com>
>> [sudeep: moving ARM/ARM64 changes into separate patches
>>          and adding Kconfig option]
>> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>> ---
>>  drivers/clocksource/Kconfig          | 14 ++++++++++++++
>>  drivers/clocksource/arm_arch_timer.c | 15 +++++++++++++++
>>  include/clocksource/arm_arch_timer.h |  2 ++
>>  3 files changed, 31 insertions(+)
>>
>> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
>> index b7b9b04..49f1f6e 100644
>> --- a/drivers/clocksource/Kconfig
>> +++ b/drivers/clocksource/Kconfig
>> @@ -74,6 +74,20 @@ config ARM_ARCH_TIMER
>>  	bool
>>  	select CLKSRC_OF if OF
>>  
>> +config ARM_ARCH_TIMER_EVTSTREAM
>> +	bool "Support for ARM architected timer event stream generation"
>> +	default y if ARM_ARCH_TIMER
>> +	help
>> +	  This option enables support for event stream generation based on
>> +	  the ARM architected timer. It is used for waking up CPUs executing
>> +	  the wfe instruction at a frequency represented as a power-of-2
>> +	  divisor of the clock rate. An event stream might be mainly useful
>> +	  for wfe-based timeouts for userspace locking implementations.
> 
> I would be a bit more assertive here, something like "the main use of
> the event stream is wfe-based timeouts of userspace locking
> implementations."
> 
>> +	  It might also be useful for imposing timeout on a wfe or even
>> +	  safeguarding against any programming errors in case an expected
> 
> Maybe "imposting timeout on wfe to safeguard against ...". We already
> mentioned wfe-based timeout above.
> 
Ok will fix this Kconfig description.

> Otherwise, for the whole series:
> 
> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> 
Thanks.

Regards,
Sudeep


^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer event stream
@ 2013-08-29 15:42       ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-29 15:42 UTC (permalink / raw)
  To: linux-arm-kernel

On 29/08/13 16:39, Catalin Marinas wrote:
> On Thu, Aug 29, 2013 at 03:55:41PM +0100, Sudeep KarkadaNagesha wrote:
>> From: Will Deacon <will.deacon@arm.com>
>>
>> The ARM architected timer can generate events (used for waking up
>> CPUs executing the wfe instruction) at a frequency represented as a
>> power-of-2 divisor of the clock rate.
>>
>> An event stream might be used:
>> - To impose a time-out on a wfe polling loop.
>> - To safeguard against any programming error in case an expected event
>>   is not generated.
>> - To implement wfe-based timeouts for userspace locking implementations.
>>
>> This patch computes the event stream frequency aiming for a period
>> of 100us between events. It uses ARM/ARM64 specific backends to configure
>> and enable the event stream.
>>
>> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
>> Cc: Catalin Marinas <catalin.marinas@arm.com>
>> Signed-off-by: Will Deacon <will.deacon@arm.com>
>> [sudeep: moving ARM/ARM64 changes into separate patches
>>          and adding Kconfig option]
>> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>> ---
>>  drivers/clocksource/Kconfig          | 14 ++++++++++++++
>>  drivers/clocksource/arm_arch_timer.c | 15 +++++++++++++++
>>  include/clocksource/arm_arch_timer.h |  2 ++
>>  3 files changed, 31 insertions(+)
>>
>> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
>> index b7b9b04..49f1f6e 100644
>> --- a/drivers/clocksource/Kconfig
>> +++ b/drivers/clocksource/Kconfig
>> @@ -74,6 +74,20 @@ config ARM_ARCH_TIMER
>>  	bool
>>  	select CLKSRC_OF if OF
>>  
>> +config ARM_ARCH_TIMER_EVTSTREAM
>> +	bool "Support for ARM architected timer event stream generation"
>> +	default y if ARM_ARCH_TIMER
>> +	help
>> +	  This option enables support for event stream generation based on
>> +	  the ARM architected timer. It is used for waking up CPUs executing
>> +	  the wfe instruction at a frequency represented as a power-of-2
>> +	  divisor of the clock rate. An event stream might be mainly useful
>> +	  for wfe-based timeouts for userspace locking implementations.
> 
> I would be a bit more assertive here, something like "the main use of
> the event stream is wfe-based timeouts of userspace locking
> implementations."
> 
>> +	  It might also be useful for imposing timeout on a wfe or even
>> +	  safeguarding against any programming errors in case an expected
> 
> Maybe "imposting timeout on wfe to safeguard against ...". We already
> mentioned wfe-based timeout above.
> 
Ok will fix this Kconfig description.

> Otherwise, for the whole series:
> 
> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> 
Thanks.

Regards,
Sudeep

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 0/5] ARM/ARM64 architected timer updates
  2013-08-29 14:55 ` Sudeep KarkadaNagesha
@ 2013-08-30 10:07   ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-30 10:07 UTC (permalink / raw)
  To: Russell King
  Cc: Sudeep KarkadaNagesha, linux-arm-kernel, linux-kernel,
	Lorenzo Pieralisi, Will Deacon, Catalin Marinas, Thomas Gleixner,
	Daniel Lezcano

On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> 
> This patch series adds support to configure the rate and enable the
> event stream for architected timer. The event streams can be used to
> impose a timeout on a wfe, to safeguard against any programming error
> in case an expected event is not generated or even to implement
> wfe-based timeouts for userspace locking implementations. This feature
> can be disabled(enabled by default).
> 
> Since the timer control register is reset to zero on warm boot, CPU
> PM notifier is added to save and restore the value.
> 
Hi Russell,

Can you have a look at this series ?
If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?

Regards,
Sudeep

> Changes v5->v6:
> 1. Disabling event stream by default on boot and enable it
>    only if CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
>    This removes runtime configuration of timer event stream.
> 2. Moved COMPAT_ELF_HWCAP_DEFAULT to arch/arm64/kernel/setup.c
> 
> Changes v4->v5:
> 1. Removed compat_dyn_elf_hwcap and used just compat_elf_hwcap as per
>    Catalin's suggestion
> 2. Instead of resetting event stream in CPU PM callbacks, saving and
>    restoring counter control register now.
> 
> Changes v3->v4:
> 1. Added a config option to en/disable the timer event stream feature.
>    Due to this the ordering of the patches as well as some cosmetic
>    code changes are done.( So dropped previous reviewed-by tags)
> 2. Removed exporting compat_dyn_elf_hwcap as there are no modules
>    requiring it for now.
> 
> Changes v2->v3:
> 1. Moved ARM and ARM64 changes into separate patches
> 2. Added native hwcaps definations(ARM/ARM64) and compat-specific
>    definitions(ARM64) to the users for the event stream feature. 
> 
> Changes v1->v2:
> 1. Saved event stream divider value on cold reset path and re-used it
>    in CPU PM notifier instead of calculating every time.
> 2. Rebased on v3.11-rc2(to avoid conflicts with __cpuinit* deletion)
> 3. Dropped "ARM/ARM64: arch_timer: remove __cpuinit attribute for
>    arch_counter_set_user_access"(already done as part of __cpuinit*
>    deletion)
> 
> Regards,
> Sudeep
> 
> 
> Sudeep KarkadaNagesha (4):
>   ARM/ARM64: arch_timer: add macros for bits in control register
>   ARM: arch_timer: add support to configure and enable event stream
>   ARM64: arch_timer: add support to configure and enable event stream
>   drivers: clocksource: add CPU PM notifier for ARM architected timer
> 
> Will Deacon (1):
>   drivers: clocksource: add support for ARM architected timer event
>     stream
> 
>  arch/arm/include/asm/arch_timer.h    | 36 ++++++++++++++++++++++----
>  arch/arm/include/uapi/asm/hwcap.h    |  1 +
>  arch/arm/kernel/setup.c              |  1 +
>  arch/arm64/include/asm/arch_timer.h  | 42 ++++++++++++++++++++++++++-----
>  arch/arm64/include/asm/hwcap.h       | 11 ++++----
>  arch/arm64/include/uapi/asm/hwcap.h  |  1 +
>  arch/arm64/kernel/setup.c            | 11 ++++++++
>  drivers/clocksource/Kconfig          | 14 +++++++++++
>  drivers/clocksource/arm_arch_timer.c | 49 ++++++++++++++++++++++++++++++++++++
>  include/clocksource/arm_arch_timer.h | 10 ++++++++
>  10 files changed, 160 insertions(+), 16 deletions(-)
> 



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-30 10:07   ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-30 10:07 UTC (permalink / raw)
  To: linux-arm-kernel

On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> 
> This patch series adds support to configure the rate and enable the
> event stream for architected timer. The event streams can be used to
> impose a timeout on a wfe, to safeguard against any programming error
> in case an expected event is not generated or even to implement
> wfe-based timeouts for userspace locking implementations. This feature
> can be disabled(enabled by default).
> 
> Since the timer control register is reset to zero on warm boot, CPU
> PM notifier is added to save and restore the value.
> 
Hi Russell,

Can you have a look at this series ?
If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?

Regards,
Sudeep

> Changes v5->v6:
> 1. Disabling event stream by default on boot and enable it
>    only if CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
>    This removes runtime configuration of timer event stream.
> 2. Moved COMPAT_ELF_HWCAP_DEFAULT to arch/arm64/kernel/setup.c
> 
> Changes v4->v5:
> 1. Removed compat_dyn_elf_hwcap and used just compat_elf_hwcap as per
>    Catalin's suggestion
> 2. Instead of resetting event stream in CPU PM callbacks, saving and
>    restoring counter control register now.
> 
> Changes v3->v4:
> 1. Added a config option to en/disable the timer event stream feature.
>    Due to this the ordering of the patches as well as some cosmetic
>    code changes are done.( So dropped previous reviewed-by tags)
> 2. Removed exporting compat_dyn_elf_hwcap as there are no modules
>    requiring it for now.
> 
> Changes v2->v3:
> 1. Moved ARM and ARM64 changes into separate patches
> 2. Added native hwcaps definations(ARM/ARM64) and compat-specific
>    definitions(ARM64) to the users for the event stream feature. 
> 
> Changes v1->v2:
> 1. Saved event stream divider value on cold reset path and re-used it
>    in CPU PM notifier instead of calculating every time.
> 2. Rebased on v3.11-rc2(to avoid conflicts with __cpuinit* deletion)
> 3. Dropped "ARM/ARM64: arch_timer: remove __cpuinit attribute for
>    arch_counter_set_user_access"(already done as part of __cpuinit*
>    deletion)
> 
> Regards,
> Sudeep
> 
> 
> Sudeep KarkadaNagesha (4):
>   ARM/ARM64: arch_timer: add macros for bits in control register
>   ARM: arch_timer: add support to configure and enable event stream
>   ARM64: arch_timer: add support to configure and enable event stream
>   drivers: clocksource: add CPU PM notifier for ARM architected timer
> 
> Will Deacon (1):
>   drivers: clocksource: add support for ARM architected timer event
>     stream
> 
>  arch/arm/include/asm/arch_timer.h    | 36 ++++++++++++++++++++++----
>  arch/arm/include/uapi/asm/hwcap.h    |  1 +
>  arch/arm/kernel/setup.c              |  1 +
>  arch/arm64/include/asm/arch_timer.h  | 42 ++++++++++++++++++++++++++-----
>  arch/arm64/include/asm/hwcap.h       | 11 ++++----
>  arch/arm64/include/uapi/asm/hwcap.h  |  1 +
>  arch/arm64/kernel/setup.c            | 11 ++++++++
>  drivers/clocksource/Kconfig          | 14 +++++++++++
>  drivers/clocksource/arm_arch_timer.c | 49 ++++++++++++++++++++++++++++++++++++
>  include/clocksource/arm_arch_timer.h | 10 ++++++++
>  10 files changed, 160 insertions(+), 16 deletions(-)
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 0/5] ARM/ARM64 architected timer updates
  2013-08-30 10:07   ` Sudeep KarkadaNagesha
@ 2013-08-30 11:43     ` Russell King - ARM Linux
  -1 siblings, 0 replies; 26+ messages in thread
From: Russell King - ARM Linux @ 2013-08-30 11:43 UTC (permalink / raw)
  To: Sudeep KarkadaNagesha
  Cc: linux-arm-kernel, linux-kernel, Lorenzo Pieralisi, Will Deacon,
	Catalin Marinas, Thomas Gleixner, Daniel Lezcano

On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
> On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> > From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> > 
> > This patch series adds support to configure the rate and enable the
> > event stream for architected timer. The event streams can be used to
> > impose a timeout on a wfe, to safeguard against any programming error
> > in case an expected event is not generated or even to implement
> > wfe-based timeouts for userspace locking implementations. This feature
> > can be disabled(enabled by default).
> > 
> > Since the timer control register is reset to zero on warm boot, CPU
> > PM notifier is added to save and restore the value.
> > 
> Hi Russell,
> 
> Can you have a look at this series ?
> If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?

I think it would be more value to have someone from ARM Ltd ack it,
because they will know the code much better than I do.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-30 11:43     ` Russell King - ARM Linux
  0 siblings, 0 replies; 26+ messages in thread
From: Russell King - ARM Linux @ 2013-08-30 11:43 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
> On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> > From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> > 
> > This patch series adds support to configure the rate and enable the
> > event stream for architected timer. The event streams can be used to
> > impose a timeout on a wfe, to safeguard against any programming error
> > in case an expected event is not generated or even to implement
> > wfe-based timeouts for userspace locking implementations. This feature
> > can be disabled(enabled by default).
> > 
> > Since the timer control register is reset to zero on warm boot, CPU
> > PM notifier is added to save and restore the value.
> > 
> Hi Russell,
> 
> Can you have a look at this series ?
> If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?

I think it would be more value to have someone from ARM Ltd ack it,
because they will know the code much better than I do.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 0/5] ARM/ARM64 architected timer updates
  2013-08-30 11:43     ` Russell King - ARM Linux
@ 2013-08-30 14:04       ` Will Deacon
  -1 siblings, 0 replies; 26+ messages in thread
From: Will Deacon @ 2013-08-30 14:04 UTC (permalink / raw)
  To: Russell King - ARM Linux
  Cc: Sudeep KarkadaNagesha, linux-arm-kernel, linux-kernel,
	Lorenzo Pieralisi, Catalin Marinas, Thomas Gleixner,
	Daniel Lezcano

On Fri, Aug 30, 2013 at 12:43:09PM +0100, Russell King - ARM Linux wrote:
> On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
> > On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> > > From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> > > 
> > > This patch series adds support to configure the rate and enable the
> > > event stream for architected timer. The event streams can be used to
> > > impose a timeout on a wfe, to safeguard against any programming error
> > > in case an expected event is not generated or even to implement
> > > wfe-based timeouts for userspace locking implementations. This feature
> > > can be disabled(enabled by default).
> > > 
> > > Since the timer control register is reset to zero on warm boot, CPU
> > > PM notifier is added to save and restore the value.
> > > 
> > Hi Russell,
> > 
> > Can you have a look at this series ?
> > If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?
> 
> I think it would be more value to have someone from ARM Ltd ack it,
> because they will know the code much better than I do.

Looks good to me, so for patch 2/5:

  Acked-by: Will Deacon <will.deacon@arm.com>

Will

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-30 14:04       ` Will Deacon
  0 siblings, 0 replies; 26+ messages in thread
From: Will Deacon @ 2013-08-30 14:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Aug 30, 2013 at 12:43:09PM +0100, Russell King - ARM Linux wrote:
> On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
> > On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> > > From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> > > 
> > > This patch series adds support to configure the rate and enable the
> > > event stream for architected timer. The event streams can be used to
> > > impose a timeout on a wfe, to safeguard against any programming error
> > > in case an expected event is not generated or even to implement
> > > wfe-based timeouts for userspace locking implementations. This feature
> > > can be disabled(enabled by default).
> > > 
> > > Since the timer control register is reset to zero on warm boot, CPU
> > > PM notifier is added to save and restore the value.
> > > 
> > Hi Russell,
> > 
> > Can you have a look at this series ?
> > If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?
> 
> I think it would be more value to have someone from ARM Ltd ack it,
> because they will know the code much better than I do.

Looks good to me, so for patch 2/5:

  Acked-by: Will Deacon <will.deacon@arm.com>

Will

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 0/5] ARM/ARM64 architected timer updates
  2013-08-30 14:04       ` Will Deacon
@ 2013-08-30 15:46         ` Sudeep KarkadaNagesha
  -1 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-30 15:46 UTC (permalink / raw)
  To: Will Deacon, Russell King - ARM Linux, Catalin Marinas
  Cc: Sudeep KarkadaNagesha, linux-arm-kernel, linux-kernel,
	Lorenzo Pieralisi, Thomas Gleixner, Daniel Lezcano

On 30/08/13 15:04, Will Deacon wrote:
> On Fri, Aug 30, 2013 at 12:43:09PM +0100, Russell King - ARM Linux wrote:
>> On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
>>> On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
>>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>>
>>>> This patch series adds support to configure the rate and enable the
>>>> event stream for architected timer. The event streams can be used to
>>>> impose a timeout on a wfe, to safeguard against any programming error
>>>> in case an expected event is not generated or even to implement
>>>> wfe-based timeouts for userspace locking implementations. This feature
>>>> can be disabled(enabled by default).
>>>>
>>>> Since the timer control register is reset to zero on warm boot, CPU
>>>> PM notifier is added to save and restore the value.
>>>>
>>> Hi Russell,
>>>
>>> Can you have a look at this series ?
>>> If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?
>>
>> I think it would be more value to have someone from ARM Ltd ack it,
>> because they will know the code much better than I do.
> 
> Looks good to me, so for patch 2/5:
> 
>   Acked-by: Will Deacon <will.deacon@arm.com>
> 
Thanks Will and Russell.

Hi Catalin,

Can I have your ACK for ARM64 changes(PATCH 3/5) so that Daniel can
accept my pull request ?

Regards,
Sudeep


^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-30 15:46         ` Sudeep KarkadaNagesha
  0 siblings, 0 replies; 26+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-08-30 15:46 UTC (permalink / raw)
  To: linux-arm-kernel

On 30/08/13 15:04, Will Deacon wrote:
> On Fri, Aug 30, 2013 at 12:43:09PM +0100, Russell King - ARM Linux wrote:
>> On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
>>> On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
>>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
>>>>
>>>> This patch series adds support to configure the rate and enable the
>>>> event stream for architected timer. The event streams can be used to
>>>> impose a timeout on a wfe, to safeguard against any programming error
>>>> in case an expected event is not generated or even to implement
>>>> wfe-based timeouts for userspace locking implementations. This feature
>>>> can be disabled(enabled by default).
>>>>
>>>> Since the timer control register is reset to zero on warm boot, CPU
>>>> PM notifier is added to save and restore the value.
>>>>
>>> Hi Russell,
>>>
>>> Can you have a look at this series ?
>>> If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?
>>
>> I think it would be more value to have someone from ARM Ltd ack it,
>> because they will know the code much better than I do.
> 
> Looks good to me, so for patch 2/5:
> 
>   Acked-by: Will Deacon <will.deacon@arm.com>
> 
Thanks Will and Russell.

Hi Catalin,

Can I have your ACK for ARM64 changes(PATCH 3/5) so that Daniel can
accept my pull request ?

Regards,
Sudeep

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v6 0/5] ARM/ARM64 architected timer updates
  2013-08-30 15:46         ` Sudeep KarkadaNagesha
@ 2013-08-30 16:35           ` Catalin Marinas
  -1 siblings, 0 replies; 26+ messages in thread
From: Catalin Marinas @ 2013-08-30 16:35 UTC (permalink / raw)
  To: Sudeep KarkadaNagesha
  Cc: Will Deacon, Russell King - ARM Linux, linux-arm-kernel,
	linux-kernel, Lorenzo Pieralisi, Thomas Gleixner, Daniel Lezcano

On Fri, Aug 30, 2013 at 04:46:17PM +0100, Sudeep KarkadaNagesha wrote:
> On 30/08/13 15:04, Will Deacon wrote:
> > On Fri, Aug 30, 2013 at 12:43:09PM +0100, Russell King - ARM Linux wrote:
> >> On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
> >>> On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> >>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> >>>>
> >>>> This patch series adds support to configure the rate and enable the
> >>>> event stream for architected timer. The event streams can be used to
> >>>> impose a timeout on a wfe, to safeguard against any programming error
> >>>> in case an expected event is not generated or even to implement
> >>>> wfe-based timeouts for userspace locking implementations. This feature
> >>>> can be disabled(enabled by default).
> >>>>
> >>>> Since the timer control register is reset to zero on warm boot, CPU
> >>>> PM notifier is added to save and restore the value.
> >>>>
> >>> Hi Russell,
> >>>
> >>> Can you have a look at this series ?
> >>> If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?
> >>
> >> I think it would be more value to have someone from ARM Ltd ack it,
> >> because they will know the code much better than I do.
> > 
> > Looks good to me, so for patch 2/5:
> > 
> >   Acked-by: Will Deacon <will.deacon@arm.com>
> > 
> Thanks Will and Russell.
> 
> Hi Catalin,
> 
> Can I have your ACK for ARM64 changes(PATCH 3/5) so that Daniel can
> accept my pull request ?

Well, I gave you my reviewed-by couple of times already. If you need
ack, here it is ;)

Acked-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v6 0/5] ARM/ARM64 architected timer updates
@ 2013-08-30 16:35           ` Catalin Marinas
  0 siblings, 0 replies; 26+ messages in thread
From: Catalin Marinas @ 2013-08-30 16:35 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Aug 30, 2013 at 04:46:17PM +0100, Sudeep KarkadaNagesha wrote:
> On 30/08/13 15:04, Will Deacon wrote:
> > On Fri, Aug 30, 2013 at 12:43:09PM +0100, Russell King - ARM Linux wrote:
> >> On Fri, Aug 30, 2013 at 11:07:28AM +0100, Sudeep KarkadaNagesha wrote:
> >>> On 29/08/13 15:55, Sudeep KarkadaNagesha wrote:
> >>>> From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
> >>>>
> >>>> This patch series adds support to configure the rate and enable the
> >>>> event stream for architected timer. The event streams can be used to
> >>>> impose a timeout on a wfe, to safeguard against any programming error
> >>>> in case an expected event is not generated or even to implement
> >>>> wfe-based timeouts for userspace locking implementations. This feature
> >>>> can be disabled(enabled by default).
> >>>>
> >>>> Since the timer control register is reset to zero on warm boot, CPU
> >>>> PM notifier is added to save and restore the value.
> >>>>
> >>> Hi Russell,
> >>>
> >>> Can you have a look at this series ?
> >>> If you are OK, can I have your ACK on arm specific changes(PATCH 2/5) ?
> >>
> >> I think it would be more value to have someone from ARM Ltd ack it,
> >> because they will know the code much better than I do.
> > 
> > Looks good to me, so for patch 2/5:
> > 
> >   Acked-by: Will Deacon <will.deacon@arm.com>
> > 
> Thanks Will and Russell.
> 
> Hi Catalin,
> 
> Can I have your ACK for ARM64 changes(PATCH 3/5) so that Daniel can
> accept my pull request ?

Well, I gave you my reviewed-by couple of times already. If you need
ack, here it is ;)

Acked-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2013-08-30 16:37 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-29 14:55 [PATCH v6 0/5] ARM/ARM64 architected timer updates Sudeep KarkadaNagesha
2013-08-29 14:55 ` Sudeep KarkadaNagesha
2013-08-29 14:55 ` [PATCH v6 1/5] ARM/ARM64: arch_timer: add macros for bits in control register Sudeep KarkadaNagesha
2013-08-29 14:55   ` Sudeep KarkadaNagesha
2013-08-29 14:55 ` [PATCH v6 2/5] ARM: arch_timer: add support to configure and enable event stream Sudeep KarkadaNagesha
2013-08-29 14:55   ` Sudeep KarkadaNagesha
2013-08-29 14:55 ` [PATCH v6 3/5] ARM64: " Sudeep KarkadaNagesha
2013-08-29 14:55   ` Sudeep KarkadaNagesha
2013-08-29 14:55 ` [PATCH v6 4/5] drivers: clocksource: add support for ARM architected timer " Sudeep KarkadaNagesha
2013-08-29 14:55   ` Sudeep KarkadaNagesha
2013-08-29 15:39   ` Catalin Marinas
2013-08-29 15:39     ` Catalin Marinas
2013-08-29 15:42     ` Sudeep KarkadaNagesha
2013-08-29 15:42       ` Sudeep KarkadaNagesha
2013-08-29 14:55 ` [PATCH v6 5/5] drivers: clocksource: add CPU PM notifier for ARM architected timer Sudeep KarkadaNagesha
2013-08-29 14:55   ` Sudeep KarkadaNagesha
2013-08-30 10:07 ` [PATCH v6 0/5] ARM/ARM64 architected timer updates Sudeep KarkadaNagesha
2013-08-30 10:07   ` Sudeep KarkadaNagesha
2013-08-30 11:43   ` Russell King - ARM Linux
2013-08-30 11:43     ` Russell King - ARM Linux
2013-08-30 14:04     ` Will Deacon
2013-08-30 14:04       ` Will Deacon
2013-08-30 15:46       ` Sudeep KarkadaNagesha
2013-08-30 15:46         ` Sudeep KarkadaNagesha
2013-08-30 16:35         ` Catalin Marinas
2013-08-30 16:35           ` Catalin Marinas

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.