summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-09-18 16:57:05 +0000
committermav <mav@FreeBSD.org>2010-09-18 16:57:05 +0000
commitac1d9eedaf0a776867003cbe7e86bd2d08095379 (patch)
treec71480ef853c65f897a0d692a93cb97832e8fe68 /sys/arm
parentd25cc0d8783c134a0201e3b7b1a2f8635afd54bb (diff)
downloadFreeBSD-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.
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/cpufunc.c5
-rw-r--r--sys/arm/arm/cpufunc_asm_sheeva.S7
-rw-r--r--sys/arm/include/cpufunc.h1
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);
OpenPOWER on IntegriCloud