diff options
Diffstat (limited to 'firmware/target/arm/imx233')
-rw-r--r-- | firmware/target/arm/imx233/debug-imx233.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/imx233/icoll-imx233.c | 15 | ||||
-rw-r--r-- | firmware/target/arm/imx233/icoll-imx233.h | 8 |
3 files changed, 21 insertions, 4 deletions
diff --git a/firmware/target/arm/imx233/debug-imx233.c b/firmware/target/arm/imx233/debug-imx233.c index 68865efc8d..e33f2ab1ad 100644 --- a/firmware/target/arm/imx233/debug-imx233.c +++ b/firmware/target/arm/imx233/debug-imx233.c | |||
@@ -637,7 +637,7 @@ bool dbg_hw_info_icoll(void) | |||
637 | static char prio[4] = {'-', '+', '^', '!'}; | 637 | static char prio[4] = {'-', '+', '^', '!'}; |
638 | lcd_putsf(0, j, "%c%s", prio[info.priority & 3], dbg_irqs[i].name); | 638 | lcd_putsf(0, j, "%c%s", prio[info.priority & 3], dbg_irqs[i].name); |
639 | if(info.enabled || info.freq > 0) | 639 | if(info.enabled || info.freq > 0) |
640 | lcd_putsf(11, j, "%d", info.freq); | 640 | lcd_putsf(11, j, "%d %d %d", info.freq, info.max_time, info.total_time); |
641 | } | 641 | } |
642 | lcd_update(); | 642 | lcd_update(); |
643 | yield(); | 643 | yield(); |
diff --git a/firmware/target/arm/imx233/icoll-imx233.c b/firmware/target/arm/imx233/icoll-imx233.c index d5c6e48a89..f20ce97ea9 100644 --- a/firmware/target/arm/imx233/icoll-imx233.c +++ b/firmware/target/arm/imx233/icoll-imx233.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include "timrot-imx233.h" | 26 | #include "timrot-imx233.h" |
27 | 27 | ||
28 | #include "regs/icoll.h" | 28 | #include "regs/icoll.h" |
29 | #include "regs/digctl.h" | ||
29 | 30 | ||
30 | /* helpers */ | 31 | /* helpers */ |
31 | #if IMX233_SUBTARGET >= 3600 && IMX233_SUBTARGET < 3780 | 32 | #if IMX233_SUBTARGET >= 3600 && IMX233_SUBTARGET < 3780 |
@@ -140,6 +141,10 @@ static isr_t isr_table[INT_SRC_COUNT] = | |||
140 | 141 | ||
141 | static uint32_t irq_count_old[INT_SRC_COUNT]; | 142 | static uint32_t irq_count_old[INT_SRC_COUNT]; |
142 | static uint32_t irq_count[INT_SRC_COUNT]; | 143 | static uint32_t irq_count[INT_SRC_COUNT]; |
144 | static uint32_t irq_max_time_old[INT_SRC_COUNT]; | ||
145 | static uint32_t irq_max_time[INT_SRC_COUNT]; | ||
146 | static uint32_t irq_tot_time_old[INT_SRC_COUNT]; | ||
147 | static uint32_t irq_tot_time[INT_SRC_COUNT]; | ||
143 | 148 | ||
144 | unsigned imx233_icoll_get_priority(int src) | 149 | unsigned imx233_icoll_get_priority(int src) |
145 | { | 150 | { |
@@ -160,6 +165,8 @@ struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src) | |||
160 | #endif | 165 | #endif |
161 | info.priority = imx233_icoll_get_priority(src); | 166 | info.priority = imx233_icoll_get_priority(src); |
162 | info.freq = irq_count_old[src]; | 167 | info.freq = irq_count_old[src]; |
168 | info.max_time = irq_max_time_old[src]; | ||
169 | info.total_time = irq_tot_time_old[src]; | ||
163 | return info; | 170 | return info; |
164 | } | 171 | } |
165 | 172 | ||
@@ -172,6 +179,10 @@ static void do_irq_stat(void) | |||
172 | counter = 0; | 179 | counter = 0; |
173 | memcpy(irq_count_old, irq_count, sizeof(irq_count)); | 180 | memcpy(irq_count_old, irq_count, sizeof(irq_count)); |
174 | memset(irq_count, 0, sizeof(irq_count)); | 181 | memset(irq_count, 0, sizeof(irq_count)); |
182 | memcpy(irq_max_time_old, irq_max_time, sizeof(irq_max_time)); | ||
183 | memset(irq_max_time, 0, sizeof(irq_max_time)); | ||
184 | memcpy(irq_tot_time_old, irq_tot_time, sizeof(irq_tot_time)); | ||
185 | memset(irq_tot_time, 0, sizeof(irq_tot_time)); | ||
175 | } | 186 | } |
176 | } | 187 | } |
177 | 188 | ||
@@ -195,8 +206,12 @@ void _irq_handler(void) | |||
195 | do_irq_stat(); | 206 | do_irq_stat(); |
196 | /* enable interrupts again */ | 207 | /* enable interrupts again */ |
197 | //enable_irq(); | 208 | //enable_irq(); |
209 | uint32_t time = HW_DIGCTL_MICROSECONDS; | ||
198 | /* process interrupt */ | 210 | /* process interrupt */ |
199 | (*(isr_t *)vec)(); | 211 | (*(isr_t *)vec)(); |
212 | time = HW_DIGCTL_MICROSECONDS - time; | ||
213 | irq_max_time[irq_nr] = MAX(irq_max_time[irq_nr], time); | ||
214 | irq_tot_time[irq_nr] += time; | ||
200 | /* acknowledge completion of IRQ */ | 215 | /* acknowledge completion of IRQ */ |
201 | HW_ICOLL_LEVELACK = 1 << imx233_icoll_get_priority(irq_nr); | 216 | HW_ICOLL_LEVELACK = 1 << imx233_icoll_get_priority(irq_nr); |
202 | } | 217 | } |
diff --git a/firmware/target/arm/imx233/icoll-imx233.h b/firmware/target/arm/imx233/icoll-imx233.h index 20b93648c9..1815c70384 100644 --- a/firmware/target/arm/imx233/icoll-imx233.h +++ b/firmware/target/arm/imx233/icoll-imx233.h | |||
@@ -74,9 +74,11 @@ | |||
74 | 74 | ||
75 | struct imx233_icoll_irq_info_t | 75 | struct imx233_icoll_irq_info_t |
76 | { | 76 | { |
77 | bool enabled; | 77 | bool enabled; /* is IRQ currently enabled ? */ |
78 | unsigned freq; | 78 | unsigned freq; /* how many times was IRQ fired in the past second */ |
79 | unsigned priority; | 79 | unsigned priority; /* IRQ priority (0-3) */ |
80 | unsigned max_time; /* maximum time spent in one IRQ during the past second (in us) */ | ||
81 | unsigned total_time; /* total time spent in IRQ during the past second (in us) */ | ||
80 | }; | 82 | }; |
81 | 83 | ||
82 | void imx233_icoll_init(void); | 84 | void imx233_icoll_init(void); |