From fceffb7d4aa429a60cd4cf760dd9852bb594b4be Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sat, 17 Apr 2021 11:25:23 +0100 Subject: x1000: disable CPU idle stats by default There's no point including this in normal builds: the stats are not used for anything, they are not really of interest to anyone except developers, and add a small overhead to the kernel tick. Change-Id: I1b4f67cc62d11d634a8cec279dca513dd10eea96 --- firmware/target/mips/ingenic_x1000/debug-x1000.c | 4 ++++ firmware/target/mips/ingenic_x1000/kernel-x1000.c | 2 ++ firmware/target/mips/ingenic_x1000/system-target.h | 11 +++++++++++ firmware/target/mips/ingenic_x1000/system-x1000.c | 2 ++ 4 files changed, 19 insertions(+) diff --git a/firmware/target/mips/ingenic_x1000/debug-x1000.c b/firmware/target/mips/ingenic_x1000/debug-x1000.c index fed586691c..74bbcd77a6 100644 --- a/firmware/target/mips/ingenic_x1000/debug-x1000.c +++ b/firmware/target/mips/ingenic_x1000/debug-x1000.c @@ -130,6 +130,7 @@ static bool dbg_audio(void) return false; } +#ifdef X1000_CPUIDLE_STATS static bool dbg_cpuidle(void) { do { @@ -143,6 +144,7 @@ static bool dbg_cpuidle(void) return false; } +#endif #ifdef FIIO_M3K extern bool dbg_fiiom3k_touchpad(void); @@ -156,7 +158,9 @@ static const struct { } menuitems[] = { {"Clocks", &dbg_clocks}, {"GPIOs", &dbg_gpios}, +#ifdef X1000_CPUIDLE_STATS {"CPU idle", &dbg_cpuidle}, +#endif {"Audio", &dbg_audio}, #ifdef FIIO_M3K {"Touchpad", &dbg_fiiom3k_touchpad}, diff --git a/firmware/target/mips/ingenic_x1000/kernel-x1000.c b/firmware/target/mips/ingenic_x1000/kernel-x1000.c index c8105a3446..eb7c3d6124 100644 --- a/firmware/target/mips/ingenic_x1000/kernel-x1000.c +++ b/firmware/target/mips/ingenic_x1000/kernel-x1000.c @@ -57,6 +57,7 @@ void tick_start(unsigned interval_in_ms) void OST(void) { +#ifdef X1000_CPUIDLE_STATS /* CPU idle time accounting */ uint32_t now = __ost_read32(); uint32_t div = now - __cpu_idle_reftick; @@ -67,6 +68,7 @@ void OST(void) __cpu_idle_ticks = 0; __cpu_idle_reftick = now; } +#endif /* Call regular kernel tick */ jz_write(OST_1FLG, 0); diff --git a/firmware/target/mips/ingenic_x1000/system-target.h b/firmware/target/mips/ingenic_x1000/system-target.h index 050afcca9e..45a1eab1ff 100644 --- a/firmware/target/mips/ingenic_x1000/system-target.h +++ b/firmware/target/mips/ingenic_x1000/system-target.h @@ -37,6 +37,11 @@ # define MIPS_CACHEFUNC_ATTR #endif +#ifdef DEBUG +/* Define this to get CPU idle stats, visible in the debug menu. */ +# define X1000_CPUIDLE_STATS +#endif + #include "mmu-mips.h" #include "mipsregs.h" #include "mipsr2-endian.h" @@ -66,16 +71,20 @@ static inline int set_irq_level(int lev) return oldreg; } +#ifdef X1000_CPUIDLE_STATS /* CPU idle stats, updated each kernel tick in kernel-x1000.c */ extern int __cpu_idle_avg; extern int __cpu_idle_cur; extern uint32_t __cpu_idle_ticks; extern uint32_t __cpu_idle_reftick; +#endif static inline uint32_t __ost_read32(void); static inline void core_sleep(void) { +#ifdef X1000_CPUIDLE_STATS uint32_t t1 = __ost_read32(); +#endif __asm__ __volatile__( ".set push\n\t" @@ -90,8 +99,10 @@ static inline void core_sleep(void) ".set pop\n\t" ::: "t0", "t1", "t2"); +#ifdef X1000_CPUIDLE_STATS uint32_t t2 = __ost_read32(); __cpu_idle_ticks += t2 - t1; +#endif enable_irq(); } diff --git a/firmware/target/mips/ingenic_x1000/system-x1000.c b/firmware/target/mips/ingenic_x1000/system-x1000.c index d841a274ed..33d8db7222 100644 --- a/firmware/target/mips/ingenic_x1000/system-x1000.c +++ b/firmware/target/mips/ingenic_x1000/system-x1000.c @@ -35,10 +35,12 @@ #include "x1000/msc.h" #include "x1000/aic.h" +#ifdef X1000_CPUIDLE_STATS int __cpu_idle_avg = 0; int __cpu_idle_cur = 0; uint32_t __cpu_idle_ticks = 0; uint32_t __cpu_idle_reftick = 0; +#endif /* Prepare the CPU to process interrupts, but don't enable them yet */ static void system_init_irq(void) -- cgit v1.2.3