summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-02-28 00:41:55 +0000
committerian <ian@FreeBSD.org>2014-02-28 00:41:55 +0000
commitb9d85cb3a10af771e32096b5ceb0d8dbcaabfc26 (patch)
treed394f72d7a9410cb94cc779f2e72be0f9aba99b6 /sys/arm
parentb517c5faadc8a18b17217f553529d9748442866b (diff)
downloadFreeBSD-src-b9d85cb3a10af771e32096b5ceb0d8dbcaabfc26.zip
FreeBSD-src-b9d85cb3a10af771e32096b5ceb0d8dbcaabfc26.tar.gz
Add an armv7 implementation of cpu_sleep(). The arm11/armv6 implementation
we've been using was actually just spinning due to ARM having redefined the old 'wait for interrupt' operation via the system coprocessor as a nop and replacing it with a WFI instruction.
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/cpufunc.c2
-rw-r--r--sys/arm/arm/cpufunc_asm_armv7.S6
-rw-r--r--sys/arm/include/cpufunc.h1
3 files changed, 8 insertions, 1 deletions
diff --git a/sys/arm/arm/cpufunc.c b/sys/arm/arm/cpufunc.c
index 11365aa..8f97f14 100644
--- a/sys/arm/arm/cpufunc.c
+++ b/sys/arm/arm/cpufunc.c
@@ -1107,7 +1107,7 @@ struct cpu_functions cortexa_cpufuncs = {
cpufunc_nullop, /* flush_brnchtgt_C */
(void *)cpufunc_nullop, /* flush_brnchtgt_E */
- arm11_sleep, /* sleep */
+ armv7_sleep, /* sleep */
/* Soft functions */
diff --git a/sys/arm/arm/cpufunc_asm_armv7.S b/sys/arm/arm/cpufunc_asm_armv7.S
index 74933eb..2a4bb98 100644
--- a/sys/arm/arm/cpufunc_asm_armv7.S
+++ b/sys/arm/arm/cpufunc_asm_armv7.S
@@ -343,3 +343,9 @@ ENTRY(armv7_idcache_inv_all)
bx lr @ return
END(armv7_l1cache_inv_all)
+ENTRY_NP(armv7_sleep)
+ dsb
+ wfi
+ bx lr
+END(armv7_sleep)
+
diff --git a/sys/arm/include/cpufunc.h b/sys/arm/include/cpufunc.h
index f38f9c1..68b15f5 100644
--- a/sys/arm/include/cpufunc.h
+++ b/sys/arm/include/cpufunc.h
@@ -523,6 +523,7 @@ void armv7_setup (char *string);
void armv7_context_switch (void);
void armv7_drain_writebuf (void);
void armv7_sev (void);
+void armv7_sleep (int unused);
u_int armv7_auxctrl (u_int, u_int);
void pj4bv7_setup (char *string);
void pj4b_config (void);
OpenPOWER on IntegriCloud