diff options
author | ian <ian@FreeBSD.org> | 2014-02-28 00:41:55 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2014-02-28 00:41:55 +0000 |
commit | b9d85cb3a10af771e32096b5ceb0d8dbcaabfc26 (patch) | |
tree | d394f72d7a9410cb94cc779f2e72be0f9aba99b6 /sys/arm | |
parent | b517c5faadc8a18b17217f553529d9748442866b (diff) | |
download | FreeBSD-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.c | 2 | ||||
-rw-r--r-- | sys/arm/arm/cpufunc_asm_armv7.S | 6 | ||||
-rw-r--r-- | sys/arm/include/cpufunc.h | 1 |
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); |