From 8ecbcad3d13d41ef9cff6d20149df1645f63aae0 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Wed, 26 Dec 2012 21:23:59 +0100 Subject: [PATCH] imx233: use tick insteaf of msec to collect statistics The current code uses the msec irq to collect statistics and detect irq storms (debug). But this irq is triggered 1000 times per sec and we don't need that accuracy. This commit removes the msec irq and use the tick timer instead which is triggered only 100 times per second. Change-Id: If14b9503c89a3af370ef322678f10e35fafb4b8a --- firmware/target/arm/imx233/icoll-imx233.c | 16 ++++++++-------- firmware/target/arm/imx233/kernel-imx233.c | 10 ---------- firmware/target/arm/imx233/kernel-imx233.h | 10 ++++++++++ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/firmware/target/arm/imx233/icoll-imx233.c b/firmware/target/arm/imx233/icoll-imx233.c index 4e0d525da3..8f8e3c0c9a 100644 --- a/firmware/target/arm/imx233/icoll-imx233.c +++ b/firmware/target/arm/imx233/icoll-imx233.c @@ -21,6 +21,7 @@ #include "icoll-imx233.h" #include "rtc-imx233.h" +#include "kernel-imx233.h" #include "string.h" #define default_interrupt(name) \ @@ -61,6 +62,7 @@ default_interrupt(INT_ADC_DMA); default_interrupt(INT_ADC_ERROR); default_interrupt(INT_DCP); default_interrupt(INT_TOUCH_DETECT); +default_interrupt(INT_RTC_1MSEC); void INT_RTC_1MSEC(void); @@ -102,8 +104,8 @@ static isr_t isr_table[INT_SRC_NR_SOURCES] = [INT_SRC_RTC_1MSEC] = INT_RTC_1MSEC, }; -#define IRQ_STORM_DELAY 1000 /* ms */ -#define IRQ_STORM_THRESHOLD 100000 /* allows irq / delay */ +#define IRQ_STORM_DELAY 100 /* ms */ +#define IRQ_STORM_THRESHOLD 10000 /* allows irq / delay */ static uint32_t irq_count_old[INT_SRC_NR_SOURCES]; static uint32_t irq_count[INT_SRC_NR_SOURCES]; @@ -116,16 +118,15 @@ struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src) return info; } -void INT_RTC_1MSEC(void) +static void do_irq_stat(void) { static unsigned counter = 0; - if(counter++ >= IRQ_STORM_DELAY) + if(counter++ >= HZ) { counter = 0; memcpy(irq_count_old, irq_count, sizeof(irq_count)); memset(irq_count, 0, sizeof(irq_count)); } - imx233_rtc_clear_msec_irq(); } static void UIRQ(void) @@ -140,6 +141,8 @@ void irq_handler(void) int irq_nr = (HW_ICOLL_VECTOR - HW_ICOLL_VBASE) / 4; if(irq_count[irq_nr]++ > IRQ_STORM_THRESHOLD) panicf("IRQ %d: storm detected", irq_nr); + if(irq_nr == INT_SRC_TIMER(TICK_TIMER_NR)) + do_irq_stat(); (*(isr_t *)HW_ICOLL_VECTOR)(); /* acknowledge completion of IRQ (all use the same priority 0) */ HW_ICOLL_LEVELACK = HW_ICOLL_LEVELACK__LEVEL0; @@ -170,8 +173,5 @@ void imx233_icoll_init(void) HW_ICOLL_VBASE = (uint32_t)&isr_table; /* enable final irq bit */ __REG_SET(HW_ICOLL_CTRL) = HW_ICOLL_CTRL__IRQ_FINAL_ENABLE; - - imx233_rtc_enable_msec_irq(true); - imx233_icoll_enable_interrupt(INT_SRC_RTC_1MSEC, true); } diff --git a/firmware/target/arm/imx233/kernel-imx233.c b/firmware/target/arm/imx233/kernel-imx233.c index 8e1e122277..752db68149 100644 --- a/firmware/target/arm/imx233/kernel-imx233.c +++ b/firmware/target/arm/imx233/kernel-imx233.c @@ -23,16 +23,6 @@ #include "clkctrl-imx233.h" #include "kernel-imx233.h" -#ifdef SANSA_FUZEPLUS -#define TICK_TIMER_NR 0 -#elif defined(CREATIVE_ZENXFI2) -#define TICK_TIMER_NR 0 -#elif defined(CREATIVE_ZENXFI3) -#define TICK_TIMER_NR 0 -#else -#error Select tick timer ! -#endif - static void tick_timer(void) { /* Run through the list of tick tasks */ diff --git a/firmware/target/arm/imx233/kernel-imx233.h b/firmware/target/arm/imx233/kernel-imx233.h index 960f3f2431..1c176cb09e 100644 --- a/firmware/target/arm/imx233/kernel-imx233.h +++ b/firmware/target/arm/imx233/kernel-imx233.h @@ -23,6 +23,16 @@ #include "kernel.h" +#ifdef SANSA_FUZEPLUS +#define TICK_TIMER_NR 0 +#elif defined(CREATIVE_ZENXFI2) +#define TICK_TIMER_NR 0 +#elif defined(CREATIVE_ZENXFI3) +#define TICK_TIMER_NR 0 +#else +#error Select tick timer ! +#endif + /* The i.MX233 uses in several places virtual channels to multiplex the work. * To arbiter the use of the different channels, we use a simple channel arbiter * based on a semaphore to count the number of channels in use, and a bitmask -- 2.11.4.GIT