Skip to contentSkip to conversation

arm: pmu: support pmu/perf on OMAP4

PATCH Superseded tom.leiming at gmail.com 4 participants 14 messages Mar 3, 2011 – Mar 7, 2011

Subsystems (5)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover arm: pmu: support pmu/perf on OMAP4

Hi,

This patches support pmu irq routed from CTI, such as implemented on OMAP4:

- introduce some CTI helpers and registers' definition
- introduce .enable_irq and .disable_irq into platform_data, so perf irq handler can handle irq correctly if it is routed from CTI on OMAP4
- configure CTI on OMAP4 so that perf can work on OMAP4

The patches have been tested Ok on Pandaboard, and 'perf' does work after applying them.

v3:
- fix typo of patch 2/3 title, pointed by Will
- move cti addresses to plat/omap44xx.h, suggested by Santosh Shilimkar

v2:
- move cti related code out of perf_event.c
- introduce .enable_irq and .disable_irq into platform_data as suggested by Will.

v1:
- rebase the patch set against 2.6.38-rc6-next-20110301, fix conflicts, which is pointed out by Will Deacon

#1 lore raw

PATCH v3 1/3 arm: introduce cross trigger interface helpers

From: Ming Lei <[email protected]>

OMAP4 uses cross trigger interface(CTI) to route
performance monitor irq to GIC, so introduce cti
helpers to make access for cti easily.

---
 arch/arm/include/asm/cti.h |  177 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 177 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/include/asm/cti.h
arch/arm/include/asm/cti.h new file +177 -0
new file mode 100644
index 0000000..48f173a
@@ -0,0 +1,177 @@
+/*
+ *  arch/arm/include/asm/cti.h
+ */
+#ifndef __ASMARM_CTI_H
+#define __ASMARM_CTI_H
+
+#include	<asm/io.h>
+
+/*The registers' definition is from section 3.2 of
+ * 	Embedded Cross Trigger Revision: r0p0
+ **/
+#define		CTICONTROL		0x000
+#define		CTISTATUS		0x004
+#define		CTILOCK			0x008
+#define		CTIPROTECTION		0x00C
+#define		CTIINTACK		0x010
+#define		CTIAPPSET		0x014
+#define		CTIAPPCLEAR		0x018
+#define		CTIAPPPULSE		0x01c
+#define		CTIINEN			0x020
+#define		CTIOUTEN		0x0A0
+#define		CTITRIGINSTATUS		0x130
+#define		CTITRIGOUTSTATUS	0x134
+#define		CTICHINSTATUS		0x138
+#define		CTICHOUTSTATUS		0x13c
+#define		CTIPERIPHID0		0xFE0
+#define		CTIPERIPHID1		0xFE4
+#define		CTIPERIPHID2		0xFE8
+#define		CTIPERIPHID3		0xFEC
+#define		CTIPCELLID0		0xFF0
+#define		CTIPCELLID1		0xFF4
+#define		CTIPCELLID2		0xFF8
+#define		CTIPCELLID3		0xFFC
+
+/*The two below are from section 3.6.4 of
+ * 	CoreSight v1.0 Architecture Specification
+ **/
+#define		LOCKACCESS		0xFB0
+#define		LOCKSTATUS		0xFB4
+
+/**
+ * struct cti - cross trigger interface struct
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out_for_irq: triger out number which will cause
+ * 	the @irq happen
+ *
+ * cti struct used to operate cti registers.
+ */
+struct cti {
+	void *base;
+	int irq;
+	int trig_out_for_irq;
+};
+
+/**
+ * cti_init - initialize the cti instance
+ * @cti: cti instance
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out: triger out number which will cause
+ * 	the @irq happen
+ *
+ * called by machine code to pass the board dependent
+ * @base, @irq and @trig_out to cti.
+ */
+static inline void cti_init(struct cti *cti,
+	void *base, int irq, int trig_out)
+{
+	cti->base = base;
+	cti->irq  = irq;
+	cti->trig_out_for_irq = trig_out;
+}
+
+/**
+ * cti_map_trigger - use the @chan to map @trig_in to @trig_out
+ * @cti: cti instance
+ * @trig_in: trigger in number
+ * @trig_out: trigger out number
+ * @channel: channel number
+ *
+ * This function maps one trigger in of @trig_in to one trigger
+ * out of @trig_out using the channel @chan.
+ */
+static inline void cti_map_trigger(struct cti *cti,
+	int trig_in, int trig_out, int chan)
+{
+	void *base = cti->base;
+	unsigned long val;
+
+	val = __raw_readl(base + CTIINEN + trig_in * 4);
+	val |= 1 << chan;
+	__raw_writel(val, base + CTIINEN + trig_in * 4);
+
+	val = __raw_readl(base + CTIOUTEN + trig_out * 4);
+	val |= 1 << chan;
+	__raw_writel(val, base + CTIOUTEN + trig_out * 4);
+}
+
+/**
+ * cti_enable - enable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_enable(struct cti *cti)
+{
+	__raw_writel(0x1, cti->base);
+}
+
+/**
+ * cti_disable - disable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_disable(struct cti *cti)
+{
+	__raw_writel(0, cti->base);
+}
+
+/**
+ * cti_irq_ack - clear the cti irq
+ * @cti: cti instance
+ *
+ * clear the cti irq
+ */
+static inline void cti_irq_ack(struct cti *cti)
+{
+	void *base = cti->base;
+	unsigned long val;
+
+	val = __raw_readl(base + CTIINTACK);
+	val |= 1 << cti->trig_out_for_irq;
+	__raw_writel(val, base + CTIINTACK);
+}
+
+/**
+ * cti_unlock - unlock cti module
+ * @cti: cti instance
+ *
+ * unlock the cti module, or else any writes to the cti
+ * module is not allowed.
+ */
+static inline void cti_unlock(struct cti *cti)
+{
+	void *base = cti->base;
+	unsigned long val;
+
+	val = __raw_readl(base + LOCKSTATUS);
+
+	if (val & 1) {
+		val = 0xC5ACCE55;
+		__raw_writel(val, base + LOCKACCESS);
+	}
+}
+
+/**
+ * cti_lock - lock cti module
+ * @cti: cti instance
+ *
+ * lock the cti module, so any writes to the cti
+ * module will be not allowed.
+ */
+static inline void cti_lock(struct cti *cti)
+{
+	void *base = cti->base;
+	unsigned long val;
+
+	val = __raw_readl(base + LOCKSTATUS);
+
+	if (!(val & 1)) {
+		val = ~0xC5ACCE55;
+		__raw_writel(val, base + LOCKACCESS);
+	}
+}
+#endif
Signature · 1 line
1.7.3
#2 lore raw

PATCH v3 1/3 arm: introduce cross trigger interface helpers

Quoted 99 lines · On Thu, Mar 3, 2011 at 11:53 AM, <[email protected]> wrote:

From: Ming Lei <[email protected]>

OMAP4 uses cross trigger interface(CTI) to route
performance monitor irq to GIC, so introduce cti
helpers to make access for cti easily.

---
?arch/arm/include/asm/cti.h | ?177 ++++++++++++++++++++++++++++++++++++++++++++ ?1 files changed, 177 insertions(+), 0 deletions(-)
?create mode 100644 arch/arm/include/asm/cti.h

arch/arm/include/asm/cti.h new file +81 -0
new file mode 100644
index 0000000..48f173a
@@ -0,0 +1,177 @@
+/*
+ * ?arch/arm/include/asm/cti.h
+ */
+#ifndef __ASMARM_CTI_H
+#define __ASMARM_CTI_H
+
+#include ? ? ? <asm/io.h>
+
+/*The registers' definition is from section 3.2 of
+ * ? ? Embedded Cross Trigger Revision: r0p0
+ **/
+#define ? ? ? ? ? ? ? ?CTICONTROL ? ? ? ? ? ? ?0x000
+#define ? ? ? ? ? ? ? ?CTISTATUS ? ? ? ? ? ? ? 0x004
+#define ? ? ? ? ? ? ? ?CTILOCK ? ? ? ? ? ? ? ? 0x008
+#define ? ? ? ? ? ? ? ?CTIPROTECTION ? ? ? ? ? 0x00C
+#define ? ? ? ? ? ? ? ?CTIINTACK ? ? ? ? ? ? ? 0x010
+#define ? ? ? ? ? ? ? ?CTIAPPSET ? ? ? ? ? ? ? 0x014
+#define ? ? ? ? ? ? ? ?CTIAPPCLEAR ? ? ? ? ? ? 0x018
+#define ? ? ? ? ? ? ? ?CTIAPPPULSE ? ? ? ? ? ? 0x01c
+#define ? ? ? ? ? ? ? ?CTIINEN ? ? ? ? ? ? ? ? 0x020
+#define ? ? ? ? ? ? ? ?CTIOUTEN ? ? ? ? ? ? ? ?0x0A0
+#define ? ? ? ? ? ? ? ?CTITRIGINSTATUS ? ? ? ? 0x130
+#define ? ? ? ? ? ? ? ?CTITRIGOUTSTATUS ? ? ? ?0x134
+#define ? ? ? ? ? ? ? ?CTICHINSTATUS ? ? ? ? ? 0x138
+#define ? ? ? ? ? ? ? ?CTICHOUTSTATUS ? ? ? ? ?0x13c
+#define ? ? ? ? ? ? ? ?CTIPERIPHID0 ? ? ? ? ? ?0xFE0
+#define ? ? ? ? ? ? ? ?CTIPERIPHID1 ? ? ? ? ? ?0xFE4
+#define ? ? ? ? ? ? ? ?CTIPERIPHID2 ? ? ? ? ? ?0xFE8
+#define ? ? ? ? ? ? ? ?CTIPERIPHID3 ? ? ? ? ? ?0xFEC
+#define ? ? ? ? ? ? ? ?CTIPCELLID0 ? ? ? ? ? ? 0xFF0
+#define ? ? ? ? ? ? ? ?CTIPCELLID1 ? ? ? ? ? ? 0xFF4
+#define ? ? ? ? ? ? ? ?CTIPCELLID2 ? ? ? ? ? ? 0xFF8
+#define ? ? ? ? ? ? ? ?CTIPCELLID3 ? ? ? ? ? ? 0xFFC
+
+/*The two below are from section 3.6.4 of
+ * ? ? CoreSight v1.0 Architecture Specification
+ **/
+#define ? ? ? ? ? ? ? ?LOCKACCESS ? ? ? ? ? ? ?0xFB0
+#define ? ? ? ? ? ? ? ?LOCKSTATUS ? ? ? ? ? ? ?0xFB4
+
+/**
+ * struct cti - cross trigger interface struct
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out_for_irq: triger out number which will cause
+ * ? ? the @irq happen
+ *
+ * cti struct used to operate cti registers.
+ */
+struct cti {
+ ? ? ? void *base;
+ ? ? ? int irq;
+ ? ? ? int trig_out_for_irq;
+};
+
+/**
+ * cti_init - initialize the cti instance
+ * @cti: cti instance
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out: triger out number which will cause
+ * ? ? the @irq happen
+ *
+ * called by machine code to pass the board dependent
+ * @base, @irq and @trig_out to cti.
+ */
+static inline void cti_init(struct cti *cti,
+ ? ? ? void *base, int irq, int trig_out)
+{
+ ? ? ? cti->base = base;
+ ? ? ? cti->irq ?= irq;
+ ? ? ? cti->trig_out_for_irq = trig_out;
+}
+
+/**
+ * cti_map_trigger - use the @chan to map @trig_in to @trig_out
+ * @cti: cti instance
+ * @trig_in: trigger in number
+ * @trig_out: trigger out number
+ * @channel: channel number
+ *

arch/arm/include/asm/cti.h line 91

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ * This function maps one trigger in of @trig_in to one trigger
+ * out of @trig_out using the channel @chan.
+ */
+static inline void cti_map_trigger(struct cti *cti,
+ ? ? ? int trig_in, int trig_out, int chan)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + CTIINEN + trig_in * 4);

Rather use 'void __iomem *' type for the __raw_readl and __raw_writel functions. Idem for the other occurences here below.

Quoted 52 lines
arch/arm/include/asm/cti.h new file +52 -0
+ ? ? ? val |= 1 << chan;
+ ? ? ? __raw_writel(val, base + CTIINEN + trig_in * 4);
+
+ ? ? ? val = __raw_readl(base + CTIOUTEN + trig_out * 4);
+ ? ? ? val |= 1 << chan;
+ ? ? ? __raw_writel(val, base + CTIOUTEN + trig_out * 4);
+}
+
+/**
+ * cti_enable - enable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_enable(struct cti *cti)
+{
+ ? ? ? __raw_writel(0x1, cti->base);
+}
+
+/**
+ * cti_disable - disable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_disable(struct cti *cti)
+{
+ ? ? ? __raw_writel(0, cti->base);
+}
+
+/**
+ * cti_irq_ack - clear the cti irq
+ * @cti: cti instance
+ *
+ * clear the cti irq
+ */
+static inline void cti_irq_ack(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + CTIINTACK);
+ ? ? ? val |= 1 << cti->trig_out_for_irq;
+ ? ? ? __raw_writel(val, base + CTIINTACK);
+}
+
+/**
+ * cti_unlock - unlock cti module
+ * @cti: cti instance
+ *
+ * unlock the cti module, or else any writes to the cti
+ * module is not allowed.

arch/arm/include/asm/cti.h

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ */
+static inline void cti_unlock(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + LOCKSTATUS);
+
+ ? ? ? if (val & 1) {
+ ? ? ? ? ? ? ? val = 0xC5ACCE55;

Could this be defined as a macro?

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ ? ? ? ? ? ? ? __raw_writel(val, base + LOCKACCESS);
+ ? ? ? }
+}
+
+/**
+ * cti_lock - lock cti module
+ * @cti: cti instance
+ *
+ * lock the cti module, so any writes to the cti
+ * module will be not allowed.

arch/arm/include/asm/cti.h

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ */
+static inline void cti_lock(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + LOCKSTATUS);
+
+ ? ? ? if (!(val & 1)) {
+ ? ? ? ? ? ? ? val = ~0xC5ACCE55;

Idem

Quoted 6 lines
arch/arm/include/asm/cti.h new file +4 -1
+ ? ? ? ? ? ? ? __raw_writel(val, base + LOCKACCESS);
+ ? ? ? }
+}
+#endif
--

1.7.3

Minor comments: checkpatch throws away some warnings:

WARNING: please, no space before tabs
#74: FILE: arch/arm/include/asm/cti.h:10:
+ * ^IEmbedded Cross Trigger Revision: r0p0$

WARNING: please, no space before tabs
#100: FILE: arch/arm/include/asm/cti.h:36:
+ * ^ICoreSight v1.0 Architecture Specification$

WARNING: please, no space before tabs
#110: FILE: arch/arm/include/asm/cti.h:46:
+ * ^Ithe @irq happen$

WARNING: please, no space before tabs
#126: FILE: arch/arm/include/asm/cti.h:62:
+ * ^Ithe @irq happen$

total: 0 errors, 4 warnings, 177 lines checked

Regards,
Jean

Quoted 7 lines

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#3 lore raw

PATCH v3 1/3 arm: introduce cross trigger interface helpers

Sorry forgot the ack:

Thanks,
Jean

Quoted 238 lines · Jean Pihet
Quoted 99 lines · On Thu, Mar 3, 2011 at 11:53 AM, ?<[email protected]> wrote:

From: Ming Lei <[email protected]>

OMAP4 uses cross trigger interface(CTI) to route
performance monitor irq to GIC, so introduce cti
helpers to make access for cti easily.

---
?arch/arm/include/asm/cti.h | ?177 ++++++++++++++++++++++++++++++++++++++++++++ ?1 files changed, 177 insertions(+), 0 deletions(-)
?create mode 100644 arch/arm/include/asm/cti.h

arch/arm/include/asm/cti.h new file +81 -0
new file mode 100644
index 0000000..48f173a
@@ -0,0 +1,177 @@
+/*
+ * ?arch/arm/include/asm/cti.h
+ */
+#ifndef __ASMARM_CTI_H
+#define __ASMARM_CTI_H
+
+#include ? ? ? <asm/io.h>
+
+/*The registers' definition is from section 3.2 of
+ * ? ? Embedded Cross Trigger Revision: r0p0
+ **/
+#define ? ? ? ? ? ? ? ?CTICONTROL ? ? ? ? ? ? ?0x000
+#define ? ? ? ? ? ? ? ?CTISTATUS ? ? ? ? ? ? ? 0x004
+#define ? ? ? ? ? ? ? ?CTILOCK ? ? ? ? ? ? ? ? 0x008
+#define ? ? ? ? ? ? ? ?CTIPROTECTION ? ? ? ? ? 0x00C
+#define ? ? ? ? ? ? ? ?CTIINTACK ? ? ? ? ? ? ? 0x010
+#define ? ? ? ? ? ? ? ?CTIAPPSET ? ? ? ? ? ? ? 0x014
+#define ? ? ? ? ? ? ? ?CTIAPPCLEAR ? ? ? ? ? ? 0x018
+#define ? ? ? ? ? ? ? ?CTIAPPPULSE ? ? ? ? ? ? 0x01c
+#define ? ? ? ? ? ? ? ?CTIINEN ? ? ? ? ? ? ? ? 0x020
+#define ? ? ? ? ? ? ? ?CTIOUTEN ? ? ? ? ? ? ? ?0x0A0
+#define ? ? ? ? ? ? ? ?CTITRIGINSTATUS ? ? ? ? 0x130
+#define ? ? ? ? ? ? ? ?CTITRIGOUTSTATUS ? ? ? ?0x134
+#define ? ? ? ? ? ? ? ?CTICHINSTATUS ? ? ? ? ? 0x138
+#define ? ? ? ? ? ? ? ?CTICHOUTSTATUS ? ? ? ? ?0x13c
+#define ? ? ? ? ? ? ? ?CTIPERIPHID0 ? ? ? ? ? ?0xFE0
+#define ? ? ? ? ? ? ? ?CTIPERIPHID1 ? ? ? ? ? ?0xFE4
+#define ? ? ? ? ? ? ? ?CTIPERIPHID2 ? ? ? ? ? ?0xFE8
+#define ? ? ? ? ? ? ? ?CTIPERIPHID3 ? ? ? ? ? ?0xFEC
+#define ? ? ? ? ? ? ? ?CTIPCELLID0 ? ? ? ? ? ? 0xFF0
+#define ? ? ? ? ? ? ? ?CTIPCELLID1 ? ? ? ? ? ? 0xFF4
+#define ? ? ? ? ? ? ? ?CTIPCELLID2 ? ? ? ? ? ? 0xFF8
+#define ? ? ? ? ? ? ? ?CTIPCELLID3 ? ? ? ? ? ? 0xFFC
+
+/*The two below are from section 3.6.4 of
+ * ? ? CoreSight v1.0 Architecture Specification
+ **/
+#define ? ? ? ? ? ? ? ?LOCKACCESS ? ? ? ? ? ? ?0xFB0
+#define ? ? ? ? ? ? ? ?LOCKSTATUS ? ? ? ? ? ? ?0xFB4
+
+/**
+ * struct cti - cross trigger interface struct
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out_for_irq: triger out number which will cause
+ * ? ? the @irq happen
+ *
+ * cti struct used to operate cti registers.
+ */
+struct cti {
+ ? ? ? void *base;
+ ? ? ? int irq;
+ ? ? ? int trig_out_for_irq;
+};
+
+/**
+ * cti_init - initialize the cti instance
+ * @cti: cti instance
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out: triger out number which will cause
+ * ? ? the @irq happen
+ *
+ * called by machine code to pass the board dependent
+ * @base, @irq and @trig_out to cti.
+ */
+static inline void cti_init(struct cti *cti,
+ ? ? ? void *base, int irq, int trig_out)
+{
+ ? ? ? cti->base = base;
+ ? ? ? cti->irq ?= irq;
+ ? ? ? cti->trig_out_for_irq = trig_out;
+}
+
+/**
+ * cti_map_trigger - use the @chan to map @trig_in to @trig_out
+ * @cti: cti instance
+ * @trig_in: trigger in number
+ * @trig_out: trigger out number
+ * @channel: channel number
+ *

arch/arm/include/asm/cti.h line 91

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ * This function maps one trigger in of @trig_in to one trigger
+ * out of @trig_out using the channel @chan.
+ */
+static inline void cti_map_trigger(struct cti *cti,
+ ? ? ? int trig_in, int trig_out, int chan)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + CTIINEN + trig_in * 4);

Rather use 'void __iomem *' type for the __raw_readl and __raw_writel functions. Idem for the other occurences here below.

Quoted 52 lines
arch/arm/include/asm/cti.h new file +52 -0
+ ? ? ? val |= 1 << chan;
+ ? ? ? __raw_writel(val, base + CTIINEN + trig_in * 4);
+
+ ? ? ? val = __raw_readl(base + CTIOUTEN + trig_out * 4);
+ ? ? ? val |= 1 << chan;
+ ? ? ? __raw_writel(val, base + CTIOUTEN + trig_out * 4);
+}
+
+/**
+ * cti_enable - enable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_enable(struct cti *cti)
+{
+ ? ? ? __raw_writel(0x1, cti->base);
+}
+
+/**
+ * cti_disable - disable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_disable(struct cti *cti)
+{
+ ? ? ? __raw_writel(0, cti->base);
+}
+
+/**
+ * cti_irq_ack - clear the cti irq
+ * @cti: cti instance
+ *
+ * clear the cti irq
+ */
+static inline void cti_irq_ack(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + CTIINTACK);
+ ? ? ? val |= 1 << cti->trig_out_for_irq;
+ ? ? ? __raw_writel(val, base + CTIINTACK);
+}
+
+/**
+ * cti_unlock - unlock cti module
+ * @cti: cti instance
+ *
+ * unlock the cti module, or else any writes to the cti
+ * module is not allowed.

arch/arm/include/asm/cti.h

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ */
+static inline void cti_unlock(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + LOCKSTATUS);
+
+ ? ? ? if (val & 1) {
+ ? ? ? ? ? ? ? val = 0xC5ACCE55;

Could this be defined as a macro?

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ ? ? ? ? ? ? ? __raw_writel(val, base + LOCKACCESS);
+ ? ? ? }
+}
+
+/**
+ * cti_lock - lock cti module
+ * @cti: cti instance
+ *
+ * lock the cti module, so any writes to the cti
+ * module will be not allowed.

arch/arm/include/asm/cti.h

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ */
+static inline void cti_lock(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + LOCKSTATUS);
+
+ ? ? ? if (!(val & 1)) {
+ ? ? ? ? ? ? ? val = ~0xC5ACCE55;

Idem

Quoted 6 lines
arch/arm/include/asm/cti.h new file +4 -1
+ ? ? ? ? ? ? ? __raw_writel(val, base + LOCKACCESS);
+ ? ? ? }
+}
+#endif
--

1.7.3

Minor comments: checkpatch throws away some warnings:

WARNING: please, no space before tabs
#74: FILE: arch/arm/include/asm/cti.h:10:
+ * ^IEmbedded Cross Trigger Revision: r0p0$

WARNING: please, no space before tabs
#100: FILE: arch/arm/include/asm/cti.h:36:
+ * ^ICoreSight v1.0 Architecture Specification$

WARNING: please, no space before tabs
#110: FILE: arch/arm/include/asm/cti.h:46:
+ * ^Ithe @irq happen$

WARNING: please, no space before tabs
#126: FILE: arch/arm/include/asm/cti.h:62:
+ * ^Ithe @irq happen$

total: 0 errors, 4 warnings, 177 lines checked

Regards,
Jean

Quoted 7 lines

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

author
#4 lore raw

PATCH v3 1/3 arm: introduce cross trigger interface helpers

In reply to Jean Pihet

Hi Jean,

2011/3/7 Jean Pihet <[email protected]>:

Quoted 9 lines

Review

Quoted 7 lines
(quoted diff) +7 -0
+static inline void cti_map_trigger(struct cti *cti,
+ ? ? ? int trig_in, int trig_out, int chan)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + CTIINEN + trig_in * 4);

Rather use 'void __iomem *' type for the __raw_readl and __raw_writel functions. Idem for the other occurences here below.

Will do it.

Quoted 10 lines

Review

Quoted 9 lines
(quoted diff) +9 -0
+static inline void cti_unlock(struct cti *cti)
+{
+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;
+
+ ? ? ? val = __raw_readl(base + LOCKSTATUS);
+
+ ? ? ? if (val & 1) {
+ ? ? ? ? ? ? ? val = 0xC5ACCE55;

Could this be defined as a macro?

This is even hard-coded in ECT spec, so not needed to define as macro.

Quoted 14 lines
Quoted 14 lines

+ ? ? ? ? ? ? ? __raw_writel(val, base + LOCKACCESS);
+ ? ? ? }

arch/arm/include/asm/cti.h new file +11 -0
+}
+
+/**
+ * cti_lock - lock cti module
+ * @cti: cti instance
+ *
+ * lock the cti module, so any writes to the cti
+ * module will be not allowed.
+ */
+static inline void cti_lock(struct cti *cti)
+{
Quoted 8 lines

Review

Quoted 7 lines

+ ? ? ? void *base = cti->base;
+ ? ? ? unsigned long val;

(quoted diff) +5 -0
+
+ ? ? ? val = __raw_readl(base + LOCKSTATUS);
+
+ ? ? ? if (!(val & 1)) {
+ ? ? ? ? ? ? ? val = ~0xC5ACCE55;

Idem

See above.

thanks,

Signature · 1 line
Lei Ming
#5 lore raw

PATCH v3 1/3 arm: introduce cross trigger interface helpers

In reply to tom.leiming at gmail.com

Ming Lei,
Some comments below

Quoted 30 lines

-----Original Message-----
From: linux-arm-kernel-bounces at lists.infradead.org [mailto:linux- arm-kernel-bounces at lists.infradead.org] On Behalf Of tom.leiming at gmail.com
Sent: Thursday, March 03, 2011 4:24 PM
To: linux at arm.linux.org.uk
Cc: Ming Lei; will.deacon at arm.com; linux-arm-
kernel at lists.infradead.org
Subject: [patch v3 1/3] arm: introduce cross trigger interface helpers

From: Ming Lei <[email protected]>

OMAP4 uses cross trigger interface(CTI) to route
performance monitor irq to GIC, so introduce cti
helpers to make access for cti easily.

---
 arch/arm/include/asm/cti.h |  177
++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 177 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/include/asm/cti.h
arch/arm/include/asm/cti.h new file +0 -0
new file mode 100644
index 0000000..48f173a

arch/arm/include/asm/cti.h line 3

Quoted 3 lines
arch/arm/include/asm/cti.h new file +3 -0
@@ -0,0 +1,177 @@
+/*
+ *  arch/arm/include/asm/cti.h
+ */

In general the file name path doesn't give much and rather difficult to maintain when file are moved around. You can drop above path and may be add some text if you like.

arch/arm/include/asm/cti.h line 11

Quoted 8 lines
arch/arm/include/asm/cti.h new file +8 -0
+#ifndef __ASMARM_CTI_H
+#define __ASMARM_CTI_H
+
+#include	<asm/io.h>
+
+/*The registers' definition is from section 3.2 of
+ * 	Embedded Cross Trigger Revision: r0p0
+ **/

Watch out for commenting style.

Quoted 16 lines
arch/arm/include/asm/cti.h new file +16 -0
+#define		CTICONTROL		0x000
+#define		CTISTATUS		0x004
+#define		CTILOCK			0x008
+#define		CTIPROTECTION		0x00C
+#define		CTIINTACK		0x010
+#define		CTIAPPSET		0x014
+#define		CTIAPPCLEAR		0x018
+#define		CTIAPPPULSE		0x01c
+#define		CTIINEN			0x020
+#define		CTIOUTEN		0x0A0
+#define		CTITRIGINSTATUS		0x130
+#define		CTITRIGOUTSTATUS	0x134
+#define		CTICHINSTATUS		0x138
+#define		CTICHOUTSTATUS		0x13c
+#define		CTIPERIPHID0		0xFE0
+#define		CTIPERIPHID1		0xFE4

arch/arm/include/asm/cti.h line 37

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+#define		CTIPERIPHID2		0xFE8
+#define		CTIPERIPHID3		0xFEC
+#define		CTIPCELLID0		0xFF0
+#define		CTIPCELLID1		0xFF4
+#define		CTIPCELLID2		0xFF8
+#define		CTIPCELLID3		0xFFC
+
+/*The two below are from section 3.6.4 of
+ * 	CoreSight v1.0 Architecture Specification
+ **/

Ditto

Quoted 41 lines
arch/arm/include/asm/cti.h new file +41 -0
+#define		LOCKACCESS		0xFB0
+#define		LOCKSTATUS		0xFB4
+
+/**
+ * struct cti - cross trigger interface struct
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out_for_irq: triger out number which will cause
+ * 	the @irq happen
+ *
+ * cti struct used to operate cti registers.
+ */
+struct cti {
+	void *base;
+	int irq;
+	int trig_out_for_irq;
+};
+
+/**
+ * cti_init - initialize the cti instance
+ * @cti: cti instance
+ * @base: mapped virtual address for the cti base
+ * @irq: irq number for the cti
+ * @trig_out: triger out number which will cause
+ * 	the @irq happen
+ *
+ * called by machine code to pass the board dependent
+ * @base, @irq and @trig_out to cti.
+ */
+static inline void cti_init(struct cti *cti,
+	void *base, int irq, int trig_out)
+{
+	cti->base = base;
+	cti->irq  = irq;
+	cti->trig_out_for_irq = trig_out;
+}
+
+/**
+ * cti_map_trigger - use the @chan to map @trig_in to @trig_out
+ * @cti: cti instance
+ * @trig_in: trigger in number

arch/arm/include/asm/cti.h line 88

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ * @trig_out: trigger out number
+ * @channel: channel number
+ *
+ * This function maps one trigger in of @trig_in to one trigger
+ * out of @trig_out using the channel @chan.
+ */
+static inline void cti_map_trigger(struct cti *cti,
+	int trig_in, int trig_out, int chan)
+{
+	void *base = cti->base;

s/ void *base / void __iomem *base

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+	unsigned long val;
+
+	val = __raw_readl(base + CTIINEN + trig_in * 4);
+	val |= 1 << chan;
+	__raw_writel(val, base + CTIINEN + trig_in * 4);
+
+	val = __raw_readl(base + CTIOUTEN + trig_out * 4);
+	val |= 1 << chan;
+	__raw_writel(val, base + CTIOUTEN + trig_out * 4);
+}

arch/arm/include/asm/cti.h line 108

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+
+/**
+ * cti_enable - enable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_enable(struct cti *cti)
+{
+	__raw_writel(0x1, cti->base);

Even though base address points to CTICONTROL you
should add that.
__raw_writel(0x1, cti->base + CTICONTROL);

arch/arm/include/asm/cti.h line 119

Quoted 11 lines
arch/arm/include/asm/cti.h new file +11 -0
+}
+
+/**
+ * cti_disable - disable the cti module
+ * @cti: cti instance
+ *
+ * enable the cti module
+ */
+static inline void cti_disable(struct cti *cti)
+{
+	__raw_writel(0, cti->base);

__raw_writel(0x0, cti->base + CTICONTROL);

Quoted 5 lines
arch/arm/include/asm/cti.h new file +5 -0
+}
+
+/**
+ * cti_irq_ack - clear the cti irq
+ * @cti: cti instance

arch/arm/include/asm/cti.h line 134

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ *
+ * clear the cti irq
+ */
+static inline void cti_irq_ack(struct cti *cti)
+{
+	void *base = cti->base;
+	unsigned long val;
+
+	val = __raw_readl(base + CTIINTACK);
+	val |= 1 << cti->trig_out_for_irq;

You could use
BIT(cti->trig_out_for_irq)

arch/arm/include/asm/cti.h line 147

Quoted 13 lines
arch/arm/include/asm/cti.h new file +13 -0
+	__raw_writel(val, base + CTIINTACK);
+}
+
+/**
+ * cti_unlock - unlock cti module
+ * @cti: cti instance
+ *
+ * unlock the cti module, or else any writes to the cti
+ * module is not allowed.
+ */
+static inline void cti_unlock(struct cti *cti)
+{
+	void *base = cti->base;

s/ void *base / void __iomem *base

arch/arm/include/asm/cti.h line 153

Quoted 6 lines
arch/arm/include/asm/cti.h new file +6 -0
+	unsigned long val;
+
+	val = __raw_readl(base + LOCKSTATUS);
+
+	if (val & 1) {
+		val = 0xC5ACCE55;

Define a macro for "0xC5ACCE55" with some comments please.

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+		__raw_writel(val, base + LOCKACCESS);
+	}
+}
+
+/**
+ * cti_lock - lock cti module
+ * @cti: cti instance
+ *
+ * lock the cti module, so any writes to the cti
+ * module will be not allowed.

arch/arm/include/asm/cti.h line 173

Quoted 10 lines
arch/arm/include/asm/cti.h new file +10 -0
+ */
+static inline void cti_lock(struct cti *cti)
+{
+	void *base = cti->base;
+	unsigned long val;
+
+	val = __raw_readl(base + LOCKSTATUS);
+
+	if (!(val & 1)) {
+		val = ~0xC5ACCE55;

Ditto

Quoted 12 lines
arch/arm/include/asm/cti.h new file +4 -1
+		__raw_writel(val, base + LOCKACCESS);
+	}
+}
+#endif
--

1.7.3

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#6 lore raw

PATCH v3 2/3 arm: pmu: allow platform specific irq enable/disable handling

In reply to tom.leiming at gmail.com

From: Ming Lei <[email protected]>

This patch introduces .enable_irq and .disable_irq into struct arm_pmu_platdata, so platform specific irq enablement can be handled after request_irq, and platform specific irq disablement can be handled before free_irq.

This patch is for support of pmu irq routed from CTI on omap4.

---
 arch/arm/include/asm/pmu.h   |   15 ++++++++++++---
 arch/arm/kernel/perf_event.c |   15 ++++++++++++---
 2 files changed, 24 insertions(+), 6 deletions(-)
arch/arm/include/asm/pmu.h +12 -3
index 7544ce6..e50c542 100644
@@ -22,13 +22,22 @@ enum arm_pmu_type {
 /*
  * struct arm_pmu_platdata - ARM PMU platform data
  *
- * @handle_irq: an optional handler which will be called from the interrupt and
- * passed the address of the low level handler, and can be used to implement
- * any platform specific handling before or after calling it.
+ * @handle_irq: an optional handler which will be called from the
+ * 	interrupt and passed the address of the low level handler,
+ * 	and can be used to implement any platform specific handling
+ * 	before or after calling it.
+ * @enable_irq: an optional handler which will be called after
+ * 	request_irq and be used to handle some platform specific
+ * 	irq enablement
+ * @disable_irq: an optional handler which will be called before
+ * 	free_irq and be used to handle some platform specific
+ * 	irq disablement
  */
 struct arm_pmu_platdata {
 	irqreturn_t (*handle_irq)(int irq, void *dev,
 				  irq_handler_t pmu_handler);
+	void (*enable_irq)(int irq);
+	void (*disable_irq)(int irq);
 };
 
 #ifdef CONFIG_CPU_HAS_PMU
arch/arm/kernel/perf_event.c +12 -3
index 22e194eb..61ff471 100644
@@ -422,14 +422,18 @@ armpmu_reserve_hardware(void)
 			pr_warning("unable to request IRQ%d for ARM perf "
 				"counters\n", irq);
 			break;
-		}
+		} else if (plat->enable_irq)
+			plat->enable_irq(irq);
 	}
 
 	if (err) {
 		for (i = i - 1; i >= 0; --i) {
 			irq = platform_get_irq(pmu_device, i);
-			if (irq >= 0)
+			if (irq >= 0) {
+				if (plat->disable_irq)
+					plat->disable_irq(irq);
 				free_irq(irq, NULL);
+			}
 		}
 		release_pmu(pmu_device);
 		pmu_device = NULL;
@@ -442,11 +446,16 @@ static void
 armpmu_release_hardware(void)
 {
 	int i, irq;
+	struct arm_pmu_platdata *plat =
+		dev_get_platdata(&pmu_device->dev);
 
 	for (i = pmu_device->num_resources - 1; i >= 0; --i) {
 		irq = platform_get_irq(pmu_device, i);
-		if (irq >= 0)
+		if (irq >= 0) {
+			if (plat->disable_irq)
+				plat->disable_irq(irq);
 			free_irq(irq, NULL);
+		}
 	}
 	armpmu->stop();
 
Signature · 1 line
1.7.3
#7 lore raw

PATCH v3 2/3 arm: pmu: allow platform specific irq enable/disable handling

Quoted 11 lines · On Thu, Mar 3, 2011 at 11:53 AM, <[email protected]> wrote:

From: Ming Lei <[email protected]>

This patch introduces .enable_irq and .disable_irq into struct arm_pmu_platdata, so platform specific irq enablement can be handled after request_irq, and platform specific irq disablement can be handled before free_irq.

This patch is for support of ?pmu irq routed from CTI on omap4.

Thanks,
Jean

Quoted 87 lines

---
?arch/arm/include/asm/pmu.h ? | ? 15 ++++++++++++--- ?arch/arm/kernel/perf_event.c | ? 15 ++++++++++++--- ?2 files changed, 24 insertions(+), 6 deletions(-)

arch/arm/include/asm/pmu.h +0 -0
index 7544ce6..e50c542 100644
@@ -22,13 +22,22 @@ enum arm_pmu_type {

?/*
?* struct arm_pmu_platdata - ARM PMU platform data
?*
- * @handle_irq: an optional handler which will be called from the interrupt and
- * passed the address of the low level handler, and can be used to implement
- * any platform specific handling before or after calling it.
+ * @handle_irq: an optional handler which will be called from the
+ * ? ? interrupt and passed the address of the low level handler,
+ * ? ? and can be used to implement any platform specific handling
+ * ? ? before or after calling it.
+ * @enable_irq: an optional handler which will be called after
+ * ? ? request_irq and be used to handle some platform specific
+ * ? ? irq enablement
+ * @disable_irq: an optional handler which will be called before
+ * ? ? free_irq and be used to handle some platform specific
+ * ? ? irq disablement
?*/
?struct arm_pmu_platdata {
? ? ? ?irqreturn_t (*handle_irq)(int irq, void *dev,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?irq_handler_t pmu_handler);
+ ? ? ? void (*enable_irq)(int irq);
+ ? ? ? void (*disable_irq)(int irq);
?};

?#ifdef CONFIG_CPU_HAS_PMU

arch/arm/kernel/perf_event.c +0 -0
index 22e194eb..61ff471 100644
@@ -422,14 +422,18 @@ armpmu_reserve_hardware(void)

? ? ? ? ? ? ? ? ? ? ? ?pr_warning("unable to request IRQ%d for ARM perf " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"counters\n", irq);
? ? ? ? ? ? ? ? ? ? ? ?break;
- ? ? ? ? ? ? ? }
+ ? ? ? ? ? ? ? } else if (plat->enable_irq)
+ ? ? ? ? ? ? ? ? ? ? ? plat->enable_irq(irq);
? ? ? ?}

? ? ? ?if (err) {
? ? ? ? ? ? ? ?for (i = i - 1; i >= 0; --i) {
? ? ? ? ? ? ? ? ? ? ? ?irq = platform_get_irq(pmu_device, i);
- ? ? ? ? ? ? ? ? ? ? ? if (irq >= 0)
+ ? ? ? ? ? ? ? ? ? ? ? if (irq >= 0) {
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (plat->disable_irq)
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? plat->disable_irq(irq); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?free_irq(irq, NULL);
+ ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?release_pmu(pmu_device);
? ? ? ? ? ? ? ?pmu_device = NULL;

arch/arm/kernel/perf_event.c +6 -2
@@ -442,11 +446,16 @@ static void
 ?armpmu_release_hardware(void)
 ?{
 ? ? ? ?int i, irq;
+ ? ? ? struct arm_pmu_platdata *plat =
+ ? ? ? ? ? ? ? dev_get_platdata(&pmu_device->dev);
 
 ? ? ? ?for (i = pmu_device->num_resources - 1; i >= 0; --i) {
 ? ? ? ? ? ? ? ?irq = platform_get_irq(pmu_device, i);
- ? ? ? ? ? ? ? if (irq >= 0)
+ ? ? ? ? ? ? ? if (irq >= 0) {
+ ? ? ? ? ? ? ? ? ? ? ? if (plat->disable_irq)
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? plat->disable_irq(irq);
 ? ? ? ? ? ? ? ? ? ? ? ?free_irq(irq, NULL);
+ ? ? ? ? ? ? ? }
 ? ? ? ?}
 ? ? ? ?armpmu->stop();
 
--

1.7.3

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#8 lore raw

PATCH v3 2/3 arm: pmu: allow platform specific irq enable/disable handling

Some minor comments: checkpatch issues some warnings:

WARNING: please, no space before tabs
#76: FILE: arch/arm/include/asm/pmu.h:26:
+ * ^Iinterrupt and passed the address of the low level handler,$

WARNING: please, no space before tabs
#77: FILE: arch/arm/include/asm/pmu.h:27:
+ * ^Iand can be used to implement any platform specific handling$

WARNING: please, no space before tabs
#78: FILE: arch/arm/include/asm/pmu.h:28:
+ * ^Ibefore or after calling it.$

WARNING: please, no space before tabs
#80: FILE: arch/arm/include/asm/pmu.h:30:
+ * ^Irequest_irq and be used to handle some platform specific$

WARNING: please, no space before tabs
#81: FILE: arch/arm/include/asm/pmu.h:31:
+ * ^Iirq enablement$

WARNING: please, no space before tabs
#83: FILE: arch/arm/include/asm/pmu.h:33:
+ * ^Ifree_irq and be used to handle some platform specific$

WARNING: please, no space before tabs
#84: FILE: arch/arm/include/asm/pmu.h:34:
+ * ^Iirq disablement$

total: 0 errors, 7 warnings, 62 lines checked

Thanks,
Jean

Quoted 106 lines · Jean Pihet
Quoted 11 lines · On Thu, Mar 3, 2011 at 11:53 AM, ?<[email protected]> wrote:

From: Ming Lei <[email protected]>

This patch introduces .enable_irq and .disable_irq into struct arm_pmu_platdata, so platform specific irq enablement can be handled after request_irq, and platform specific irq disablement can be handled before free_irq.

This patch is for support of ?pmu irq routed from CTI on omap4.

Thanks,
Jean

Quoted 87 lines

---
?arch/arm/include/asm/pmu.h ? | ? 15 ++++++++++++--- ?arch/arm/kernel/perf_event.c | ? 15 ++++++++++++--- ?2 files changed, 24 insertions(+), 6 deletions(-)

arch/arm/include/asm/pmu.h +0 -0
index 7544ce6..e50c542 100644
@@ -22,13 +22,22 @@ enum arm_pmu_type {

?/*
?* struct arm_pmu_platdata - ARM PMU platform data
?*
- * @handle_irq: an optional handler which will be called from the interrupt and
- * passed the address of the low level handler, and can be used to implement
- * any platform specific handling before or after calling it.
+ * @handle_irq: an optional handler which will be called from the
+ * ? ? interrupt and passed the address of the low level handler,
+ * ? ? and can be used to implement any platform specific handling
+ * ? ? before or after calling it.
+ * @enable_irq: an optional handler which will be called after
+ * ? ? request_irq and be used to handle some platform specific
+ * ? ? irq enablement
+ * @disable_irq: an optional handler which will be called before
+ * ? ? free_irq and be used to handle some platform specific
+ * ? ? irq disablement
?*/
?struct arm_pmu_platdata {
? ? ? ?irqreturn_t (*handle_irq)(int irq, void *dev,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?irq_handler_t pmu_handler);
+ ? ? ? void (*enable_irq)(int irq);
+ ? ? ? void (*disable_irq)(int irq);
?};

?#ifdef CONFIG_CPU_HAS_PMU

arch/arm/kernel/perf_event.c +0 -0
index 22e194eb..61ff471 100644
@@ -422,14 +422,18 @@ armpmu_reserve_hardware(void)

? ? ? ? ? ? ? ? ? ? ? ?pr_warning("unable to request IRQ%d for ARM perf " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"counters\n", irq);
? ? ? ? ? ? ? ? ? ? ? ?break;
- ? ? ? ? ? ? ? }
+ ? ? ? ? ? ? ? } else if (plat->enable_irq)
+ ? ? ? ? ? ? ? ? ? ? ? plat->enable_irq(irq);
? ? ? ?}

? ? ? ?if (err) {
? ? ? ? ? ? ? ?for (i = i - 1; i >= 0; --i) {
? ? ? ? ? ? ? ? ? ? ? ?irq = platform_get_irq(pmu_device, i);
- ? ? ? ? ? ? ? ? ? ? ? if (irq >= 0)
+ ? ? ? ? ? ? ? ? ? ? ? if (irq >= 0) {
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (plat->disable_irq)
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? plat->disable_irq(irq); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?free_irq(irq, NULL);
+ ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?release_pmu(pmu_device);
? ? ? ? ? ? ? ?pmu_device = NULL;

arch/arm/kernel/perf_event.c +6 -2
@@ -442,11 +446,16 @@ static void
 ?armpmu_release_hardware(void)
 ?{
 ? ? ? ?int i, irq;
+ ? ? ? struct arm_pmu_platdata *plat =
+ ? ? ? ? ? ? ? dev_get_platdata(&pmu_device->dev);
 
 ? ? ? ?for (i = pmu_device->num_resources - 1; i >= 0; --i) {
 ? ? ? ? ? ? ? ?irq = platform_get_irq(pmu_device, i);
- ? ? ? ? ? ? ? if (irq >= 0)
+ ? ? ? ? ? ? ? if (irq >= 0) {
+ ? ? ? ? ? ? ? ? ? ? ? if (plat->disable_irq)
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? plat->disable_irq(irq);
 ? ? ? ? ? ? ? ? ? ? ? ?free_irq(irq, NULL);
+ ? ? ? ? ? ? ? }
 ? ? ? ?}
 ? ? ? ?armpmu->stop();
 
--

1.7.3

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#9 lore raw

PATCH v3 3/3 arm: omap4: support pmu

In reply to tom.leiming at gmail.com

From: Ming Lei <[email protected]>

This patch supports pmu irq routed from CTI, so make pmu/perf working on OMAP4.

The idea is from Woodruff Richard in the disscussion
about "Oprofile on Pandaboard / Omap4" on pandaboard at googlegroups.com.

Cc Santosh Shilimkar <[email protected]>
Cc Woodruff Richard <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc linux-omap at vger.kernel.org
---
 arch/arm/mach-omap2/devices.c              |   82 +++++++++++++++++++++++++++-
 arch/arm/plat-omap/include/plat/omap44xx.h |    2 +
 2 files changed, 81 insertions(+), 3 deletions(-)
arch/arm/mach-omap2/devices.c +79 -3
index d216976..d97bb5a 100644
@@ -22,6 +22,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 #include <asm/pmu.h>
+#include <asm/cti.h>
 
 #include <plat/tc.h>
 #include <plat/board.h>
@@ -322,20 +323,95 @@ static struct resource omap3_pmu_resource = {
 	.flags	= IORESOURCE_IRQ,
 };
 
+static struct resource omap4_pmu_resource[] = {
+	{
+		.start	= OMAP44XX_IRQ_CTI0,
+		.end	= OMAP44XX_IRQ_CTI0,
+		.flags	= IORESOURCE_IRQ,
+	},
+	{
+		.start	= OMAP44XX_IRQ_CTI1,
+		.end	= OMAP44XX_IRQ_CTI1,
+		.flags	= IORESOURCE_IRQ,
+	}
+};
+
 static struct platform_device omap_pmu_device = {
 	.name		= "arm-pmu",
 	.id		= ARM_PMU_DEVICE_CPU,
 	.num_resources	= 1,
 };
 
+static struct arm_pmu_platdata omap4_pmu_data;
+static struct cti omap4_cti[2];
+
+static void omap4_enable_cti(int irq)
+{
+	if (irq == OMAP44XX_IRQ_CTI0)
+		cti_enable(&omap4_cti[0]);
+	else if (irq == OMAP44XX_IRQ_CTI1)
+		cti_enable(&omap4_cti[1]);
+}
+
+static void omap4_disable_cti(int irq)
+{
+	if (irq == OMAP44XX_IRQ_CTI0)
+		cti_disable(&omap4_cti[0]);
+	else if (irq == OMAP44XX_IRQ_CTI1)
+		cti_disable(&omap4_cti[1]);
+}
+
+static irqreturn_t omap4_pmu_handler(int irq, void *dev, irq_handler_t handler)
+{
+	if (irq == OMAP44XX_IRQ_CTI0)
+		cti_irq_ack(&omap4_cti[0]);
+	else if (irq == OMAP44XX_IRQ_CTI1)
+		cti_irq_ack(&omap4_cti[1]);
+
+	return handler(irq, dev);
+}
+
+static void omap4_configure_pmu_irq(void)
+{
+	void __iomem *base0;
+	void __iomem *base1;
+
+	base0 = ioremap(OMAP44XX_CTI0_BASE, SZ_4K);
+	base1 = ioremap(OMAP44XX_CTI1_BASE, SZ_4K);
+	if (!base0 && !base1) {
+		pr_err("ioremap for OMAP4 CTI failed\n");
+		return;
+	}
+
+	/*configure CTI0 for pmu irq routing*/
+	cti_init(&omap4_cti[0], base0, OMAP44XX_IRQ_CTI0, 6);
+	cti_unlock(&omap4_cti[0]);
+	cti_map_trigger(&omap4_cti[0], 1, 6, 2);
+
+	/*configure CTI1 for pmu irq routing*/
+	cti_init(&omap4_cti[1], base1, OMAP44XX_IRQ_CTI1, 6);
+	cti_unlock(&omap4_cti[1]);
+	cti_map_trigger(&omap4_cti[1], 1, 6, 2);
+
+	omap4_pmu_data.handle_irq = omap4_pmu_handler;
+	omap4_pmu_data.enable_irq = omap4_enable_cti;
+	omap4_pmu_data.disable_irq = omap4_disable_cti;
+}
+
 static void omap_init_pmu(void)
 {
-	if (cpu_is_omap24xx())
+	if (cpu_is_omap24xx()) {
 		omap_pmu_device.resource = &omap2_pmu_resource;
-	else if (cpu_is_omap34xx())
+	} else if (cpu_is_omap34xx()) {
 		omap_pmu_device.resource = &omap3_pmu_resource;
-	else
+	} else if (cpu_is_omap44xx()) {
+		omap_pmu_device.resource = omap4_pmu_resource;
+		omap_pmu_device.num_resources = 2;
+		omap_pmu_device.dev.platform_data = &omap4_pmu_data;
+		omap4_configure_pmu_irq();
+	} else {
 		return;
+	}
 
 	platform_device_register(&omap_pmu_device);
 }
arch/arm/plat-omap/include/plat/omap44xx.h +2 -0
index ea2b8a6..b127a16 100644
@@ -57,5 +57,7 @@
 #define OMAP44XX_HSUSB_OHCI_BASE	(L4_44XX_BASE + 0x64800)
 #define OMAP44XX_HSUSB_EHCI_BASE	(L4_44XX_BASE + 0x64C00)
 
+#define OMAP44XX_CTI0_BASE		0x54148000
+#define OMAP44XX_CTI1_BASE		0x54149000
 #endif /* __ASM_ARCH_OMAP44XX_H */
 
Signature · 1 line
1.7.3
maintainer
#10 lore raw

PATCH v3 3/3 arm: omap4: support pmu

Quoted 5 lines · tom.leiming at gmail.com

From: Ming Lei <[email protected]>

This patch supports pmu irq routed from CTI, so make pmu/perf working on OMAP4.

Quoted 8 lines

The idea is from Woodruff Richard in the disscussion
about "Oprofile on Pandaboard / Omap4" on pandaboard at googlegroups.com.

Cc Santosh Shilimkar <[email protected]>
Cc Woodruff Richard <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc linux-omap at vger.kernel.org

You'll probably want to queue this along with the to other patches via the Russell, so:

#11 lore raw

PATCH v3 3/3 arm: omap4: support pmu

In reply to tom.leiming at gmail.com
Quoted 18 lines

-----Original Message-----
From: tom.leiming at gmail.com [mailto:tom.leiming at gmail.com]
Sent: Thursday, March 03, 2011 4:24 PM
To: linux at arm.linux.org.uk
Cc: linux-arm-kernel at lists.infradead.org; will.deacon at arm.com; Ming Lei; Santosh Shilimkar; Woodruff Richard; Tony Lindgren; linux- omap at vger.kernel.org
Subject: [patch v3 3/3] arm: omap4: support pmu

From: Ming Lei <[email protected]>

This patch supports pmu irq routed from CTI, so
make pmu/perf working on OMAP4.

The idea is from Woodruff Richard in the disscussion about "Oprofile on Pandaboard / Omap4" on pandaboard at googlegroups.com.

Quoted 6 lines
Cc Santosh Shilimkar <[email protected]>
Cc Woodruff Richard <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc linux-omap at vger.kernel.org

---

Looks good.

Quoted 133 lines
 arch/arm/mach-omap2/devices.c              |   82
+++++++++++++++++++++++++++-
 arch/arm/plat-omap/include/plat/omap44xx.h |    2 +
 2 files changed, 81 insertions(+), 3 deletions(-)
arch/arm/mach- renamed from arch/arm/mach-omap2/devices.c +0 -0

omap2/devices.c
index d216976..d97bb5a 100644

arch/arm/mach-omap2/devices.c +79 -3
@@ -22,6 +22,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 #include <asm/pmu.h>
+#include <asm/cti.h>
 
 #include <plat/tc.h>
 #include <plat/board.h>
@@ -322,20 +323,95 @@ static struct resource omap3_pmu_resource = {
 	.flags	= IORESOURCE_IRQ,
 };
 
+static struct resource omap4_pmu_resource[] = {
+	{
+		.start	= OMAP44XX_IRQ_CTI0,
+		.end	= OMAP44XX_IRQ_CTI0,
+		.flags	= IORESOURCE_IRQ,
+	},
+	{
+		.start	= OMAP44XX_IRQ_CTI1,
+		.end	= OMAP44XX_IRQ_CTI1,
+		.flags	= IORESOURCE_IRQ,
+	}
+};
+
 static struct platform_device omap_pmu_device = {
 	.name		= "arm-pmu",
 	.id		= ARM_PMU_DEVICE_CPU,
 	.num_resources	= 1,
 };
 
+static struct arm_pmu_platdata omap4_pmu_data;
+static struct cti omap4_cti[2];
+
+static void omap4_enable_cti(int irq)
+{
+	if (irq == OMAP44XX_IRQ_CTI0)
+		cti_enable(&omap4_cti[0]);
+	else if (irq == OMAP44XX_IRQ_CTI1)
+		cti_enable(&omap4_cti[1]);
+}
+
+static void omap4_disable_cti(int irq)
+{
+	if (irq == OMAP44XX_IRQ_CTI0)
+		cti_disable(&omap4_cti[0]);
+	else if (irq == OMAP44XX_IRQ_CTI1)
+		cti_disable(&omap4_cti[1]);
+}
+
+static irqreturn_t omap4_pmu_handler(int irq, void *dev,
 irq_handler_t handler)
+{
+	if (irq == OMAP44XX_IRQ_CTI0)
+		cti_irq_ack(&omap4_cti[0]);
+	else if (irq == OMAP44XX_IRQ_CTI1)
+		cti_irq_ack(&omap4_cti[1]);
+
+	return handler(irq, dev);
+}
+
+static void omap4_configure_pmu_irq(void)
+{
+	void __iomem *base0;
+	void __iomem *base1;
+
+	base0 = ioremap(OMAP44XX_CTI0_BASE, SZ_4K);
+	base1 = ioremap(OMAP44XX_CTI1_BASE, SZ_4K);
+	if (!base0 && !base1) {
+		pr_err("ioremap for OMAP4 CTI failed\n");
+		return;
+	}
+
+	/*configure CTI0 for pmu irq routing*/
+	cti_init(&omap4_cti[0], base0, OMAP44XX_IRQ_CTI0, 6);
+	cti_unlock(&omap4_cti[0]);
+	cti_map_trigger(&omap4_cti[0], 1, 6, 2);
+
+	/*configure CTI1 for pmu irq routing*/
+	cti_init(&omap4_cti[1], base1, OMAP44XX_IRQ_CTI1, 6);
+	cti_unlock(&omap4_cti[1]);
+	cti_map_trigger(&omap4_cti[1], 1, 6, 2);
+
+	omap4_pmu_data.handle_irq = omap4_pmu_handler;
+	omap4_pmu_data.enable_irq = omap4_enable_cti;
+	omap4_pmu_data.disable_irq = omap4_disable_cti;
+}
+
 static void omap_init_pmu(void)
 {
-	if (cpu_is_omap24xx())
+	if (cpu_is_omap24xx()) {
 		omap_pmu_device.resource = &omap2_pmu_resource;
-	else if (cpu_is_omap34xx())
+	} else if (cpu_is_omap34xx()) {
 		omap_pmu_device.resource = &omap3_pmu_resource;
-	else
+	} else if (cpu_is_omap44xx()) {
+		omap_pmu_device.resource = omap4_pmu_resource;
+		omap_pmu_device.num_resources = 2;
+		omap_pmu_device.dev.platform_data = &omap4_pmu_data;
+		omap4_configure_pmu_irq();
+	} else {
 		return;
+	}
 
 	platform_device_register(&omap_pmu_device);

}

arch/arm/plat-omap/include/plat/omap44xx.h +2 -1
index ea2b8a6..b127a16 100644
@@ -57,5 +57,7 @@
 #define OMAP44XX_HSUSB_OHCI_BASE	(L4_44XX_BASE + 0x64800)
 #define OMAP44XX_HSUSB_EHCI_BASE	(L4_44XX_BASE + 0x64C00)
 
+#define OMAP44XX_CTI0_BASE		0x54148000
+#define OMAP44XX_CTI1_BASE		0x54149000
 #endif /* __ASM_ARCH_OMAP44XX_H */
 
--

1.7.3

#12 lore raw

PATCH v3 3/3 arm: omap4: support pmu

Quoted 18 lines · Santosh Shilimkar
Quoted 18 lines

-----Original Message-----
From: tom.leiming at gmail.com [mailto:tom.leiming at gmail.com]
Sent: Thursday, March 03, 2011 4:24 PM
To: linux at arm.linux.org.uk
Cc: linux-arm-kernel at lists.infradead.org; will.deacon at arm.com; Ming Lei; Santosh Shilimkar; Woodruff Richard; Tony Lindgren; linux- omap at vger.kernel.org
Subject: [patch v3 3/3] arm: omap4: support pmu

From: Ming Lei <[email protected]>

This patch supports pmu irq routed from CTI, so
make pmu/perf working on OMAP4.

The idea is from Woodruff Richard in the disscussion about "Oprofile on Pandaboard / Omap4" on pandaboard at googlegroups.com.

Quoted 8 lines
Quoted 6 lines
Cc Santosh Shilimkar <[email protected]>
Cc Woodruff Richard <[email protected]>
Cc Tony Lindgren <[email protected]>
Cc linux-omap at vger.kernel.org

---

Looks good.

Great!

Thanks,
Jean

Quoted 139 lines
Quoted 132 lines

?arch/arm/mach-omap2/devices.c ? ? ? ? ? ? ?| ? 82
+++++++++++++++++++++++++++-
?arch/arm/plat-omap/include/plat/omap44xx.h | ? ?2 + ?2 files changed, 81 insertions(+), 3 deletions(-)

arch/arm/mach- renamed from arch/arm/mach-omap2/devices.c +0 -0

omap2/devices.c
index d216976..d97bb5a 100644

arch/arm/mach-omap2/devices.c +0 -0
@@ -22,6 +22,7 @@

?#include <asm/mach-types.h>
?#include <asm/mach/map.h>
?#include <asm/pmu.h>
+#include <asm/cti.h>

?#include <plat/tc.h>
?#include <plat/board.h>

arch/arm/mach-omap2/devices.c +78 -3
@@ -322,20 +323,95 @@ static struct resource omap3_pmu_resource = {
 ? ? ? .flags ?= IORESOURCE_IRQ,
 ?};
 
+static struct resource omap4_pmu_resource[] = {
+ ? ? {
+ ? ? ? ? ? ? .start ?= OMAP44XX_IRQ_CTI0,
+ ? ? ? ? ? ? .end ? ?= OMAP44XX_IRQ_CTI0,
+ ? ? ? ? ? ? .flags ?= IORESOURCE_IRQ,
+ ? ? },
+ ? ? {
+ ? ? ? ? ? ? .start ?= OMAP44XX_IRQ_CTI1,
+ ? ? ? ? ? ? .end ? ?= OMAP44XX_IRQ_CTI1,
+ ? ? ? ? ? ? .flags ?= IORESOURCE_IRQ,
+ ? ? }
+};
+
 ?static struct platform_device omap_pmu_device = {
 ? ? ? .name ? ? ? ? ? = "arm-pmu",
 ? ? ? .id ? ? ? ? ? ? = ARM_PMU_DEVICE_CPU,
 ? ? ? .num_resources ?= 1,
 ?};
 
+static struct arm_pmu_platdata omap4_pmu_data;
+static struct cti omap4_cti[2];
+
+static void omap4_enable_cti(int irq)
+{
+ ? ? if (irq == OMAP44XX_IRQ_CTI0)
+ ? ? ? ? ? ? cti_enable(&omap4_cti[0]);
+ ? ? else if (irq == OMAP44XX_IRQ_CTI1)
+ ? ? ? ? ? ? cti_enable(&omap4_cti[1]);
+}
+
+static void omap4_disable_cti(int irq)
+{
+ ? ? if (irq == OMAP44XX_IRQ_CTI0)
+ ? ? ? ? ? ? cti_disable(&omap4_cti[0]);
+ ? ? else if (irq == OMAP44XX_IRQ_CTI1)
+ ? ? ? ? ? ? cti_disable(&omap4_cti[1]);
+}
+
+static irqreturn_t omap4_pmu_handler(int irq, void *dev,
 irq_handler_t handler)
+{
+ ? ? if (irq == OMAP44XX_IRQ_CTI0)
+ ? ? ? ? ? ? cti_irq_ack(&omap4_cti[0]);
+ ? ? else if (irq == OMAP44XX_IRQ_CTI1)
+ ? ? ? ? ? ? cti_irq_ack(&omap4_cti[1]);
+
+ ? ? return handler(irq, dev);
+}
+
+static void omap4_configure_pmu_irq(void)
+{
+ ? ? void __iomem *base0;
+ ? ? void __iomem *base1;
+
+ ? ? base0 = ioremap(OMAP44XX_CTI0_BASE, SZ_4K);
+ ? ? base1 = ioremap(OMAP44XX_CTI1_BASE, SZ_4K);
+ ? ? if (!base0 && !base1) {
+ ? ? ? ? ? ? pr_err("ioremap for OMAP4 CTI failed\n");
+ ? ? ? ? ? ? return;
+ ? ? }
+
+ ? ? /*configure CTI0 for pmu irq routing*/
+ ? ? cti_init(&omap4_cti[0], base0, OMAP44XX_IRQ_CTI0, 6);
+ ? ? cti_unlock(&omap4_cti[0]);
+ ? ? cti_map_trigger(&omap4_cti[0], 1, 6, 2);
+
+ ? ? /*configure CTI1 for pmu irq routing*/
+ ? ? cti_init(&omap4_cti[1], base1, OMAP44XX_IRQ_CTI1, 6);
+ ? ? cti_unlock(&omap4_cti[1]);
+ ? ? cti_map_trigger(&omap4_cti[1], 1, 6, 2);
+
+ ? ? omap4_pmu_data.handle_irq = omap4_pmu_handler;
+ ? ? omap4_pmu_data.enable_irq = omap4_enable_cti;
+ ? ? omap4_pmu_data.disable_irq = omap4_disable_cti;
+}
+
 ?static void omap_init_pmu(void)
 ?{
- ? ? if (cpu_is_omap24xx())
+ ? ? if (cpu_is_omap24xx()) {
 ? ? ? ? ? ? ? omap_pmu_device.resource = &omap2_pmu_resource;
- ? ? else if (cpu_is_omap34xx())
+ ? ? } else if (cpu_is_omap34xx()) {
 ? ? ? ? ? ? ? omap_pmu_device.resource = &omap3_pmu_resource;
- ? ? else
+ ? ? } else if (cpu_is_omap44xx()) {
+ ? ? ? ? ? ? omap_pmu_device.resource = omap4_pmu_resource;
+ ? ? ? ? ? ? omap_pmu_device.num_resources = 2;
+ ? ? ? ? ? ? omap_pmu_device.dev.platform_data = &omap4_pmu_data;
+ ? ? ? ? ? ? omap4_configure_pmu_irq();
+ ? ? } else {
 ? ? ? ? ? ? ? return;
+ ? ? }
 
 ? ? ? platform_device_register(&omap_pmu_device);

?}

arch/arm/plat-omap/include/plat/omap44xx.h +2 -0
index ea2b8a6..b127a16 100644
@@ -57,5 +57,7 @@
 ?#define OMAP44XX_HSUSB_OHCI_BASE ? ? (L4_44XX_BASE + 0x64800)
 ?#define OMAP44XX_HSUSB_EHCI_BASE ? ? (L4_44XX_BASE + 0x64C00)
 
+#define OMAP44XX_CTI0_BASE ? ? ? ? ? 0x54148000
+#define OMAP44XX_CTI1_BASE ? ? ? ? ? 0x54149000

?#endif /* __ASM_ARCH_OMAP44XX_H */

Quoted 2 lines

--
1.7.3

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo at vger.kernel.org
More majordomo info at ?http://vger.kernel.org/majordomo-info.html

#13 lore raw

v3 cover arm: pmu: support pmu/perf on OMAP4

In reply to tom.leiming at gmail.com

Hi Tom,

Thanks for those patches, it is really useful to get this code merged in. Sorry for the late reply, I just sent the comments on the patches.

Thanks,
Jean

Quoted 34 lines · On Thu, Mar 3, 2011 at 11:53 AM, <[email protected]> wrote:

Hi,

This patches support pmu irq routed from CTI, such as implemented on OMAP4:

? ? ? ?- introduce some CTI helpers and registers' definition ? ? ? ?- introduce .enable_irq and .disable_irq into platform_data, ? ? ? ?so perf irq handler can handle irq correctly if it is ? ? ? ?routed from CTI on OMAP4
? ? ? ?- configure CTI on OMAP4 so that perf can work on OMAP4

The patches have been tested Ok on Pandaboard, and 'perf' does work after applying them.

v3:
? ? ? ?- fix typo of patch 2/3 title, pointed by Will ? ? ? ?- move cti addresses to plat/omap44xx.h, suggested by ? ? ? ?Santosh Shilimkar

v2:
? ? ? ?- move cti related code out of perf_event.c
? ? ? ?- introduce .enable_irq and .disable_irq into platform_data ? ? ? ?as suggested by Will.

v1:
? ? ? ?- rebase the patch set against 2.6.38-rc6-next-20110301, fix ? ? ? ?conflicts, which is pointed out by Will Deacon

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel