Message ID | 1555103312-28232-1-git-send-email-ynezz@true.cz (mailing list archive) |
---|---|
State | Mainlined |
Commit | a1e8783db8e0d58891681bc1e6d9ada66eae8e20 |
Headers | show |
Series | [v2] MIPS: perf: ath79: Fix perfcount IRQ assignment | expand |
On 12/04/2019 23:08, Petr Štetiar wrote: > Currently it's not possible to use perf on ath79 due to genirq flags > mismatch happening on static virtual IRQ 13 which is used for > performance counters hardware IRQ 5. > > On TP-Link Archer C7v5: > > CPU0 > 2: 0 MIPS 2 ath9k > 4: 318 MIPS 4 19000000.eth > 7: 55034 MIPS 7 timer > 8: 1236 MISC 3 ttyS0 > 12: 0 INTC 1 ehci_hcd:usb1 > 13: 0 gpio-ath79 2 keys > 14: 0 gpio-ath79 5 keys > 15: 31 AR724X PCI 1 ath10k_pci > > $ perf top > genirq: Flags mismatch irq 13. 00014c83 (mips_perf_pmu) vs. 00002003 (keys) > > On TP-Link Archer C7v4: > > CPU0 > 4: 0 MIPS 4 19000000.eth > 5: 7135 MIPS 5 1a000000.eth > 7: 98379 MIPS 7 timer > 8: 30 MISC 3 ttyS0 > 12: 90028 INTC 0 ath9k > 13: 5520 INTC 1 ehci_hcd:usb1 > 14: 4623 INTC 2 ehci_hcd:usb2 > 15: 32844 AR724X PCI 1 ath10k_pci > 16: 0 gpio-ath79 16 keys > 23: 0 gpio-ath79 23 keys > > $ perf top > genirq: Flags mismatch irq 13. 00014c80 (mips_perf_pmu) vs. 00000080 (ehci_hcd:usb1) > > This problem is happening, because currently statically assigned virtual > IRQ 13 for performance counters is not claimed during the initialization > of MIPS PMU during the bootup, so the IRQ subsystem doesn't know, that > this interrupt isn't available for further use. > > So this patch fixes the issue by simply booking hardware IRQ 5 for MIPS PMU. > > Tested-by: Kevin 'ldir' Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> > Signed-off-by: Petr Štetiar <ynezz@true.cz> Thanks for the fast turn around Acked-by: John Crispin <john@phrozen.org> > --- > > Changes since v1: > > I've incorporated two comments which I've received on IRC from blogic and > I've also reworded the commit message to match the changes in v2 of this > patch. > > * use actual hardware perfcount IRQ 5 instead of the virtual IRQ 13 > * dropped the CONFIG_PERF_EVENTS ifdef around irq_create_mapping > > arch/mips/ath79/setup.c | 6 ------ > drivers/irqchip/irq-ath79-misc.c | 11 +++++++++++ > 2 files changed, 11 insertions(+), 6 deletions(-) > > diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c > index 4a70c5d..25a5789 100644 > --- a/arch/mips/ath79/setup.c > +++ b/arch/mips/ath79/setup.c > @@ -210,12 +210,6 @@ const char *get_system_type(void) > return ath79_sys_type; > } > > -int get_c0_perfcount_int(void) > -{ > - return ATH79_MISC_IRQ(5); > -} > -EXPORT_SYMBOL_GPL(get_c0_perfcount_int); > - > unsigned int get_c0_compare_int(void) > { > return CP0_LEGACY_COMPARE_IRQ; > diff --git a/drivers/irqchip/irq-ath79-misc.c b/drivers/irqchip/irq-ath79-misc.c > index aa72907..0390603 100644 > --- a/drivers/irqchip/irq-ath79-misc.c > +++ b/drivers/irqchip/irq-ath79-misc.c > @@ -22,6 +22,15 @@ > #define AR71XX_RESET_REG_MISC_INT_ENABLE 4 > > #define ATH79_MISC_IRQ_COUNT 32 > +#define ATH79_MISC_PERF_IRQ 5 > + > +static int ath79_perfcount_irq; > + > +int get_c0_perfcount_int(void) > +{ > + return ath79_perfcount_irq; > +} > +EXPORT_SYMBOL_GPL(get_c0_perfcount_int); > > static void ath79_misc_irq_handler(struct irq_desc *desc) > { > @@ -113,6 +122,8 @@ static void __init ath79_misc_intc_domain_init( > { > void __iomem *base = domain->host_data; > > + ath79_perfcount_irq = irq_create_mapping(domain, ATH79_MISC_PERF_IRQ); > + > /* Disable and clear all interrupts */ > __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE); > __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS);
Hello, On Fri, Apr 12, 2019 at 11:08:32PM +0200, Petr Štetiar wrote: > Currently it's not possible to use perf on ath79 due to genirq flags > mismatch happening on static virtual IRQ 13 which is used for > performance counters hardware IRQ 5. > > On TP-Link Archer C7v5: > > CPU0 > 2: 0 MIPS 2 ath9k > 4: 318 MIPS 4 19000000.eth > 7: 55034 MIPS 7 timer > 8: 1236 MISC 3 ttyS0 > 12: 0 INTC 1 ehci_hcd:usb1 > 13: 0 gpio-ath79 2 keys > 14: 0 gpio-ath79 5 keys > 15: 31 AR724X PCI 1 ath10k_pci > > $ perf top > genirq: Flags mismatch irq 13. 00014c83 (mips_perf_pmu) vs. 00002003 (keys) > > On TP-Link Archer C7v4: > > CPU0 > 4: 0 MIPS 4 19000000.eth > 5: 7135 MIPS 5 1a000000.eth > 7: 98379 MIPS 7 timer > 8: 30 MISC 3 ttyS0 > 12: 90028 INTC 0 ath9k > 13: 5520 INTC 1 ehci_hcd:usb1 > 14: 4623 INTC 2 ehci_hcd:usb2 > 15: 32844 AR724X PCI 1 ath10k_pci > 16: 0 gpio-ath79 16 keys > 23: 0 gpio-ath79 23 keys > > $ perf top > genirq: Flags mismatch irq 13. 00014c80 (mips_perf_pmu) vs. 00000080 (ehci_hcd:usb1) > > This problem is happening, because currently statically assigned virtual > IRQ 13 for performance counters is not claimed during the initialization > of MIPS PMU during the bootup, so the IRQ subsystem doesn't know, that > this interrupt isn't available for further use. > > So this patch fixes the issue by simply booking hardware IRQ 5 for MIPS PMU. > > Tested-by: Kevin 'ldir' Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> > Signed-off-by: Petr Štetiar <ynezz@true.cz> > --- > > Changes since v1: > > I've incorporated two comments which I've received on IRC from blogic and > I've also reworded the commit message to match the changes in v2 of this > patch. > > * use actual hardware perfcount IRQ 5 instead of the virtual IRQ 13 > * dropped the CONFIG_PERF_EVENTS ifdef around irq_create_mapping > > arch/mips/ath79/setup.c | 6 ------ > drivers/irqchip/irq-ath79-misc.c | 11 +++++++++++ > 2 files changed, 11 insertions(+), 6 deletions(-) This change looks reasonable to me - I'd be happy to take it through mips-fixes with an ack from an irqchip driver maintainer, or I'm happy for one of them to take it if they prefer in which case: Acked-by: Paul Burton <paul.burton@mips.com> Thanks, Paul > > diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c > index 4a70c5d..25a5789 100644 > --- a/arch/mips/ath79/setup.c > +++ b/arch/mips/ath79/setup.c > @@ -210,12 +210,6 @@ const char *get_system_type(void) > return ath79_sys_type; > } > > -int get_c0_perfcount_int(void) > -{ > - return ATH79_MISC_IRQ(5); > -} > -EXPORT_SYMBOL_GPL(get_c0_perfcount_int); > - > unsigned int get_c0_compare_int(void) > { > return CP0_LEGACY_COMPARE_IRQ; > diff --git a/drivers/irqchip/irq-ath79-misc.c b/drivers/irqchip/irq-ath79-misc.c > index aa72907..0390603 100644 > --- a/drivers/irqchip/irq-ath79-misc.c > +++ b/drivers/irqchip/irq-ath79-misc.c > @@ -22,6 +22,15 @@ > #define AR71XX_RESET_REG_MISC_INT_ENABLE 4 > > #define ATH79_MISC_IRQ_COUNT 32 > +#define ATH79_MISC_PERF_IRQ 5 > + > +static int ath79_perfcount_irq; > + > +int get_c0_perfcount_int(void) > +{ > + return ath79_perfcount_irq; > +} > +EXPORT_SYMBOL_GPL(get_c0_perfcount_int); > > static void ath79_misc_irq_handler(struct irq_desc *desc) > { > @@ -113,6 +122,8 @@ static void __init ath79_misc_intc_domain_init( > { > void __iomem *base = domain->host_data; > > + ath79_perfcount_irq = irq_create_mapping(domain, ATH79_MISC_PERF_IRQ); > + > /* Disable and clear all interrupts */ > __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE); > __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS); > -- > 1.9.1 >
Hi Paul, On 15/04/2019 18:28, Paul Burton wrote: > Hello, > > On Fri, Apr 12, 2019 at 11:08:32PM +0200, Petr Štetiar wrote: >> Currently it's not possible to use perf on ath79 due to genirq flags >> mismatch happening on static virtual IRQ 13 which is used for >> performance counters hardware IRQ 5. >> >> On TP-Link Archer C7v5: >> >> CPU0 >> 2: 0 MIPS 2 ath9k >> 4: 318 MIPS 4 19000000.eth >> 7: 55034 MIPS 7 timer >> 8: 1236 MISC 3 ttyS0 >> 12: 0 INTC 1 ehci_hcd:usb1 >> 13: 0 gpio-ath79 2 keys >> 14: 0 gpio-ath79 5 keys >> 15: 31 AR724X PCI 1 ath10k_pci >> >> $ perf top >> genirq: Flags mismatch irq 13. 00014c83 (mips_perf_pmu) vs. 00002003 (keys) >> >> On TP-Link Archer C7v4: >> >> CPU0 >> 4: 0 MIPS 4 19000000.eth >> 5: 7135 MIPS 5 1a000000.eth >> 7: 98379 MIPS 7 timer >> 8: 30 MISC 3 ttyS0 >> 12: 90028 INTC 0 ath9k >> 13: 5520 INTC 1 ehci_hcd:usb1 >> 14: 4623 INTC 2 ehci_hcd:usb2 >> 15: 32844 AR724X PCI 1 ath10k_pci >> 16: 0 gpio-ath79 16 keys >> 23: 0 gpio-ath79 23 keys >> >> $ perf top >> genirq: Flags mismatch irq 13. 00014c80 (mips_perf_pmu) vs. 00000080 (ehci_hcd:usb1) >> >> This problem is happening, because currently statically assigned virtual >> IRQ 13 for performance counters is not claimed during the initialization >> of MIPS PMU during the bootup, so the IRQ subsystem doesn't know, that >> this interrupt isn't available for further use. >> >> So this patch fixes the issue by simply booking hardware IRQ 5 for MIPS PMU. >> >> Tested-by: Kevin 'ldir' Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> >> Signed-off-by: Petr Štetiar <ynezz@true.cz> >> --- >> >> Changes since v1: >> >> I've incorporated two comments which I've received on IRC from blogic and >> I've also reworded the commit message to match the changes in v2 of this >> patch. >> >> * use actual hardware perfcount IRQ 5 instead of the virtual IRQ 13 >> * dropped the CONFIG_PERF_EVENTS ifdef around irq_create_mapping >> >> arch/mips/ath79/setup.c | 6 ------ >> drivers/irqchip/irq-ath79-misc.c | 11 +++++++++++ >> 2 files changed, 11 insertions(+), 6 deletions(-) > > This change looks reasonable to me - I'd be happy to take it through > mips-fixes with an ack from an irqchip driver maintainer, or I'm happy > for one of them to take it if they prefer in which case: > > Acked-by: Paul Burton <paul.burton@mips.com> Please take it though the MIPS tree with my Acked-by: Marc Zyngier <marc.zyngier@arm.com> Thanks, M.
Hello, Petr Štetiar wrote: > Currently it's not possible to use perf on ath79 due to genirq flags > mismatch happening on static virtual IRQ 13 which is used for > performance counters hardware IRQ 5. > > On TP-Link Archer C7v5: > > CPU0 > 2: 0 MIPS 2 ath9k > 4: 318 MIPS 4 19000000.eth > 7: 55034 MIPS 7 timer > 8: 1236 MISC 3 ttyS0 > 12: 0 INTC 1 ehci_hcd:usb1 > 13: 0 gpio-ath79 2 keys > 14: 0 gpio-ath79 5 keys > 15: 31 AR724X PCI 1 ath10k_pci > > $ perf top > genirq: Flags mismatch irq 13. 00014c83 (mips_perf_pmu) vs. 00002003 (keys) > > On TP-Link Archer C7v4: > > CPU0 > 4: 0 MIPS 4 19000000.eth > 5: 7135 MIPS 5 1a000000.eth > 7: 98379 MIPS 7 timer > 8: 30 MISC 3 ttyS0 > 12: 90028 INTC 0 ath9k > 13: 5520 INTC 1 ehci_hcd:usb1 > 14: 4623 INTC 2 ehci_hcd:usb2 > 15: 32844 AR724X PCI 1 ath10k_pci > 16: 0 gpio-ath79 16 keys > 23: 0 gpio-ath79 23 keys > > $ perf top > genirq: Flags mismatch irq 13. 00014c80 (mips_perf_pmu) vs. 00000080 (ehci_hcd:usb1) > > This problem is happening, because currently statically assigned virtual > IRQ 13 for performance counters is not claimed during the initialization > of MIPS PMU during the bootup, so the IRQ subsystem doesn't know, that > this interrupt isn't available for further use. > > So this patch fixes the issue by simply booking hardware IRQ 5 for MIPS PMU. > > Tested-by: Kevin 'ldir' Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> > Signed-off-by: Petr Å tetiar <ynezz@true.cz> > Acked-by: John Crispin <john@phrozen.org> > Acked-by: Marc Zyngier <marc.zyngier@arm.com> Applied to mips-fixes. Thanks, Paul [ This message was auto-generated; if you believe anything is incorrect then please email paul.burton@mips.com to report it. ]
diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c index 4a70c5d..25a5789 100644 --- a/arch/mips/ath79/setup.c +++ b/arch/mips/ath79/setup.c @@ -210,12 +210,6 @@ const char *get_system_type(void) return ath79_sys_type; } -int get_c0_perfcount_int(void) -{ - return ATH79_MISC_IRQ(5); -} -EXPORT_SYMBOL_GPL(get_c0_perfcount_int); - unsigned int get_c0_compare_int(void) { return CP0_LEGACY_COMPARE_IRQ; diff --git a/drivers/irqchip/irq-ath79-misc.c b/drivers/irqchip/irq-ath79-misc.c index aa72907..0390603 100644 --- a/drivers/irqchip/irq-ath79-misc.c +++ b/drivers/irqchip/irq-ath79-misc.c @@ -22,6 +22,15 @@ #define AR71XX_RESET_REG_MISC_INT_ENABLE 4 #define ATH79_MISC_IRQ_COUNT 32 +#define ATH79_MISC_PERF_IRQ 5 + +static int ath79_perfcount_irq; + +int get_c0_perfcount_int(void) +{ + return ath79_perfcount_irq; +} +EXPORT_SYMBOL_GPL(get_c0_perfcount_int); static void ath79_misc_irq_handler(struct irq_desc *desc) { @@ -113,6 +122,8 @@ static void __init ath79_misc_intc_domain_init( { void __iomem *base = domain->host_data; + ath79_perfcount_irq = irq_create_mapping(domain, ATH79_MISC_PERF_IRQ); + /* Disable and clear all interrupts */ __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE); __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS);