diff options
author | mav <mav@FreeBSD.org> | 2010-09-18 16:57:05 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2010-09-18 16:57:05 +0000 |
commit | ac1d9eedaf0a776867003cbe7e86bd2d08095379 (patch) | |
tree | c71480ef853c65f897a0d692a93cb97832e8fe68 | |
parent | d25cc0d8783c134a0201e3b7b1a2f8635afd54bb (diff) | |
download | FreeBSD-src-ac1d9eedaf0a776867003cbe7e86bd2d08095379.zip FreeBSD-src-ac1d9eedaf0a776867003cbe7e86bd2d08095379.tar.gz |
Add basic cpu_sleep() support for Marvell SoCs. This drops my SheevaPlug's
heatsink termperature in open air from 49C to 43C when idle.
-rw-r--r-- | sys/arm/arm/cpufunc.c | 5 | ||||
-rw-r--r-- | sys/arm/arm/cpufunc_asm_sheeva.S | 7 | ||||
-rw-r--r-- | sys/arm/include/cpufunc.h | 1 |
3 files changed, 12 insertions, 1 deletions
diff --git a/sys/arm/arm/cpufunc.c b/sys/arm/arm/cpufunc.c index 09c2026..4b62e98 100644 --- a/sys/arm/arm/cpufunc.c +++ b/sys/arm/arm/cpufunc.c @@ -397,7 +397,7 @@ struct cpu_functions sheeva_cpufuncs = { cpufunc_nullop, /* flush_brnchtgt_C */ (void *)cpufunc_nullop, /* flush_brnchtgt_E */ - (void *)cpufunc_nullop, /* sleep */ + sheeva_cpu_sleep, /* sleep */ /* Soft functions */ @@ -1076,6 +1076,9 @@ set_cpufuncs() FC_DCACHE_STREAM_EN | FC_WR_ALLOC_EN | FC_BRANCH_TARG_BUF_DIS | FC_L2CACHE_EN); } + + /* Use powersave on this CPU. */ + cpu_do_powersave = 1; } else cpufuncs = armv5_ec_cpufuncs; diff --git a/sys/arm/arm/cpufunc_asm_sheeva.S b/sys/arm/arm/cpufunc_asm_sheeva.S index a52fbf8..d185547 100644 --- a/sys/arm/arm/cpufunc_asm_sheeva.S +++ b/sys/arm/arm/cpufunc_asm_sheeva.S @@ -392,3 +392,10 @@ ENTRY(sheeva_control_ext) mcrne p15, 1, r2, c15, c1, 0 /* Write new control register */ mov r0, r3 /* Return old value */ RET + +ENTRY(sheeva_cpu_sleep) + mov r0, #0 + mcr p15, 0, r0, c7, c10, 4 /* Drain write buffer */ + mcr p15, 0, r0, c7, c0, 4 /* Wait for interrupt */ + mov pc, lr + diff --git a/sys/arm/include/cpufunc.h b/sys/arm/include/cpufunc.h index 4ab63fb..b067836 100644 --- a/sys/arm/include/cpufunc.h +++ b/sys/arm/include/cpufunc.h @@ -400,6 +400,7 @@ extern unsigned arm10_dcache_index_max; extern unsigned arm10_dcache_index_inc; u_int sheeva_control_ext (u_int, u_int); +void sheeva_cpu_sleep (int); void sheeva_setttb (u_int); void sheeva_dcache_wbinv_range (vm_offset_t, vm_size_t); void sheeva_dcache_inv_range (vm_offset_t, vm_size_t); |