summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/icoll-imx233.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233/icoll-imx233.c')
-rw-r--r--firmware/target/arm/imx233/icoll-imx233.c15
1 files changed, 15 insertions, 0 deletions
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
141static uint32_t irq_count_old[INT_SRC_COUNT]; 142static uint32_t irq_count_old[INT_SRC_COUNT];
142static uint32_t irq_count[INT_SRC_COUNT]; 143static uint32_t irq_count[INT_SRC_COUNT];
144static uint32_t irq_max_time_old[INT_SRC_COUNT];
145static uint32_t irq_max_time[INT_SRC_COUNT];
146static uint32_t irq_tot_time_old[INT_SRC_COUNT];
147static uint32_t irq_tot_time[INT_SRC_COUNT];
143 148
144unsigned imx233_icoll_get_priority(int src) 149unsigned 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}